Привязка порта контейнера Windows не работает в Windows Server 2016 (с использованием Docker)

Я использую контейнер Windows с помощью Docker на хосте Windows (Windows Server 2016). Я хочу привязать его к порту хоста 8000 и запустить контейнер следующим образом:

docker run -d -p 8000:8000 474614/my_repo:javaprogram

Версия докера:

PS C:\Users\Administrator> docker version
Client:
 Version:      17.03.1-ee-3
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   3fcee33
 Built:        Thu Mar 30 19:31:22 2017
 OS/Arch:      windows/amd64

Server:
 Version:      17.03.1-ee-3
 API version:  1.27 (minimum version 1.24)
 Go version:   go1.7.5
 Git commit:   3fcee33
 Built:        Thu Mar 30 19:31:22 2017
 OS/Arch:      windows/amd64
 Experimental: false

Насколько я понимаю, поскольку я запускаю докер «изначально» с сервера Windows с контейнером Windows, между ними нет промежуточной виртуальной машины (без докер-машины), поэтому «хост» — это фактический сервер Windows, на котором я запускаю докер.

Итак, мой вопрос: почему не работает привязка порта хоста? Почему я не могу связаться с хостом?

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

netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=8000 connectaddress="MY_HOST_IP" connectport=8000

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

netstat на хосте

PS C:\Users\Administrator> netstat -ab | findstr ":80"
  TCP    0.0.0.0:80             MYCOMPUTER:0      LISTENING
  TCP    127.0.0.1:8000         MYCOMPUTER:0     LISTENING
  TCP    [::]:80                MYCOMPUTER:0      LISTENING
PS C:\Users\Administrator>

netstat для контейнера

PS C:\Users\Administrator> netstat -ab | findstr ":80"
  TCP    0.0.0.0:80             MYCOMPUTER:0      LISTENING
  TCP    127.0.0.1:8000         MYCOMPUTER:0     LISTENING
  TCP    [::]:80                MYCOMPUTER:0      LISTENING
PS C:\Users\Administrator>

но когда я пытаюсь получить доступ к localhost:8000 или 127.0.0.1:8000 с моего хост-компьютера, я получаю сообщение об ошибке ниже

This site can’t be reached

PS C:\Users\Administrator> docker run 474614/my_repo:javaprogram
Hello Java

когда я запускаю изображение, я получаю вышеуказанный результат. я пытаюсь просмотреть результат через браузер, и как мне это сделать? Можно ли назначить ip в файле докера при создании образа докера? если так, пожалуйста, помогите мне с образцом dockerfile или любой совет по этому поводу будет полезен. Заранее спасибо


person syndy1989    schedule 29.06.2017    source источник


Ответы (3)


Я являюсь руководителем проекта в группе Microsoft Windows Core Networking. Этот ответ правильный (хотя я не могу проголосовать за него). Мы добавим поддержку связи с локальным хостом в следующем выпуске Windows Semi-Annual Channel (SAC) (нацеленный на второй квартал 2018 г.). Вы можете подписаться на получение инсайдерских сборок (до официального GA), и эта функциональность должна быть включена в эти сборки в ближайшие несколько недель.

person JMesser81    schedule 25.10.2017
comment
Было ли это задумано как комментарий к другому ответу? - person Goose; 25.10.2017
comment
Большое спасибо за вашу информацию. Кстати, удалите этот ответ и опубликуйте его как комментарий к существующему ответу (правило Stackoverflow). - person VibeeshanRC; 16.04.2019

Это ошибка в текущей реализации сети в Windows. (https://docs.microsoft.com/en-us/virtualization/community/team-blog/2016/20160525-windows-nat-winnat-capabilities-and-limitations)

Доступ к внутренним конечным точкам непосредственно с хоста. К внутренним конечным точкам, назначенным виртуальным машинам или контейнерам, нельзя получить доступ с помощью внешних IP-адресов/портов, указанных в статических сопоставлениях портов NAT, непосредственно с хоста NAT. С хоста NAT эти внутренние конечные точки должны быть адресованы напрямую по их внутреннему IP-адресу и портам. Например, предположим, что конечная точка контейнера имеет IP-адрес 172.16.1.100 и работает веб-сервер, который прослушивает порт 80. Кроме того, предположим, что сопоставление портов было создано с помощью докера для пересылки трафика с полученного IP-адреса хоста (10.10.50.20). через TCP-порт 8080 к конечной точке контейнера. В этом случае пользователь на узле контейнера не может получить прямой доступ к веб-серверу, используя внешние сопоставленные порты. например Пользователь, работающий на хосте контейнера, не может косвенно получить доступ к веб-серверу контейнера на http://10.10.50.20:8080. . Вместо этого пользователь должен получить прямой доступ к веб-серверу контейнера по адресу http://172.16.1.100:80.

Единственное предостережение в отношении этого ограничения заключается в том, что к внутренней конечной точке можно получить доступ с использованием внешнего IP-адреса/порта из отдельной конечной точки виртуальной машины/контейнера, работающей на том же узле NAT: это называется закреплением волос. Например. Пользователь, работающий в контейнере A, может получить доступ к веб-серверу, работающему в контейнере B, используя внутренний IP-адрес и порт http://10.10.50.20:8080.

person Gregory Suvalian    schedule 29.06.2017
comment
Это не работает для меня. Перепробовал все варианты: ‹IP-адрес контейнера›:8080 ‹IP-адрес контейнера›:80 ‹IP-адрес хоста›:8080 - person alexrait; 12.01.2020

Просто убедитесь, что ваш package.json включает эти параметры в запись "ng serve"...

нг служить

person user11017028    schedule 05.02.2019