Доступ к базе данных хоста из контейнера докеров

Если у меня есть база данных mysql, запущенная на какой-либо главной машине, и на этом узле также запущен контейнер докеров: как мне получить доступ к базе данных mysql из контейнера докеров, который запущен на хосте?

Например, есть ли способ опубликовать порт hosts в контейнере (обратный к тому, что делает docker run -p)?

Ответ 1

Есть несколько длительных дискуссий о том, как сделать это в последовательном, понятном и переносимом виде. Нет полного разрешения, но я свяжу вас с обсуждениями ниже.

В любом случае вы хотите попробовать использовать опцию -add-host для запуска docker, чтобы добавить IP-адрес хоста в файл container/etc/host. Оттуда тривиально подключиться к хосту на любом требуемом порту:

Добавление записей в файл хостов контейнеров

Вы можете добавить другие хосты в файл container/etc/hosts, используя один или несколько флагов -add-host. В этом примере добавляется статический адрес для хоста с именем docker:

 $ docker run --add-host=docker:10.180.0.1 --rm -it debian
    $$ ping docker
    PING docker (10.180.0.1): 48 data bytes
    56 bytes from 10.180.0.1: icmp_seq=0 ttl=254 time=7.600 ms
    56 bytes from 10.180.0.1: icmp_seq=1 ttl=254 time=30.705 ms
    ^C--- docker ping statistics ---
    2 packets transmitted, 2 packets received, 0% packet loss
    round-trip min/avg/max/stddev = 7.600/19.152/30.705/11.553 ms

Примечание. Иногда вам необходимо подключиться к хосту Docker, что означает получение IP-адреса хоста. Для упрощения этого процесса вы можете использовать следующие команды оболочки:

 $ alias hostip="ip route show 0.0.0.0/0 | grep -Eo 'via \S+' | awk '{ print $2 }'"
 $ docker run  --add-host=docker:$(hostip) --rm -it debian

Документация:

https://docs.docker.com/engine/reference/commandline/run/

Дискуссии о доступе к хосту из контейнера:

https://github.com/docker/docker/issues/1143

https://github.com/docker/docker/issues/10023

Ответ 2

Начиная с Docker 17.06, в докере-контейнерах доступно специальное DNS-имя для Mac, которое разрешает IP-адрес хоста. Это:

docker.for.mac.localhost

Документация находится здесь: https://docs.docker.com/docker-for-mac/networking/#httphttps-proxy-support

Ответ 3

Из документов 18.03:

Я хочу подключиться из контейнера к службе на хосте

Хост имеет изменяющийся IP-адрес (или нет, если у вас нет доступа к сети). Начиная с 18.03, наша рекомендация - подключиться к специальному DNS-имени host.docker.internal, которое разрешает внутренний IP-адрес, используемый хостом.

Шлюз также доступен как gateway.docker.internal.

ПРИМЕР: вот что я использую для своей строки подключения MySQL внутри моего контейнера для доступа к экземпляру MySQL на моем хосте:

mysql://host.docker.internal:3306/my_awesome_database

Ответ 4

Используйте host.docker.internal от Docker 18.03 и далее.

Ответ 5

Другие ответы не помогли мне. Мой контейнер не смог разрешить хост ip, используя host.docker.internal. Существует два способа

  1. Совместное использование хост-сети --net = хост:

    docker run -it --net=host  myimage
    
  2. Использование ip-адреса докера, который обычно равен 172.17.0.1. Вы можете проверить его, вызвав команду ifconfig и захватив inet addr интерфейса docker

    [email protected]:~$ ifconfig
    docker0   Link encap:Ethernet  HWaddr 02:42:a4:a2:b2:f1  
      inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
      inet6 addr: fe80::42:a4ff:fea2:b2f1/64 Scope:Link
    

Если у вас есть этот IP-адрес, вы можете передать его в качестве аргумента для запуска docker, а затем в приложение или, как я его делаю, сопоставьте местоположение jdbc.properties с помощью тома в каталоге на хост-машине, чтобы вы могли управлять файлом извне,

  docker run -it -v /host_dir/docker_jdbc_config:${jetty_base}/var/config myimage

ПРИМЕЧАНИЕ. В вашей базе данных могут не разрешаться внешние подключения. В случае postgresql вам необходимо отредактировать 2 файла, как описано здесь и здесь:

  1. Измените postgresql.conf, чтобы прослушивать все адреса. По умолчанию он укажет на localhost.

    listen_addresses = '*'
    
  2. Измените pg_hba.conf, чтобы разрешить соединения со всех адресов. Добавить на последней строке:

    host     all             all             0.0.0.0/0               md5
    

ВАЖНО: последний шаг обновления доступа к базе данных не рекомендуется для использования в производстве, если вы действительно не уверены в том, что делаете.