Перейти к содержанию

Подключение к локальному сервису из 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.