Docker в Windows: как подключиться к контейнеру с хоста, используя IP-адрес контейнера?

у меня есть

  • Windows 10
  • Docker для Windows V. 1.12.5 Rev. 9503, который больше не зависит от boot2docker или VirtualBox.

У меня есть несколько экземпляров JBoss, работающих в образах Docker (172.18.0.2 — это база данных):

  • экземпляр 1: имя: jboss-eap, IP: 172.18.0.3
  • экземпляр 2: имя: jboss-eap-arquillian, IP: 172.18.0.4

которые будут работать одновременно. Каждый экземпляр JBoss экспортирует, например. его порты 8787, 8080 и 8443.

Я также создал мостовую сеть: docker network create --driver bridge --subnet 172.18.0.0/24 bridged_network

В настоящее время я настроил переадресацию локального порта, чтобы хост мог получать доступ к различным службам с помощью префикса (например, при доступе к порту 8080 экземпляра 1 хост использует localhost: 28080 для подключения). Но это довольно подвержено ошибкам.

Теперь я хочу получить доступ к этим портам с хоста, используя IP-адрес контейнера, например. вызов 172.18.0.4:8080 (следующий шаг: использование имени хоста: jboss-eap-arquillian:8080). Хотя это работает гладко от контейнера к контейнеру, я не смог настроить его для подключения с хоста.

Есть сетевой интерфейс Windows (типа: DockerNAT), имеющий IP 10.0.75.1, но, возможно, я создал его вручную (не уверен... уже довольно давно пытаюсь). Но это полезно при привязке порта контейнера к этому устройству, например. запуск докера... -p 10.0.75.1:8080:8080. Затем я могу вызвать службу, используя 10.0.75.1:8080, но это не поможет мне для второго контейнера.

Я также пытался использовать хост-сетевое устройство Docker, но это a. кажется, работает только для одной машины b. Я не могу статически установить IP-адрес, который необходим для тестов JUnit, выполняющих статическую конфигурацию. Примечание. Я не могу полагаться на сетевой DHCP для назначения IP-адреса при запуске, поскольку я часто меняю свою сеть (и, следовательно, DHCP), что снова приводит к незафиксированному IP-адресу.

Итак, в основном я ищу способ настроить сеть/контейнер таким образом, чтобы я мог вызывать службу, предоставляемую контейнером (например, через порт 8080), используя IP-адрес контейнера (например, 172.18.0.3, например 1) с хоста по адресу 172.18.0.3:8080.


person kniffte    schedule 30.12.2016    source источник
comment
Вы знаете, это не способ докера и нарушает переносимость. Кажется, вам нужна виртуальная машина, почему бы просто не использовать виртуальную машину?   -  person user2105103    schedule 30.12.2016


Ответы (2)


В докере для Windows вы можете использовать адрес 10.0.75.1:8080, но вам нужно настроить брандмауэр, лучше использовать адрес 10.0.75.2:8080,

для обоих адресов вы должны опубликовать свой порт при запуске контейнера

docker run -p 8080:8080 image_name

Дополнительная информация https://github.com/docker/for-win/issues/334#issuecomment-297030101

person hrakup    schedule 03.05.2017
comment
Это помогло мне, но уточню немного: флаг -p сопоставляет порты с хоста на контейнер. В примере это один и тот же порт. Первый — это порт на хосте, второй — порт на контейнере. Например, чтобы запустить контейнер Redis на порту 8083, вы вызываете его следующим образом: docker run -p 8083:6379 redis. Вы говорите, что все, что приходит на мой «внешний» хост-компьютер через порт 8083, должно быть перенаправлено в этот контейнер через порт 6379 (который является стандартным портом для Redis). - person Deane; 29.06.2018

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

см. мой тот же вопрос здесь: https://forums.docker.com/t/access-dockerized-services-via-the-containers-ip-address/21151

и мое понимание того, как это работает, здесь: https://derickbailey.com/2016/08/29/so-youre-saying-docker-isnt-a-virtual-machine/

если вам нужно использовать приложение, размещенное в контейнере, с вашего локального хоста, укажите порт приложения с параметром -p для docker run

docker run -p 8080:8080 image_name

а затем подключитесь к localhost:8080 для этой службы

person Derick Bailey    schedule 30.12.2016
comment
Если он использует контейнеры Linux, докер запускается на виртуальной машине. Он запускает крошечный дистрибутив Linux в Hyper-V. - person Andrew T Finnell; 16.03.2018
comment
у меня есть доступ к IP-адресам контейнера докеров: 172.17.0.x, проверено на виртуальных машинах Google Cloud - person datdinhquoc; 29.05.2020
comment
но не могу получить доступ к 172.17.0.x в Windows, как странно - person datdinhquoc; 29.05.2020