Вопрос, связанный с работой docker контейнеров в сети - PullRequest
1 голос
/ 25 апреля 2020

Когда мы открываем порты через docker, его сетевой путь выглядит следующим образом:

Docker поток сети контейнера

Поэтому, когда я запускаю свой контейнер с помощью команды ниже

docker run --rm -it --name server -p 45678:45678 ubuntu:14.04 bash

Здесь мы в основном отображаем внешний хост-порт: с правильным внутренним портом контейнера?

Теперь внутри вышеуказанного контейнера Если я запускаю netcat для прослушивания порт 45678; Тогда любой контейнер должен быть в состоянии соединиться с ним, используя nc <my-windows-hostname> 45678 верно? Однако это не работает.

Я прочитал об этом и обнаружил, что нам нужно использовать host.docker.internal вместо windows -hostname.

Мой вопрос: почему так?

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Docker для Windows (и Docker для Ma c) использует виртуальную машину с ядром Linux для обеспечения среды выполнения для контейнеров linux.

Это означает, что Контейнеры работают на отдельном хосте (с другим именем и IP-адресом), чем ваш windows хост, как описано ниже на иллюстрации ниже

|--------------------------------------------------------|
|  Windows host     |----------------------------------| |
|                   | Docker VM                        | |
|  docker cli       | |-------------|  |-------------| | |
|                   | | ContainerA  |  | ContainerB  | | |
|                   | |             |  |             | | |
|                   | |-------------|  |-------------| | |
|                   |----------------------------------| |
|--------------------------------------------------------|

* * * * * * * * docker cli работает на windows, но все контейнеры работают внутри Docker VM.

При запуске команды docker run --rm -it --name containerA -p 45678:45678 ubuntu:14.04 bash порт 45678 на виртуальной машине Docker перенаправляется на порт 45678 в контейнере A.

Кроме того, CLI Docker обеспечивает переадресацию порта 45678 на хосте windows на виртуальную машину Docker. Результатом этого является то, что когда вы используете localhost:45678 или <my-windows-hostname>:45678 с вашего windows компьютера, вы окажетесь в контейнере по цепочке:

<my-windows-hostname>:45678 -> <docker VM>:45678 -> ContainerA:45678

То, что вы пытаетесь сделать, это получить доступ к другому контейнеру через опубликованный порт из другого контейнера , а не хоста windows. Для этого вам потребуется внутреннее имя хоста или IP-адрес виртуальной машины Docker, а не хост windows. Это то, что вы можете использовать host.docker.internal для.

Из Docker для Windows Документация

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

Это для целей разработки и не будет работать в производственной среде за пределами Docker Desktop для Windows.

0 голосов
/ 25 апреля 2020

При запуске Docker автоматически создается мостовая сеть по умолчанию (также называемая мостом), и вновь запускаемые контейнеры подключаются к ней, если не указано иное.

Поэтому, когда вы запустили свой контейнер, он был подключен к мостовой сети по умолчанию.

Кроме того, контейнеры в мостовой сети по умолчанию могут получать доступ друг к другу только по IP-адресам, если вы не используете * Параметр 1005 *, который считается устаревшим.

Что делает host.docker.internal, так это разрешает внутренний IP-адрес, используемый хостом (который часто меняется).

Ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...