Доступ к базе данных хоста из контейнера докеров
Если у меня есть база данных 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. Существует два способа
-
Совместное использование хост-сети --net = хост:
docker run -it --net=host myimage
-
Использование 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 файла, как описано здесь и здесь:
-
Измените postgresql.conf, чтобы прослушивать все адреса. По умолчанию он укажет на localhost.
listen_addresses = '*'
-
Измените pg_hba.conf, чтобы разрешить соединения со всех адресов. Добавить на последней строке:
host all all 0.0.0.0/0 md5
ВАЖНО: последний шаг обновления доступа к базе данных не рекомендуется для использования в производстве, если вы действительно не уверены в том, что делаете.