2016-10-31 1 views
13

Я читаю docker API и пытаюсь создать простой контейнер и выставить 1 порт.Открыть контейнерный порт для хоста с помощью Docker для Windows в Windows 10

В моем примере, у меня есть приложение, которое прослушивать TCP порт 9595 внутри контейнера, и я хочу, чтобы получить доступ к нему из внешнего мира (то есть хозяин контейнера) на порту 9090.

При создании контейнера у меня есть "ExposedPorts": { "9595/tcp: {}" } и "PortBindings": { "9595/tcp": [{ "HostPort": "9090" }] }.

Итак, если я получаю доступ с Host machine http://container_internal_ip:9595, он работает! Тем не менее, когда я достигаю http://localhost:9090, что я ожидаю, используя эту функцию, карту порта, он не работает ...

Во время работы docker port containerID я имею 9595/tcp -> 0.0.0.0:9090 и что должны средства, when connecting to any IP on the host, at port 9090, forward to the container in port 9595.

Итак, что здесь не так? Почему я не могу подключиться к 9090?

Я ценю любые разъяснения.

+0

Вопрос не имеет достаточно информации. Нам нужна, по крайней мере, команда докера, какое изображение используется или файл Docker. Контейнеры Windows или контейнеры Linux? –

+0

** Docker Remote API ** против какого докерного двигателя? Контейнеры Windows? Контейнер Linux? Вы не можете запустить контейнер без базового изображения. Какое изображение? Вы назвали ** Docker Remote API **, как вы его назвали? Это правильно? Какую команду вы использовали? Я не могу ** ЗНАЮ ** о том, что вы спрашиваете, если вы не даете ** ДОСТАТОЧНО ** информацию. –

+0

Извините, я не хотел быть грубым Карлосом, но ни один из ваших комментариев не имел отношения к вопросу. Не имеет значения, каков образ. Важно то, что согласно документации API, у меня есть порт 9090, который находится вне контейнера и отображается на порт 9595 внутри контейнера, и это не работает.Netsh ничего не повлияет на поведение или конфигурацию контейнера. –

ответ

3

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

Вам нужна специальная обработка, если вы используете Docker Toolbox или Docker для Windows. Вы должны увидеть localhost без проблем (если ваш контейнер Linux). Если вы хотите, чтобы контейнер был виден снаружи, попробуйте это с надземной Power Shell:

netsh interface portproxy add v4tov4 listenaddress=yourip listenport=9090 connectaddress=10.0.75.1 connectport=9090 

Если контейнер для Windows, однако вы не увидите LOCALHOST и вам нужно использовать контейнер внутренний адрес:

docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" <cointainerid> 

Ссылка: https://blog.docker.com/2016/09/build-your-first-docker-windows-server-container/

С уважением

+0

Привет, Карлос, да, я использую последний докер для бета-версии Windows на win10 и 'docker info' return' "ServerVersion": "1.12.2-cs2-ws-beta" 'И согласно Docker API v1.24 (https : //docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#create-a-container), 'PortBindings' действительно существуют. –

+0

Вам необходимо дополнительное перенаправление портов для докеров для Windows. Я обновлю ответ –

+0

На самом деле я использовал 'docker inspect'. Он объясняет разницу в номенклатуре. –

2

порт действительно является как и ожидалось, он оказался недоступным из самой машины-контейнера на интерфейсе loopback (localhost или 127.0.0.1) из-за ограничения существующих сетей Windows. Вместо того, чтобы пытаться получить к нему доступ через интерфейс loopback на хосте контейнера, попробуйте получить доступ к нему с другого компьютера в сети, используя IP-адрес контейнера и контейнерный номер порта.

Существует хорошая рецензия для этого на https://blog.sixeyed.com/published-ports-on-windows-containers-dont-do-loopback/

Смежные вопросы