nginx образы уроки - Изнутри контейнера Docker, как мне подключиться к локальному хосту машины?





8 Answers

Для MacOS и Windows

Докер 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 до v 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

обновление образа доступ

Итак, у меня есть Nginx, запущенный внутри контейнера докеров, у меня есть mysql, работающий на localhost, я хочу подключиться к MySql из моего Nginx. MySql работает на локальном хосте и не предоставляет порт для внешнего мира, поэтому его привязка к локальному хосту, а не привязка к ip-адресу машины.

Есть ли способ подключиться к этой MySql или любой другой программе на локальном хосте из этого контейнера докеров?




Это работало для меня в стеке 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



Решение для Windows 10

Docker Community Edition 17.06.0-ce-win18 2017-06-28 (стабильный)

Вы можете использовать DNS-имя хоста docker.for.win.localhost для разрешения внутреннего IP- docker.for.win.localhost . (Предупреждение некоторых источников упомянутых windows но это должно быть win )

обзор
Мне нужно было сделать что-то подобное, то есть подключиться из моего контейнера Docker к моему локальному хосту, на котором запускался Azure Storage Emulator и CosmosDB Emulator .

Azure Storage Emulator по умолчанию прослушивает 127.0.0.1 , в то время как вы можете также изменить IP свою привязку, я искал решение, которое будет работать с настройками по умолчанию.

Это также работает для подключения моего контейнера Docker к SQL Server и IIS , которые выполняются локально на моем хосте с настройками порта по умолчанию.




Edit: Я закончил разработку прототипов концепции GitHub. Выезд: https://github.com/sivabudh/system-in-a-box

Во-первых, мой ответ ориентирован на 2 группы людей: тех, кто использует Mac, и тех, кто использует Linux.

Режим сетевой сети не работает на Mac. Вы должны использовать псевдоним IP, см. https://.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 .




Я не согласен с ответом Томаслевиля.

Привязка mysql к 172.17.42.1 предотвратит использование других программ, использующих базу данных на хосте. Это будет работать только в том случае, если все пользователи базы данных задокументированы.

Привязка mysql к 0.0.0.0 откроет db для внешнего мира, что не только очень плохо, но и вопреки тому, что хочет автор оригинального вопроса. Он явно говорит: «MySql работает на локальном хосте и не подвергает порт внешнему миру, поэтому его привязка к локальному хосту»

Чтобы ответить на комментарий от ivant

«Почему бы не связать mysql с docker0?»

Это невозможно. В документации mysql / mariadb явно указано, что невозможно связать несколько интерфейсов. Вы можете привязываться только к 0, 1 или всем интерфейсам.

В качестве вывода я не нашел способа найти базу данных на хосте из контейнера докеров. Это определенно кажется очень распространенным образцом, но я не знаю, как это сделать.




CGroups и пространства имен играют важную роль в экосистеме контейнеров.

Пространство имен обеспечивает слой изоляции. Каждый контейнер работает в отдельном пространстве имен, и его доступ ограничен этим пространством имен. Cgroups управляет использованием ресурсов каждым контейнером, тогда как пространство имен контролирует, что процесс может видеть и получать доступ к соответствующему ресурсу.

Вот основное понимание подхода к решению, за которым вы могли бы следовать,

Использовать сетевое пространство имен

Когда контейнер появляется из образа, определяется и создается сетевой интерфейс. Это дает уникальному IP-адресу контейнера и интерфейсу.

$ docker run -it alpine ifconfig

Изменяя пространство имен на хост, сети котейнеров не остаются изолированными от своего интерфейса, процесс будет иметь доступ к сетевому интерфейсу хост-машин.

$ docker run -it --net=host alpine ifconfig

Если процесс прослушивает порты, они будут прослушиваться на интерфейсе хоста и отображаться в контейнере.

Использование пространства имен PID Изменяя пространство имен Pid, ​​контейнер может взаимодействовать с другим процессом за пределами его обычной области.

Этот контейнер будет работать в своем собственном пространстве имен.

$ 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 Machine: -

Выполните команду ниже, чтобы случайно открыть порт докера в течение времени сборки

$docker run -d --name MyWebServer -P mediawiki

В приведенном выше списке контейнеров вы можете увидеть порт, назначенный как 32768. Попробуйте получить доступ

localhost:32768 

Вы можете увидеть страницу mediawiki




Ни один из ответов не помог мне при использовании Docker Toolbox в Windows 10 Home, но 10.0.2.2 сделал это, поскольку в docker-toolbox используется VirtualBox, который предоставляет хост VM на этом адресе.






Related