Итак, у меня есть Nginx, запущенный внутри контейнера docker, есть mysql, запущенный на localhost, я хочу подключиться к MySql из моего Nginx. MySql работает на localhost и не открывает порт для внешнего мира, поэтому он привязан к localhost, а не к ip-адресу машины.
Есть ли способ подключиться к этому MySql или любой другой программе на localhost из этого контейнера docker?
Этот вопрос отличается от "Как получить IP-адрес докер-хоста изнутри докер-контейнера" тем, что IP-адрес докер-хоста может быть публичным IP или частным IP в сети, который может быть доступен или недоступен из докер-контейнера (я имею в виду публичный IP, если он размещен на AWS или что-то подобное). Даже если у вас есть IP-адрес докер-хоста, это не значит, что вы можете подключиться к нему из контейнера по этому IP-адресу, поскольку ваша сеть Docker может быть оверлейной, хостовой, мостовой, macvlan, none и т.д., что ограничивает доступность этого IP-адреса.
Редактирование: Если вы используете Docker-for-mac или Docker-for-Windows 18.03+, просто подключитесь к службе mysql, используя хост host.docker.internal
.
По состоянию на Docker 18.09.3 это не работает на Docker-for-Linux. исправление было отправлено 8 марта 2019 года и, надеюсь, будет внесено в кодовую базу. До тех пор обходным решением является использование контейнера, как описано в qoomon's answer.
Используйте --network="host"
в команде docker run
, тогда 127.0.0.1
в вашем контейнере docker будет указывать на ваш хост docker.
Примечание: Этот режим работает только в Docker для Linux, согласно документации.
Docker предлагает различные сетевые режимы при запуске контейнеров. В зависимости от выбранного режима вы будете по-разному подключаться к базе данных MySQL, запущенной на хосте docker.
По умолчанию Docker создает мост с именем docker0
. И хост docker, и контейнеры docker имеют IP-адрес на этом мосту.
На хосте Docker введите sudo ip addr show docker0
и вы получите результат, похожий на:
[vagrant@docker:~] $ sudo ip addr show docker0
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::5484:7aff:fefe:9799/64 scope link
valid_lft forever preferred_lft forever
Итак, мой докер-хост имеет IP-адрес 172.17.42.1
на сетевом интерфейсе docker0
.
Теперь запустите новый контейнер и получите на нем оболочку: docker run --rm -it ubuntu:trusty bash
и внутри контейнера введите ip addr show eth0
, чтобы узнать, как настроен его основной сетевой интерфейс:
root@e77f6a1b3740:/# ip addr show eth0
863: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 66:32:13:f0:f1:e3 brd ff:ff:ff:ff:ff:ff
inet 172.17.1.192/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::6432:13ff:fef0:f1e3/64 scope link
valid_lft forever preferred_lft forever
Здесь мой контейнер имеет IP-адрес 172.17.1.192
. Теперь посмотрите на таблицу маршрутизации:
root@e77f6a1b3740:/# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 172.17.42.1 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 * 255.255.0.0 U 0 0 0 eth0
Итак, IP-адрес докер-хоста 172.17.42.1
установлен как маршрут по умолчанию и доступен из вашего контейнера.
root@e77f6a1b3740:/# ping 172.17.42.1
PING 172.17.42.1 (172.17.42.1) 56(84) bytes of data.
64 bytes from 172.17.42.1: icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from 172.17.42.1: icmp_seq=2 ttl=64 time=0.201 ms
64 bytes from 172.17.42.1: icmp_seq=3 ttl=64 time=0.116 ms
В качестве альтернативы вы можете запустить контейнер docker с сетевыми настройками, установленными на host
. Такой контейнер будет разделять сетевой стек с хостом docker, и с точки зрения контейнера localhost
(или 127.0.0.1
) будет относиться к хосту docker.
Имейте в виду, что любой порт, открытый в вашем контейнере docker, будет открыт на хосте docker. И это без необходимости использования опции -p
или -P
docker run
.
Конфигурация IP на моем хосте docker:
[vagrant@docker:~] $ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
valid_lft forever preferred_lft forever
и из контейнера docker в режиме host:
[vagrant@docker:~] $ docker run --rm -it --network=host ubuntu:trusty ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
valid_lft forever preferred_lft forever
Как вы можете видеть, и хост docker, и контейнер docker используют один и тот же сетевой интерфейс и, соответственно, имеют один и тот же IP-адрес.
Чтобы получить доступ к MySQL, запущенному на хосте docker, из контейнеров в режиме моста, необходимо убедиться, что служба MySQL прослушивает соединения на IP-адресе 172.17.42.1
.
Для этого в конфигурационном файле MySQL (my.cnf) нужно указать либо bind-address = 172.17.42.1
, либо bind-address = 0.0.0.0
.
Если вам нужно установить переменную окружения с IP-адресом шлюза, вы можете выполнить следующий код в контейнере:
export DOCKER_HOST_IP=$(route -n | awk '/UG[ \t]/{print $2}')
затем в вашем приложении используйте переменную окружения DOCKER_HOST_IP
для открытия соединения с MySQL.
Примечание: если вы используете bind-address = 0.0.0.0
, ваш MySQL сервер будет прослушивать соединения на всех сетевых интерфейсах. Это означает, что ваш сервер MySQL может быть доступен из Интернета; убедитесь, что вы настроили правила брандмауэра соответствующим образом.
Примечание 2: если вы используете bind-address = 172.17.42.1
, ваш MySQL сервер не будет слушать соединения, сделанные с 127.0.0.1
. Процессы, запущенные на хосте docker, которые захотят подключиться к MySQL, должны будут использовать IP-адрес 172.17.42.1
.
Чтобы получить доступ к MySQL, запущенному на хосте docker, из контейнеров в режиме хост, вы можете сохранить bind-address = 127.0.0.1
в конфигурации MySQL, и все, что вам нужно сделать, это подключиться к 127.0.0.1
из ваших контейнеров:
[vagrant@docker:~] $ docker run --rm -it --network=host mysql mysql -h 127.0.0.1 -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 5.5.41-0ubuntu0.14.04.1 (Ubuntu)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
примечание: Используйте mysql -h 127.0.0.1
, а не mysql -h localhost
; иначе клиент MySQL будет пытаться подключиться, используя unix сокет.
Докер в 18.03 и выше (с 21 марта 2018 года)
Использовать свой внутренний IP адрес и подключиться к проведению специального DNS-имя`.докер.внутренние, по которым будет разрешить внутренний IP-адрес, используемый хозяином.
Поддержка Linux в ожидании https://github.com/docker/for-linux/issues/264
Докер для Mac в 17.12 в 18.02
Как описано выше, но использовать докер.для.Мак.хозяин.внутренние вместо.
Докер для Mac в 17.06 до V 17.11
Как описано выше, но использовать докер.для.Мак.имя localhost` вместо этого.
Докер для Mac 17.05 и ниже
Получить доступ к хост-машины из контейнера Docker необходимо приложить псевдоним IP для вашего сетевого интерфейса. Вы можете привязать какой IP вы хотите, просто убедитесь, что вы'повторно не использовать его ни на что другое.
судо команду ifconfig назван lo0 псевдоним 123.123.123.123/24
Затем убедитесь, что сервер слушает на IP, упомянутых выше или 0.0.0.0
. Если это'ы слушает localhost 127.0.0.1
он не принимает соединения.
Затем просто наведите контейнер докер на этот IP и вы можете получить доступ к хост-машине!
Для проверки можно запустить что-то вроде завиток -Х вам 123.123.123.123:3000
внутри контейнера.
Псевдоним будет сбрасываться при каждой перезагрузке так создаем стартовый скрипт, если это необходимо.
Решение и документация здесь: https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
Я делал Хак похожие на вышеупомянутых должностях получают локальный IP для сопоставления псевдонима (ДНС) в контейнере. Основная проблема-получить динамически с помощью простого скрипта, который работает как в Linux и OSX хост-IP-адрес. Я сделал этот скрипт, который работает в обеих средах (даже в Linux с в " Ланг и quot$; ! = на "en_*"
в настройке):
ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1
Так, используя Докер сочинять, полной конфигурации будет:
Скрипт автозагрузки (docker-run.sh):
export DOCKERHOST=$(ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1)
docker-compose -f docker-compose.yml up
докер-сочинять.в формате YML:
myapp:
build: .
ports:
- "80:80"
extra_hosts:
- "dockerhost:$DOCKERHOST"
Затем измените http://localhost
в `http://dockerhost в ваш код.
Для более руководство по настройке DOCKERHOST
сценарий, взгляните на этот пост с объяснением, как это работает.
Это сработало для меня на стеке 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:
/tmp/mysqld.sock
/var/run/mysqld/mysqld.sock
/var/lib/mysql/mysql.sock
/Applications/MAMP/tmp/mysql/mysql.sock # if running via MAMP
До хозяина.докер.внутренние` работает на любой платформе, вы можете использовать мой контейнер действуя в качестве шлюза NAT без любой ручной установки:
Решение для Linux (ядра >=3.6).
Ок, ваш сервер localhost имеет интерфейс настройки по умолчанию docker0 с IP-адресом 172.17.0.1. Ваш контейнер начал с настройки сети по умолчанию --чистая="У Моста" по.
$ переменная sysctl -w в сети.протокол IPv4.конф.docker0.route_localnet=1
$ в iptables -Т физ-я следующее -Я docker0 -д 172.17.0.1 -п протокол tcp --dport 3306 -J и ДНАТ --на 127.0.0.1:3306
`$ iptables в -Т фильтра -я -я docker0 -д 127.0.0.1 -п протокол tcp --dport 3306 -J, его принятьСоздать пользователя 'пользователей'@'%' определены 'пароль';
<БР> В документации ядра]1:<БР>
route_localnet активация: не считаю loopback адреса марсианского источника или назначения при маршрутизации. Это позволяет использовать 127/8 для местных целей маршрутизации (по умолчанию false).
Решение для Windows 10
Докер сообщества издание 17.06.0-се-win18 2017-06-28 (стабильный)<БР/>
Вы можете использовать DNS-имя хоста докер.для.выиграть.имя localhost
, чтобы разрешить внутренний IP. (Предупреждение в некоторых источниках упоминается "окна", но она должна быть победа
)
Обзор<БР/> Мне нужно сделать что-то подобное, то есть связывают с моего контейнера Docker на мое имя localhost, который был запущен эмулятор хранилища Azure " и " CosmosDB эмулятор`&.ЛТ;БР/>
В `хранилище Azure эмулятор по умолчанию слушает на 127.0.0.1*, в то время как вы можете изменить IP своего слишком привязан, я ищу решение, которое будет работать с настройками по умолчанию.
Это также работает для подключения из моего контейнера Docker для SQL-сервера и службы IIS, и работает локально на моем хосте с настройки порта по умолчанию.
Для тех, кто на Windows, предполагая, что вы're, используя сетевой драйвер мост, вы'll хочу конкретно привязать MySQL к IP-адрес виртуальной сетевой интерфейс.
Это делается через файл конфигурации под обычно скрытые папки C:\ProgramData\MySQL .
Привязка к 0.0.0.0 не будет работать. Нужный адрес будет показан в конфигурации настройки также, и в моем случае был 10.0.75.1.
Редактировать: я в конечном итоге прототипирования концепции на GitHub. Проверьте: https://github.com/sivabudh/system-in-a-box
Во-первых, мой ответ ориентирован на 2 группы людей: тех, кто использует Mac, а также для тех, кто использует Линукс.
В хоста сетевой режим Не'т работать на Mac. Вы должны использовать псевдоним IP, см.: https://stackoverflow.com/a/43541681/2713729
Что такое режим узлов сети? См.: https://docs.docker.com/engine/reference/run/#/network-settings
Во-вторых, для тех из вас, кто использует Линукс (мой непосредственный опыт с Ubuntu 14.04 LTS и я'м обновление до 16.04 ЛЦ в производство в ближайшее время), да, вы можете сделать сервис, работающий внутри докер контейнер подключаться к локальным localhost
служб, работающих на узел Docker (например. ваш ноутбук).
Как?
Ключ при запуске контейнер Докер, вы должны запустить его с хоста режима. Команда выглядит так:
докер запустить-сеть=на"хозяина" и-идентификатор <Docker-образ идентификатор>
Когда вы делаете для себя команду ifconfig` (вам нужно будет для apt-получить установку нетто-инструментов контейнер для ifconfig, которые будут вызываться) внутри вашего контейнера, вы увидите, что сетевые интерфейсы, такие же, как и на узел Docker (например. ваш ноутбук).
Это's важный, чтобы отметить, что я'м пользователь Mac, но у меня Убунту на виртуальной машине Parallels, поэтому использование Mac-это не недостаток. ;-)
И это, как вы подключите контейнер nginx к MySQL работает на локальным localhost
.
Простое решение для Mac и OSX
Просто использовать IP-адрес вашего Mac. На Маке запустить, чтобы получить IP-адрес и использовать его в контейнер:
$ ifconfig | grep 'inet 192'| awk '{ print $2}'
Пока сервер работает локально, на вашем Mac или в другом контейнере Docker слушает 0.0.0.0, контейнер докер сумеет достучаться по этому адресу.
Если вы просто хотите получить доступ к другой контейнер докер, который прослушивает 0.0.0.0 можно использовать 172.17.0.1
Очень простая и быстрая, проверить свой IP адрес с помощью ifconfig (в Linux) или ipconfig (Windows) и затем создать
докер-сочинять.в формате YML
version: '3' # specify docker-compose version
services:
nginx:
build: ./ # specify the directory of the Dockerfile
ports:
- "8080:80" # specify port mapping
extra_hosts:
- "dockerhost:<yourIP>"
Таким образом, ваш контейнер будет иметь доступ к вашей машине. При доступе к БД, не забывайте использовать имя, которое вы указали ранее, в данном случае "и dockerhost" и порт твоего хозяина, в котором БД работает
Ни один из ответов работал для меня, когда использование Docker Toolbox на Windows 10 Домашняя, но 10.0.2.2 сделал, так как он использует VirtualBox, которые выставляет хозяин на виртуальную машину по данному адресу.
Это не ответ на актуальный вопрос. Вот как я решал подобную проблему. Решение приходит совершенно от: [определение контейнера Docker сетей, так что контейнеры могут общаться][1]. Благодаря NIC ее рабой
Оставив это здесь для других, кто, возможно, захотите, чтобы сделать отдых звонки от одного контейнера и другое. Ответы на вопрос: что использовать в место localhost в среде докер?
Вам, как ваша сеть выглядит как сеть докер ЛС`
Создать сеть новую сеть настройки создаем -D меня-нет`
Запуск первого контейнерного докер запустить -д -р 5000:5000 --сеть="Мой-чистый и" --именем "first_container" и <MyImage1:версии v0.1>
Проверьте настройки сети для первого контейнера докер проверить first_container
. "в сети" В: должен 'Мой-чистый'
Начало второго контейнера докер запустить -д -р 6000: --сети=то" 6000;Мой-чистый и" --именем "second_container" и <MyImage2:версии v0.1>
Проверьте настройки сети для второй контейнер докер проверить second_container
. "в сети" В: должен 'Мой-чистый'
СШ в докер свой второй контейнер эксес -это second_container ш " или " докер экзек-это second_container Баш
.
Внутри второго контейнера, вы можете проверить первый контейнер пинг first_container
. Кроме того, ваш код вызывает такие как http://localhost:5000
можно заменить на http://first_container:5000
Вот мое решение : это работает для моего случая
установить локальный сервер MySQL для публичного доступа на комментарий `
` в /etc/mysql в/в MySQL.конф.д
перезагрузка сервера MySQL
судо /етц/инит.д/MySQL и перезагрузить
выполните следующую команду, чтобы открыть пользователей root-доступ любой хост
в MySQL -уроот -proot ВСЕ ПРИВИЛЕГИИ ПО *.* В 'корня'@'%' определены 'корне' С ПРЕДОСТАВЛЕНИЕ ОПЦИОНА; ЗАПОДЛИЦО ЛЬГОТ;
создать скрипт SH : run_docker.sh в <предварительно>
HOSTIP=ИС -4 Эл показать масштабы глобальной разработки интерфейсов eth0 | grep в инет | на awk '{печать \$2}' | вырезать -Д / -Ф 1`
докер Run-это -д-имя веб-приложения \
</пред>
в <предварительно> версия: '2.1'
услуги: tomcatwar: extra_hosts:
</пред>
Приходят в голову несколько решений:
Причина этого не't работа "из коробки" является то, что контейнеры с их собственную сеть пространства имен по умолчанию. Это означает, что localhost (или 127.0.0.1, указывающего на loopback-интерфейс) является уникальным для каждого контейнера. Подключение к этому будут подключаться в сам контейнер, а не служб, работающих вне докер или внутри другого контейнера Docker.
Вариант 1: Если ваша зависимость может быть перемещен в контейнер, я бы сделала это первой. Это делает ваше приложение портативный стек, как другие пытаются запустить свой контейнер на их собственной среде. И вы по-прежнему можете опубликовать порт на узле, где другие услуги, которые не были перенесены все равно можете достичь его. Вы можете даже опубликовать порт, интерфейс localhost на свой узел Docker, чтобы избежать его внешне можно с следующий синтаксис: -Р 127.0.0.1:3306:3306
за опубликованный порт.
Вариант 2: Существует множество способов для определения IP-адрес узла внутри контейнера, но у каждого есть ограниченное число ситуаций, в которых они работают (например, требующих настройки для Mac). Самый портативный вариант, чтобы придать вашему ip хоста в контейнер с чем-то вроде переменной среды или конфигурации файла, например:
docker run --rm -e "HOST_IP=$(ip r s 0/0 | awk '{print $3}')" ...
Это означает, что ваша служба слушает на внешнем интерфейсе, который может быть проблемой безопасности. Для других методов, чтобы получить IP-адрес узла внутри контейнера, этот пост.
Вариант 3: работает без изоляции сети, т. е. с--Чистый хост, означает, что ваше приложение выполняется на узле пространства имен сети. Это меньше изоляции для контейнера, и это означает, что вы не открыть других контейнеров на общей сети настройки с ДНС (вместо этого нужно использовать опубликованные порты для доступа к другим контейнерных приложений). Но для приложений, которым требуется доступ к другим службам на хост, что только прослушивание на 127.0.0.1
на хост, это может быть самый простой вариант.
Вариант 4: различные услуги также разрешить доступ через файловую систему на основе сокетов. Эта розетка может быть установлена в контейнер как привязать установленный объем, позволяя вам получить доступ к хост-обслуживание без обращения по сети. Для доступа к двигателю докер, вы часто видите примеры установки `в/var/работа/докер.носок в контейнер (давая, что корневой контейнер доступ к хосту). С MySQL, вы можете попробовать что-то вроде-в каталоге /var/выполнения/которых mysqld/mysqld в.носок: файл/var/работа/тузды/в MySQL.носок и затем подключиться к localhost в которых MySQL преобразовывает с использованием сокета.
Я не согласен с ответом Thomasleveil.
Если заставить mysql привязаться к 172.17.42.1, то другие программы, использующие базу данных на хосте, не смогут до нее добраться. Это будет работать, только если все пользователи вашей базы данных докеризированы.
Привязка mysql к 0.0.0.0.0 откроет базу данных для внешнего мира, что не только очень плохо, но и противоречит тому, что хочет сделать автор исходного вопроса. Он прямо говорит "MySql работает на localhost и не открывает порт для внешнего мира, поэтому он привязан к localhost"
В ответ на комментарий от ivant
"Почему бы не привязать mysql и к docker0? "
Это невозможно. В документации по mysql/mariadb прямо сказано, что нельзя привязываться к нескольким интерфейсам. Вы можете привязать только к 0, 1 или всем интерфейсам.
В заключение, я НЕ нашел никакого способа получить доступ к базе данных (только на localhost) на хосте из контейнера docker. Это определенно кажется очень распространенной схемой, но я не знаю, как это сделать.
Вы можете получить IP хоста через альпийские изображения
docker run --rm alpine ip route | awk 'NR==1 {print $3}'
Это было бы более последовательным, как вы'вновь всегда через альпийские выполнить команду.
Похожие на Мариано'ы ответ вы можете использовать ту же команду, чтобы установить переменную окружения
DOCKER_HOST=$(docker run --rm alpine ip route | awk 'NR==1 {print $3}') docker-compose up
Групп и пространств имен играют важную роль в контейнере экосистемы.
Пространства имен предоставляют слой изоляции. Каждый контейнер проходит в отдельном пространстве имен и ограниченного доступа к пространству имен. В контрольных группах, контролирует использование ресурсов каждого контейнера, в то время как контролирует пространство имен, что процесс может просмотреть и получить доступ к соответствующим ресурсам.
Вот базовые понимания подход решения можно следовать,
Использование Сетевых Имен
Когда контейнер спавнится из изображения, сетевой интерфейс определен и создать. Это дает контейнера уникальный адрес и IP-интерфейс.
$ docker run -it alpine ifconfig
Путем изменения имен для узла сети cotainers не остается изолированным на его интерфейс, процесс будет иметь доступ к сетевому интерфейсу узла машины.
$ docker run -it --net=host alpine ifconfig
Если процесс прослушивает порты, они'll быть прослушаны на хост-интерфейс и связаны с контейнером.
Использовать пространства имен ПИД Изменение пространства имен пид позволяет контейнер для взаимодействия с другими процесса за обычные рамки.
Этот контейнер будет работать в собственном пространстве имен.
$ docker run -it alpine ps aux
Путем изменения имен для хозяина, контейнер также может увидеть все процессы, запущенные в системе.
$ docker run -it --pid=host alpine ps aux
Пространства Имен Обмена
Это плохая практика, чтобы сделать это в производство, потому что вы нарушаете модели безопасности контейнер, который может открыть для уязвимостей, и легкий доступ к соглядатая. Это только для отладки и занижения лазейки в безопасности контейнерных перевозок.
Первый контейнер-сервер nginx. Это позволит создать новую сеть и пространство процесса. Этот контейнер будет привязывать себя к порту 80 вновь созданных сетевых интерфейсов.
$ docker run -d --name http nginx:alpine
Другой контейнер теперь можете использовать это пространство имен,
$ docker run --net=container:http mohan08p/curl curl -s localhost
Также этот контейнер можно увидеть интерфейс с процессами в общий контейнер.
$ docker run --pid=container:http alpine ps aux
Это позволит вам дать больше привилегий в контейнеры без изменения или перезапустить приложение. Аналогичным образом вы можете подключиться к MySQL на хост, запуск и отладку приложения. Но, его не рекомендуют идти по этому пути. Надеюсь, что это помогает.
Для Компьютера Windows :-
Выполните следующую команду, чтобы выставить порт докер случайно во время сборки
$docker run -d --name MyWebServer -P mediawiki
В списке выше контейнера вы можете увидеть порт, назначенный как 32768. Попробуйте получить доступ к
localhost:32768
Вы можете увидеть страницу в MediaWiki
Есть две проблемы нужно решить
Первая проблема может быть решена с помощью qoomon'ы докер-хозяина изображения, Как дали другие ответы.
Вам нужно добавить этот контейнер к той же сетевой мост как ваш другой контейнер, так что вы можете получить к нему доступ. Откройте терминал внутри вашего контейнера и убедитесь, что вы можете пингу dockerhost
.
bash-5.0# ping dockerhost
PING dockerhost (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.523 ms
Теперь, чем сильнее проблема, что делает услугу доступной для настройки.
Мы можем использовать telnet, чтобы проверить, если мы можем открыть порт на компьютере (возможно, потребуется установить это).
Проблема в том, что наш контейнер будет только быть в состоянии получить доступ к сервисам, которые привязаны к все интерфейсы, такие как SSH:
bash-5.0# telnet dockerhost 22
SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
Но услуги, связанные только с localhost будут недоступны:
bash-5.0# telnet dockerhost 1025
telnet: can't connect to remote host (172.20.0.2): Connection refused
Правильным решением здесь будет привязать службу к сетевой мост докеров. Однако, этот ответ предполагает, что это не возможно для вас, чтобы изменить это. Так что вместо этого мы будем использовать идею
.
Во-первых, нам нужно найти название сетевой мост, что Docker использует с помощью ifconfig. Если вы используете безымянный мост, это будет просто
docker0. Однако, если вы используете именованные сети вы будете иметь мост начиная с
БР-что докер будет использовать. Шахта
БР-5cd80298d6f4`.
Как только мы получим название этого моста, нам нужно разрешить маршрутизацию с этого моста на localhost. По умолчанию это отключено по соображениям безопасности:
sysctl -w net.ipv4.conf.<bridge_name>.route_localnet=1
Теперь настраиваем правила наше идею
. Поскольку наш контейнер может только открыть порты на сети настройки моста, мы будем делать вид, что наши услуги на самом деле привязан к порту на этой сети.
Чтобы сделать это, мы будем перенаправлять все запросы к <docker_bridge>:порт
к localhost:порт
iptables -t nat -A PREROUTING -p tcp -i <docker_bridge_name> --dport <service_port> -j DNAT --to-destination 127.0.0.1:<service_port>
Например, за мою службу на порт 1025
iptables -t nat -A PREROUTING -p tcp -i br-5cd80298d6f4 --dport 1025 -j DNAT --to-destination 127.0.0.1:1025
Теперь вы должны быть в состоянии получить доступ к сервису из контейнера:
bash-5.0# telnet dockerhost 1025
220 127.0.0.1 ESMTP Service Ready