Подключение к локальному сервису из docker контейнера¶
Представим, у нас есть вот такая схема:
На нашем хосте стоит отдельно PostgreSQL, который принимает запросы по 127.0.0.1 и есть docker-контейнеры поднятые через docker-compose, которые хотят в этот Postgres ходить. Проблема начинается тогда, когда мы пытаемся внутри контейнера попасть на наш хост - localhost то не работает. На примере этой схемы я покажу, как это сделать.
Если можно сделать БД (сервис) доступным извне и вы можете настроить фаерволл¶
Просто укажите в параметрах подключения приложения host_ip:port и радуйтесь жизни. Но если вы так просто не можете по какой-то причине это сделать - читайте ниже.
Добавляем путь к нашему хосту в контейнер¶
Внимание
Написанное ниже - дичайший костыль и не рекомендуется к использованию в продакшене.
У docker-compose есть отличная опция, под названием extra_hosts. По сути, она просто умеет маппить хостнеим на ip, добавляет запись в /etc/hosts.
Так же, у docker демона есть магическая строка host-gateway
которая задается при запуске, но по умолчанию, она указывает IP адрес бриджа.
Наша задача - скомбинировать эти опции и дать доступ контейнеру внутрь хоста. Делаем:
version: "3.7"
services:
myapp:
image: myapp:latest
extra_hosts:
- "host.docker.internal:host-gateway"
Теперь хост будет доступен по адресу host.docker.internal
.