Итак, у меня Nginx работает внутри контейнера Docker, у меня работает MySQL на localhost, я хочу подключиться к MySql изнутри моего Nginx. MySql работает на локальном хосте и не открывает порт для внешнего мира, поэтому он связан с локальным хостом, а не с IP-адресом машины.
Есть ли способ подключиться к этому MySql или любой другой программе на локальном хосте из этого контейнера Docker?
Этот вопрос отличается от «Как получить IP-адрес хоста докера из контейнера докера» тем, что IP-адрес хоста докера может быть публичным или частным IP в сети, который может или может быть быть недоступным из контейнера докера (я имею в виду публичный IP, если он размещен на AWS или что-то в этом роде). Даже если у вас есть IP-адрес докер-хоста, это не означает, что вы можете подключиться к док-хосту из контейнера, учитывая, что IP-адрес вашей сети Docker может быть наложенным, хост, мост, macvlan, нет и т. Д., Что ограничивает достижимость этот IP-адрес.
network: host
вас нельзя вернуться из контейнера к хозяину. Только хост для контейнера. Это основная идеология контейнеров. Они изолированы как по соображениям стабильности, так и по соображениям безопасности.Ответы:
Изменить: Если вы используете Docker-для-Mac или Docker-для-Windows 18.03+, просто подключитесь к службе MySQL с помощью хоста
host.docker.internal
(вместо127.0.0.1
в строке подключения).Начиная с Docker 18.09.3, это не работает в Docker-для-Linux. Исправление было представлено на 8 марта, 2019 и мы надеемся , будут объединены в базу кода. До тех пор, обходной путь должен использовать контейнер, как описано в ответе Qoomon .
2020-01: некоторый прогресс был достигнут. Если все идет хорошо, это должно приземлиться в Docker 20.04
TLDR
Используйте
--network="host"
в вашейdocker run
команде, тогда127.0.0.1
в вашем док-контейнере будет указывать на ваш докер хост.Примечание. Этот режим работает только в Docker для Linux согласно документации .
Обратите внимание на режимы работы с сетью Docker-контейнеров
Docker предлагает различные сетевые режимы при запуске контейнеров. В зависимости от выбранного вами режима, вы будете подключаться к базе данных MySQL, работающей на хосте докера, по-разному.
Docker run --network = "bridge" (по умолчанию)
Docker создает мост с именем
docker0
по умолчанию. И хост-докер, и контейнеры-докеры имеют IP-адрес на этом мосту.на хосте Docker напечатайте, у
sudo ip addr show docker0
вас будет вывод, похожий на:Итак, у моего докера есть IP-адрес
172.17.42.1
наdocker0
сетевом интерфейсе.Теперь запустите новый контейнер и создайте для него оболочку:
docker run --rm -it ubuntu:trusty bash
и внутри типа контейнера,ip addr show eth0
чтобы узнать, как настроен его основной сетевой интерфейс:Здесь мой контейнер имеет IP-адрес
172.17.1.192
. Теперь посмотрите на таблицу маршрутизации:Таким образом, IP-адрес узла докера
172.17.42.1
устанавливается в качестве маршрута по умолчанию и доступен из вашего контейнера.Docker run --network = "host"
В качестве альтернативы вы можете запустить Docker-контейнер с сетевыми настройками, установленными в
host
. Такой контейнер будет совместно использовать сетевой стек с хостом докера и с точки зрения контейнераlocalhost
(или127.0.0.1
) будет ссылаться на хост докера.Помните, что любой порт, открытый в вашем контейнере докера, будет открыт на хосте докера. И это без необходимости
-p
или-P
docker run
вариант .Конфигурация IP на моем хосте докера:
и из док-контейнера в режиме хоста :
Как вы можете видеть, и хост-докер, и контейнер-докер используют один и тот же сетевой интерфейс и имеют одинаковый IP-адрес.
Подключение к MySQL из контейнеров
режим моста
Чтобы получить доступ к MySQL, работающему на хосте докера, из контейнеров в режиме моста , необходимо убедиться, что служба MySQL прослушивает соединения по
172.17.42.1
IP-адресу.Для этого убедитесь, что у вас есть либо один,
bind-address = 172.17.42.1
либоbind-address = 0.0.0.0
ваш конфигурационный файл MySQL (my.cnf).Если вам нужно установить переменную среды с IP-адресом шлюза, вы можете запустить следующий код в контейнере:
затем в вашем приложении используйте
DOCKER_HOST_IP
переменную окружения, чтобы открыть соединение с MySQL.Примечание: если вы используете
bind-address = 0.0.0.0
сервер MySQL, вы будете прослушивать соединения на всех сетевых интерфейсах. Это означает, что ваш сервер MySQL может быть доступен из Интернета; убедитесь, что настроили правила брандмауэра соответственно.Примечание 2: если вы используете
bind-address = 172.17.42.1
ваш сервер MySQL, он не будет прослушивать сделанные подключения127.0.0.1
. Процессы, работающие на док-хосте, который хочет подключиться к MySQL, должны будут использовать172.17.42.1
IP-адрес.режим хоста
Чтобы получить доступ к MySQL, работающему на хосте докера, из контейнеров в режиме хоста , вы можете сохранить
bind-address = 127.0.0.1
свою конфигурацию MySQL, и все, что вам нужно сделать, это подключиться к ним127.0.0.1
из ваших контейнеров:примечание: используйте
mysql -h 127.0.0.1
и не используйтеmysql -h localhost
; в противном случае клиент MySQL будет пытаться подключиться через сокет unix.источник
telnet 172.17.0.1 3306
-v /var/run/mysqld/mysqld.sock:/tmp/mysql.sock
это.Для macOS и Windows
Docker v 18.03 и выше (с 21 марта 2018 г.)
Используйте свой внутренний IP-адрес или подключитесь к специальному DNS-имени,
host.docker.internal
которое будет преобразовано во внутренний IP-адрес, используемый хостом.Ожидается поддержка Linux https://github.com/docker/for-linux/issues/264
MacOS с более ранними версиями Docker
Докер для Mac v 17.12 до 18.02
То же, что и выше, но используйте
docker.for.mac.host.internal
вместо этого.Докер для Mac с 17.06 по 17.11
То же, что и выше, но используйте
docker.for.mac.localhost
вместо этого.Докер для Mac 17.05 и ниже
Чтобы получить доступ к хост-машине из док-контейнера, вы должны прикрепить IP-псевдоним к вашему сетевому интерфейсу. Вы можете связать любой IP-адрес, который хотите, просто убедитесь, что вы не используете его ни с чем другим.
sudo ifconfig lo0 alias 123.123.123.123/24
Затем убедитесь, что ваш сервер прослушивает IP-адрес, упомянутый выше или
0.0.0.0
. Если он прослушивает localhost,127.0.0.1
он не примет соединение.Затем просто укажите свой док-контейнер на этот IP, и вы получите доступ к хост-машине!
Для проверки вы можете запустить что-то вроде
curl -X GET 123.123.123.123:3000
внутри контейнера.Псевдоним будет сбрасываться при каждой перезагрузке, поэтому при необходимости создайте сценарий запуска.
Решение и дополнительная документация здесь: https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
источник
mysql -uroot -hdocker.for.mac.localhost
docker run -e HOSTNAME= docker.for.mac.host.internal
, контейнер создан, но ничего не происходит. Я должен тогда crtl + C. По--net=host -e HOSTNAME=localhost
крайней мере, контейнер работает и жалуется, что не может найти нужный мне сервис (MySQL db).Я сделал хак, аналогичный рассмотренным выше постам, чтобы получить локальный IP для сопоставления с псевдонимом (DNS) в контейнере. Основная проблема заключается в том, чтобы динамически получить с помощью простого сценария, который работает как в Linux, так и в OSX, IP-адрес хоста . Я сделал этот скрипт, который работает в обеих средах (даже в дистрибутиве Linux с
"$LANG" != "en_*"
настроенным):Итак, используя Docker Compose, полная конфигурация будет:
Скрипт запуска (docker-run.sh) :
docker-compose.yml :
Затем измените
http://localhost
кhttp://dockerhost
в вашем коде.Более подробное руководство по настройке
DOCKERHOST
скрипта можно найти в этом посте с объяснением того, как он работает.источник
DOCKERHOST
значения здесь вместо «localhost» или 0.0.0.0 в любой службе, к которой ваш контейнер докера должен подключиться локально.export DOCKERHOST=$(docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' <NETWORK-NAME> | awk -F "/" 'NR==1{print $1}')
где <NETWORK-NAME> может быть мостом или именем сети, как определено docker-compose (обычно path-name - network_name ).dockerhost
в качестве хоста для соединения с БД (обычно заменяютlocalhost
в файле конфигурации).Это сработало для меня в стеке NGINX / PHP-FPM, не касаясь какого-либо кода или сети, где приложение просто ожидает подключения к
localhost
Смонтировать
mysqld.sock
от хоста внутрь контейнера.Найдите расположение файла mysql.sock на хосте, на котором работает mysql:
netstat -ln | awk '/mysql(.*)?\.sock/ { print $9 }'
Смонтируйте этот файл туда, где он ожидается в докере:
docker run -v /hostpath/to/mysqld.sock:/containerpath/to/mysqld.sock
Возможные местоположения mysqld.sock:
источник
До тех пор
host.docker.internal
не работает для каждой платформы, вы можете использовать мой контейнер в качестве шлюза NAT без какой-либо ручной настройки:https://github.com/qoomon/docker-host
источник
Решение для Linux (ядро> = 3.6).
Хорошо, ваш локальный сервер имеет интерфейс Docker по умолчанию с IP-адресом 172.17.0.1 . Ваш контейнер запустился с сетевыми настройками по умолчанию --net = "bridge" .
$ sysctl -w net.ipv4.conf.docker0.route_localnet=1
$ iptables -t nat -I PREROUTING -i docker0 -d 172.17.0.1 -p tcp --dport 3306 -j DNAT --to 127.0.0.1:3306
$ iptables -t filter -I INPUT -i docker0 -d 127.0.0.1 -p tcp --dport 3306 -j ACCEPT
CREATE USER 'user'@'%' IDENTIFIED BY 'password';
Из документации ядра :
источник
Решение для Windows 10
Docker Community Edition 17.06.0-ce-win18 2017-06-28 (стабильный)
Вы можете использовать DNS-имя хоста
docker.for.win.localhost
, чтобы разрешить внутренний IP. (Предупреждение некоторых источников, упомянутыхwindows
но это должно бытьwin
)Обзор
Мне нужно было сделать нечто подобное, то есть подключиться из моего контейнера Docker к моему локальному хосту, на котором выполнялись
Azure Storage Emulator
иCosmosDB Emulator
.По
Azure Storage Emulator
умолчанию прослушивает 127.0.0.1 , в то время как вы также можете изменить IP-адрес, я искал решение, которое будет работать с настройками по умолчанию.Это также работает для подключения из моего контейнера Docker
SQL Server
иIIS
, оба работают локально на моем хосте с настройками порта по умолчанию.источник
Очень просто и быстро, проверьте IP своего хоста с помощью ifconfig (linux) или ipconfig (windows), а затем создайте
докер-compose.yml
Таким образом, ваш контейнер сможет получить доступ к вашему хосту. При доступе к вашей БД не забудьте использовать имя, которое вы указали ранее, в данном случае «dockerhost» и порт вашего хоста, на котором работает БД
источник
Ни один из ответов не сработал для меня при использовании Docker Toolbox на Windows 10 Home, но 10.0.2.2 сработал , поскольку он использует VirtualBox, который выставляет хост для виртуальной машины по этому адресу.
источник
Ethernet adapter vEthernet (DockerNAT)
Для тех в Windows, предполагая, что вы используете сетевой драйвер моста, вам нужно специально привязать MySQL к ip-адресу сетевого интерфейса hyper-v.
Это делается с помощью файла конфигурации в обычно скрытой папке C: \ ProgramData \ MySQL.
Привязка к 0.0.0.0 не будет работать. Необходимый адрес также отображается в конфигурации докера, и в моем случае это был 10.0.75.1.
источник
Редактировать: я закончил прототипирование концепции на GitHub. Проверьте: https://github.com/sivabudh/system-in-a-box
Во-первых, мой ответ ориентирован на 2 группы людей: тех, кто использует Mac, и тех, кто использует Linux.
Режим сети хоста не работает на Mac. Вы должны использовать IP-псевдоним, см .: https://stackoverflow.com/a/43541681/2713729
Что такое режим сети хоста? Смотрите: https://docs.docker.com/engine/reference/run/#/network-settings
Во-вторых, для тех из вас, кто использует Linux (мой непосредственный опыт был с Ubuntu 14.04 LTS, и я скоро обновляюсь до 16.04 LTS в рабочем состоянии ), да , вы можете настроить службу, работающую в контейнере Docker, на подключение к
localhost
службам, работающим на Докер хост (например, ваш ноутбук).Как?
Ключ в том, что когда вы запускаете контейнер Docker, вы должны запускать его в режиме хоста . Команда выглядит так:
docker run --network="host" -id <Docker image ID>
Когда вы сделаете
ifconfig
(вам понадобитсяapt-get install net-tools
ваш контейнер дляifconfig
вызова) внутри вашего контейнера, вы увидите, что сетевые интерфейсы такие же, как на хосте Docker (например, на вашем ноутбуке).Важно отметить, что я пользователь Mac, но я запускаю Ubuntu под Parallels, поэтому использование Mac не является недостатком. ;-)
И вот как вы подключаете контейнер NGINX к MySQL, работающему на
localhost
.источник
--network="host"
, как можно подключиться к хосту mysql, например?localhost
. Проверьте мой исходный код GitHub: github.com/sivabudh/system-in-a-box/blob/master/dj_host_docker/… . Ищите'HOST'
, вы увидите 127.0.0.1 для подключения к Postgresql.Самое простое решение для Mac OSX
Просто используйте IP-адрес вашего Mac. На Mac запустите это, чтобы получить IP-адрес и использовать его из контейнера:
Пока сервер, работающий локально на вашем Mac или в другом док-контейнере, прослушивает 0.0.0.0, докер-контейнер сможет связаться по этому адресу.
Если вы просто хотите получить доступ к другому док-контейнеру, который прослушивает 0.0.0.0, вы можете использовать 172.17.0.1
источник
docker.for.mac.host.internal
теперь предоставляет имя хоста.Это не ответ на актуальный вопрос. Так я решил похожую проблему. Решение полностью основано на: Определите Docker Container Networking, чтобы контейнеры могли общаться . Спасибо Ник Рабой
Оставьте это здесь для других, которые могут захотеть делать вызовы REST между одним контейнером и другим. Отвечает на вопрос: что использовать вместо localhost в среде докера?
Узнайте, как выглядит ваша сеть
docker network ls
Создать новую сеть
docker network create -d my-net
Запустить первый контейнер
docker run -d -p 5000:5000 --network="my-net" --name "first_container" <MyImage1:v0.1>
Проверьте настройки сети для первого контейнера
docker inspect first_container
. «Сети»: должна быть «моя сеть»Запустить второй контейнер
docker run -d -p 6000:6000 --network="my-net" --name "second_container" <MyImage2:v0.1>
Проверьте настройки сети для второго контейнера
docker inspect second_container
. «Сети»: должна быть «моя сеть»SSH в ваш второй контейнер
docker exec -it second_container sh
илиdocker exec -it second_container bash
.Внутри второго контейнера вы можете пропинговать первый контейнер
ping first_container
. Кроме того, ваш код звонков, таких какhttp://localhost:5000
может быть заменен наhttp://first_container:5000
источник
Для окон,
Я изменил URL базы данных в весенней конфигурации:
spring.datasource.url=jdbc:postgresql://host.docker.internal:5432/apidb
Затем создайте образ и запустите. Это сработало для меня.
источник
Я не согласен с ответом Thomasleveil.
Привязка mysql к 172.17.42.1 предотвратит доступ других программ, использующих базу данных на хосте. Это будет работать только в том случае, если все пользователи вашей базы данных докеризованы.
Привязка mysql к 0.0.0.0 откроет базу данных для внешнего мира, что не только очень плохо, но и противоречит тому, что хочет сделать автор оригинального вопроса. Он явно говорит: «MySql работает на локальном хосте и не открывает порт для внешнего мира, поэтому он связан с локальным хостом»
Ответить на комментарий от ivant
Это невозможно. В документации mysql / mariadb явно сказано, что невозможно привязать несколько интерфейсов. Вы можете привязать только к 0, 1 или всем интерфейсам.
В заключение я НЕ нашел никакого способа получить доступ к базе данных (только для локального хоста) на хосте из контейнера докера. Это определенно похоже на очень распространенную модель, но я не знаю, как это сделать.
источник
172.17.42.1
адрес. Но ваша заметка верна в противном случае. Кроме того, я отредактировал свой ответ вhost
сетевом режиме, который позволяет поддерживать127.0.0.1
0.0.0.0
и затем настроить межсетевой экран так, чтобы база данных не была доступна из Интернета.Вот мое решение: это работает для моего случая
установить публичный доступ к локальному серверу MySQL через комментарий
#bind-address = 127.0.0.1
в /etc/mysql/mysql.conf.dперезапустите сервер MySQL
sudo /etc/init.d/mysql restart
выполните следующую команду, чтобы открыть пользователю root доступ к любому хосту
mysql -uroot -proot GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; FLUSH PRIVILEGES;
скрипт создания sh: run_docker.sh
работать с docker-composer
источник
На ум приходит несколько решений:
Причина, по которой это не работает «из коробки», заключается в том, что контейнеры по умолчанию запускаются с собственным сетевым пространством имен. Это означает, что localhost (или 127.0.0.1, указывающий на интерфейс обратной связи) уникален для каждого контейнера. Подключение к нему приведет к подключению к самому контейнеру, а не к сервисам, работающим вне докера или внутри другого контейнера докера.
Опция 1 : если ваша зависимость может быть перемещена в контейнер, я бы сделал это в первую очередь. Это делает ваше приложение переносимым, так как другие пытаются запустить ваш контейнер в своей среде. И вы по-прежнему можете публиковать порт на своем хосте, где другие службы, которые не были перенесены, все еще могут достичь его. Вы даже можете опубликовать порт в интерфейсе localhost на вашем хосте докера, чтобы избежать его внешнего доступа с помощью синтаксиса, например:
-p 127.0.0.1:3306:3306
для опубликованного порта.Вариант 2 Существует множество способов определения IP-адреса хоста внутри контейнера, но у каждого из них есть ограниченное число сценариев, в которых они работают (например, требуется Docker для Mac). Наиболее переносимый вариант - ввести IP-адрес вашего хоста в контейнер с помощью чего-то вроде переменной среды или файла конфигурации, например:
Это требует, чтобы ваша служба прослушивала этот внешний интерфейс, что может быть проблемой безопасности. Для других методов, чтобы получить IP-адрес узла изнутри контейнера, см. В этом посте .
Вариант 3 : Запуск без изоляции сети, т.е. с
--net host
, означает, что ваше приложение работает в пространстве имен сети хоста. Это меньше изолирует контейнер, и это означает, что вы не можете получить доступ к другим контейнерам через общую докерную сеть с DNS (вместо этого вам нужно использовать опубликованные порты для доступа к другим контейнерам приложений). Но для приложений, которым требуется доступ к другим службам на хосте, которые только прослушивают на127.0.0.1
хосте, это может быть самым простым вариантом.Вариант 4. Различные сервисы также разрешают доступ через сокет на основе файловой системы. Этот сокет может быть подключен к контейнеру в качестве тома с привязкой, что позволяет получить доступ к службе хоста, не выходя в сеть. Для доступа к механизму докера вы часто видите примеры монтирования
/var/run/docker.sock
в контейнер (предоставляя этому контейнеру корневой доступ к хосту). С mysql, вы можете попробовать что-то вроде,-v /var/run/mysqld/mysqld.sock:/var/run/mysqld/mysql.sock
а затем подключиться кlocalhost
которой mysql преобразуется в использование сокета.источник
Вы можете получить IP хоста используя альпийское изображение
Это будет более последовательным, так как вы всегда используете alpine для запуска команды.
Как и в ответе Мариано, вы можете использовать ту же команду для установки переменной окружения
источник
Для Linux, где вы не можете изменить интерфейс, к которому привязывается служба localhost
Есть две проблемы, которые нам нужно решить
Первая проблема может быть решена с использованием образа docker-host в qoomon , как указано в других ответах.
Вам нужно будет добавить этот контейнер в ту же мостовую сеть, что и ваш другой контейнер, чтобы вы могли получить к нему доступ. Откройте терминал внутри вашего контейнера и убедитесь, что вы можете пинговать
dockerhost
.Теперь проблема сложнее, сделать сервис доступным для докера.
Мы можем использовать telnet, чтобы проверить, можем ли мы получить доступ к порту на хосте (вам может понадобиться установить это).
Проблема в том, что наш контейнер будет иметь доступ только к службам, которые связаны со всеми интерфейсами, такими как SSH:
Но сервисы, привязанные только к localhost, будут недоступны:
Надлежащим решением здесь было бы связать сервис с докерской мостовой сетью. Однако этот ответ предполагает, что вы не можете изменить это. Так что вместо этого мы будем использовать
iptables
.Во-первых, нам нужно найти имя сети моста, с которой использует Docker
ifconfig
. Если вы используете безымянный мост, это будет простоdocker0
. Однако, если вы используете именованную сеть, у вас будет мост, начинающийся сbr-
того, что вместо него будет использоваться докер. Мой естьbr-5cd80298d6f4
.Как только у нас будет имя этого моста, нам нужно разрешить маршрутизацию от этого моста к localhost. По умолчанию это отключено по соображениям безопасности:
Теперь, чтобы настроить наше
iptables
правило. Поскольку наш контейнер может получать доступ только к портам в сети Docker Bridge, мы будем притворяться, что наш сервис фактически привязан к порту в этой сети.Для этого мы отправим все запросы
<docker_bridge>:port
наlocalhost:port
Например, для моего сервиса на порту 1025
Теперь вы сможете получить доступ к своему сервису из контейнера:
источник
sysctl -w net.ipv4.conf.docker0.route_localnet=1
иiptables -t nat -A PREROUTING -p tcp -i docker0 --dport 1025 -j DNAT --to-destination 127.0.0.1:1025
Вам нужно знать ворота ! Мое решение с локальным сервером состояло в том, чтобы открыть его под
0.0.0.0:8000
, затем запустить docker с подсетью и запустить контейнер как:Итак, теперь вы можете получить доступ к петле через
http://172.35.0.1:8000
источник
Попробуй это:
Получить
192.168.1.202
, используетifconfig
Это сработало для меня. Надеюсь, это поможет!
источник
CGroups и пространства имен играют главную роль в экосистеме контейнера.
Пространство имен обеспечивает уровень изоляции. Каждый контейнер работает в отдельном пространстве имен, и его доступ ограничен этим пространством имен. Cgroups контролирует использование ресурсов каждого контейнера, тогда как Namespace контролирует, что процесс может видеть и получать доступ к соответствующему ресурсу.
Вот базовое понимание подхода к решению, который вы могли бы использовать,
Использовать пространство имен сети
Когда контейнер появляется из образа, определяется и создается сетевой интерфейс. Это дает контейнеру уникальный IP-адрес и интерфейс.
Изменяя пространство имен на хост, сети cotainers не остаются изолированными от своего интерфейса, процесс получит доступ к сетевому интерфейсу хост-машин.
Если процесс прослушивает порты, они будут прослушиваться на интерфейсе хоста и сопоставляться с контейнером.
Использование пространства имен PID Изменение пространства имен Pid позволяет контейнеру взаимодействовать с другим процессом за пределами его обычной области.
Этот контейнер будет работать в своем собственном пространстве имен.
Изменяя пространство имен на хост, контейнер также может видеть все другие процессы, запущенные в системе.
Совместное использование пространства имен
Это плохая практика, когда вы работаете в производственной среде, потому что вы отказываетесь от модели безопасности контейнера, которая может открыть для уязвимостей и легкий доступ к перехватчику. Это только для инструментов отладки и недооценки лазеек в безопасности контейнера.
Первый контейнер - сервер nginx. Это создаст новую сеть и пространство имен процесса. Этот контейнер будет привязан к порту 80 вновь созданного сетевого интерфейса.
Другой контейнер теперь может повторно использовать это пространство имен,
Также этот контейнер может видеть интерфейс с процессами в общем контейнере.
Это позволит вам дать больше привилегий контейнерам без изменения или перезапуска приложения. Аналогичным образом вы можете подключиться к mysql на хосте, запустить и отладить ваше приложение. Но не рекомендуется идти по этому пути. Надеюсь, поможет.
источник
Для Windows Machine: -
Выполните команду ниже, чтобы случайно открыть порт Docker во время сборки
В приведенном выше списке контейнеров вы можете видеть порт, назначенный как 32768. Попробуйте получить доступ
Вы можете увидеть страницу MediaWiki
источник
Пока исправление не объединено с
master
веткой, для получения IP-адреса узла просто запустите изнутри контейнера:(как предложено @Mahoney здесь ).
источник
Я решил это, создав пользователя в MySQL для ip контейнера:
Затем на контейнере:
jdbc:mysql://<b>172.17.0.1</b>:3306/database_name
источник
Я делаю это, передавая IP-адрес хоста как переменную среды контейнеру. Затем контейнер получает доступ к хосту по этой переменной.
источник