Привязка портов контейнера Windows в Windows Server 2016 не работает

3236
Mathias Conradt

Я бегу Контейнер для Windows на хосте Windows, (Windows Server 2016 ТР4) .

Контейнер должен запускать веб-сервер IIS на внутреннем порту 80, и я также хочу привязать порт 80 к хосту, чтобы я мог связаться с ним через IP / URL хоста.

Я следовал инструкциям от Microsoft на

Я попробовал оба подхода через Powershell и Docker, и в обоих случаях привязка порта к хосту не работает.

========================= Powershell подход ======================= ===

Развертывание хоста контейнера в существующей системе (Windows Server 2016 TP4)

PS C:> wget -uri https://aka.ms/tp4/Install-ContainerHost -OutFile C:\Install-ContainerHost.ps1  PS C:> powershell.exe -NoProfile C:\Install-ContainerHost.ps1  Querying status of Windows feature: Containers... Feature Containers is already enabled. Waiting for Hyper-V Management... Networking is already configured. Confirming configuration... Getting Container OS image (NanoServer) version 10.0.10586.0 from OneGet (this may take a few minutes)... Container base image install complete. Querying container images... OS image (NanoServer) is already installed. The following images are present on this machine: ContainerImage (Name = 'NanoServer') [Publisher = 'CN=Microsoft', Version = '10.0.10586.0'] ContainerImage (Name = 'WindowsServerCore') [Publisher = 'CN=Microsoft', Version = '10.0.10586.0']  Docker is already installed. Stopping Docker... Starting Docker... Tagging new base image (8572198a60f1)... Base image is now tagged: nanoserver 10.0.10586.0 8572198a60f1 5 months ago 0 B nanoserver latest 8572198a60f1 5 months ago 0 B Script complete! 

Подготовка образа и контейнера с IIS (на основе образа WindowsServerCore)

Именно эти шаги описаны в документации Microsoft по адресу https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/manage_powershell . Я создаю контейнер из WindowsServerCore, устанавливаю на него IIS и создаю из него новый образ, который затем могу использовать повторно.

PS C:> Get-ContainerImage  Name Publisher Version IsOSImage ---- --------- ------- --------- NanoServer CN=Microsoft 10.0.10586.0 True WindowsServerCore CN=Microsoft 10.0.10586.0 True   PS C:\> New-Container -Name TP4Demo -ContainerImageName WindowsServerCore -SwitchName "Virtual Switch"  Name State Uptime ParentImageName ---- ----- ------ --------------- TP4Demo Off 00:00:00 WindowsServerCore   PS C:\> Get-Container  Name State Uptime ParentImageName ---- ----- ------ --------------- TP4Demo Off 00:00:00 WindowsServerCore   PS C:\> Start-Container -Name TP4Demo  PS C:\> Enter-PSSession -ContainerName TP4Demo -RunAsAdministrator [TP4Demo]: PS C:\Windows\system32> Install-WindowsFeature web-server  Success Restart Needed Exit Code Feature Result ------- -------------- --------- -------------- True No Success   Windows IP Configuration  Ethernet adapter vEthernet (Virtual Switch-30179F35-A9BD-4231-B264-BDD2994BD956-0):  Connection-specific DNS Suffix . : Link-local IPv6 Address . . . . . : fe80::24f4:c726:ed9b:e603%28 IPv4 Address. . . . . . . . . . . : 172.16.0.2 Subnet Mask . . . . . . . . . . . : 255.240.0.0 Default Gateway . . . . . . . . . : 172.16.0.1 

Добавление сопоставления портов и правила брандмауэра:

PS C:\> if (!(Get-NetNatStaticMapping | where {$_.ExternalPort -eq 80}))   PS C:\> if (!(Get-NetFirewallRule | where {$_.Name -eq "TCP80"}))  

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

Но привязка порта хоста не работает. Я не могу связаться с IIS через IP-адреса хоста и связанный порт через http: // localhost: 80 /, ни http://172.16.0.1:80/, ни http://10.10.0.79:80/

PS C:\> wget http://10.10.0.79:80/ wget : Unable to connect to the remote server At line:1 char:1 + wget http://10.10.0.79:80/ + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand  PS C:\> wget http://172.16.0.1:80/ wget : Unable to connect to the remote server At line:1 char:1 + wget http://172.16.0.1:80/ + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand 

Я могу получить доступ к странице по умолчанию IIS только через IP-адрес контейнера ( http://172.16.0.2:80 ).

========================= Докер подход ======================= ===

И это мой подход с использованием Docker для управления контейнером:

C:\> docker run --name iisbase -it windowsservercore cmd C:\> powershell.exe Install-WindowsFeature web-server C:\> exit PS C:\Windows\system32> docker commit iisbase windowsservercoreiis 64271b60a1c4af29ce37ebcee45b00d824883eb67c717d4cee765d9f696867bb C:\> powershell.exe "if(!(Get-NetFirewallRule | where {$_.Name -eq 'TCP80'})) { New-NetFirewallRule -Name 'TCP80' -DisplayName 'HTTP on TCP/80' -Protocol tcp -LocalPort 80 -Action Allow -Enabled True }" C:\> docker run --name iisdemo -it -p 80:80 windowsservercoreiis cmd 

В конце концов, я могу достичь IIS только через IP-адрес контейнера, а не через IP-адрес хоста.

Я использую Docker версии 1.10.0-dev, сборка 18c9fe0.

5
Билеты, созданные в Docker https://github.com/docker/docker/issues/21558 и документация по виртуализации Microsoft: https://github.com/Microsoft/Virtualization-Documentation/issues/181 Mathias Conradt 8 лет назад 0

2 ответа на вопрос

1
Mathias Conradt

Кажется, проблема с Windows Server TP4.

Стефан Шерер из команды Docker ответил на мою проблему: https://github.com/docker/docker/issues/21558#issuecomment-202536462

Я могу воспроизвести проблемы @mathiasconradt. Играл с приложением для голосования на прошлой неделе с TP4, у меня есть тот же обходной путь: открытие портов брандмауэра на хосте, открытие URL веб-сервера с IP-адресами контейнера. Не могу дождаться, чтобы проверить приложение для голосования на TP5.

В ожидании TP5 ... тем временем я использую Apache httpd на хосте для обработки переадресации портов.

TP5 должен быть доступен примерно через 7 часов, не так ли? Falco Alexander 8 лет назад 0
@FalcoAlexander Я не знаю, откуда ты взял эту информацию? Также интересует дата выхода. Я погуглил по нему, увидел https://twitter.com/wzornet/status/701532616839847937 который уже пройден. Mathias Conradt 8 лет назад 0
Конференция Build 2016 (в SF) стартует через 7 часов. обычно это событие для распространения новых релизов. Я предполагаю: VisualStudio и TFS 2015 Update 2, новая Windows 10 Release 1603 и Server 2016 TP5. Falco Alexander 8 лет назад 1
мои плохие ... неправильные спекуляции ...: / Falco Alexander 8 лет назад 0
0
harrymc

Note: Finally this is found to be a bug in Windows Server 2016 TP4 that causes the behavior described below (see the comments). Even though the Docker Daemon is supposedly installed, the client seems to be used instead with all the limitations described below. This bug may be fixed in the future TP5.


This is a limitation of the Docker implementation on Windows, where you cannot connect to the container through the host.

This is the answer for this same question on bug report #15740 : port exposure on windows = ? :

The reason you're having this, is because on Linux, the docker daemon (and your containers) run on the Linux machine itself, so "localhost" is also the host that the container is running on, and the ports are mapped to.

On Windows (and OS X), the docker daemon, and your containers cannot run natively, so only the docker client is running on your Windows machine, but the daemon (and your containers) run in a VirtualBox Virtual Machine, that runs Linux.

To connect to the container, you must connect to the IP-address of the virtual machine, not of your Windows computer.

This is all described in the Windows installation documentation, found here; http://docs.docker.com/installation/windows/.

The Virtual Machine is described in this section;
http://docs.docker.com/installation/windows/#learn-the-key-concepts-before-installing

And an explanation on how to map ports, and connect to them is explained here;
http://docs.docker.com/installation/windows/#container-port-redirection

I'm going to close this issue, because this is not a bug, and explained in the documentation. I hope the above explanation helps you.

Спасибо за ссылку, но связанный билет GitHub относится к Windows 7 (или любому Windows Server до Windows 2016), а в ответе на билет говорится: «В Windows (и OS X) демон docker и ваши контейнеры не могут работать в исходном режиме. , поэтому на вашем компьютере с Windows работает только докер-клиент, но демон (и ваши контейнеры) работают на виртуальной машине VirtualBox, на которой работает Linux. "; это справедливо для Windows7, но не должно иметь место для Windows 2016, где контейнеры могут работать изначально. Mathias Conradt 8 лет назад 1
Также обратите внимание на комментарий thaJeztah на странице github, на которую вы ссылаетесь: «Идет работа над собственным Docker Engine на Windows Server 2016, но этот механизм будет запускать только приложения Windows, а не Linux» <- это то, что я пытаюсь делай и используй. Mathias Conradt 8 лет назад 1
Но вы спрашиваете о Docker, который не разработан Microsoft. Для бесшовной интеграции с Windows вы должны использовать технологию Windows, то есть контейнеры Windows и контейнеры Hyper-V, а не Docker. harrymc 8 лет назад 0
Я знаю, что Docker не разработан MS, я использую его для Linux Containers без проблем. Согласно документации Microsoft, Docker должен работать на Win2016 так же, как контейнеры Windows. Я явно избегаю Hyper-V, чтобы между ними не было виртуальной машины. Я попробую подход Windows Containers, но предпочел бы использовать Docker, поскольку я использую его и вне мира Windows. Mathias Conradt 8 лет назад 0
Различия наверняка исчезнут в будущем. Текущую ситуацию см., Например, в этой статье: [Docker Engine для Windows Server 2016] (https://www.sumologic.com/2015/11/05/docker-engine-for-windows-server/). Я предполагаю, что Microsoft должна стремиться к полной интеграции с Docker, возможно, даже в выпускной версии WS2016. harrymc 8 лет назад 0
Спасибо за ссылку на статью. Теперь я попробовал подход, используя powershell вместо docker, следуя пошаговой документации, но все же не повезло. Смотрите мое обновление выше («ОБНОВЛЕНИЕ (Использование powershell вместо Docker)») Mathias Conradt 8 лет назад 0
Как ни странно, одному парню удалось сделать это уже с PowerShell в WS2016 TP3. Смотрите его [пошаговый аккаунт] (http://www.aidanfinn.com/?p=18911). Вы можете попытаться скопировать именно его команды. harrymc 8 лет назад 0
Я следовал за шагами в своей статье. Это все еще не работает. Тем не менее, следует упомянуть одну вещь: у него, похоже, другие диапазоны IP-адресов его виртуального коммутатора vEthernet (и Ethernet0), чем у меня. Не уверен, что это из-за TP3 против TP4. В своем блоге он написал: «Примечание. В этот момент создается хост виртуальной машины с работающим виртуальным коммутатором NATing с диапазоном IP-адресов 192.168.250.0/24», но по умолчанию MS-Install-ContainerHost.ps1 обычно устанавливает виртуальный коммутатор. Диапазон IP-адресов до 172.16.0.0/16. Вроде поменял местами, если только он не изменил конфигурацию по умолчанию, меня немного смущает. Оставил ему комментарий под своей статьей. Mathias Conradt 8 лет назад 0
Конечно, я запускал команды в его статье, адаптированные к моим IP-адресам и т. Д. Без успеха :( Mathias Conradt 8 лет назад 0
Кстати, сервис демона Docker запущен? harrymc 8 лет назад 0
Да, демон Docker работает как служба. Кстати: когда я попробовал Docker, я следовал инструкциям из документации MS, и я просто вижу, что статья последний раз обновлялась вчера, 27.03., поэтому для TP4 должно быть допустимо использовать Docker описанным там способом. https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/manage_docker Mathias Conradt 8 лет назад 0
Я пробовал tp4 на виртуальной машине, но застрял из-за отсутствия поддержки виртуализации. Насколько я вижу, это должно работать на физической машине. Вы можете попытать счастья в [форуме по контейнерам Windows] (https://social.msdn.microsoft.com/Forums/en-US/home?forum=windowscontainers), где может ответить инженер MS. Если вы это сделаете, я предлагаю вам значительно уменьшить ваш вопрос, просто перечислив команды PowerShell и их результаты. Кстати - вы пытались telnet для хоста: 8080? harrymc 8 лет назад 0
Я упростил свой пост и просто пошагово выводил результаты моего подхода PowerShell. Я также проверю форум Windows Container Forum; Ранее я уже нашел ошибку в контейнере Windows, касающуюся другой проблемы, о которой я сообщил, и которая была одобрена одним из инженеров MS. Может быть, это еще один. Telnet: у меня нет команды `telnet`, я сделал` wget`, см. Обновленную запись (невозможно подключиться к удаленному серверу). Я также отправил два билета в github Docker и MS Virtualization, возможно, я тоже получу ответ. Mathias Conradt 8 лет назад 0
Это действительно может быть регрессия TP4, по крайней мере, сетевая кодовая база была перемещена - см. Комментарий здесь: https://github.com/docker/docker/issues/21558#issuecomment-202165532. Я думаю, я буду ждать TP5 или ответа от команды Docker / MS. А пока я буду использовать Apache httpd на хосте в качестве обратного прокси-сервера и переадресовывать через него порт. Это должно сделать то, что я пытаюсь достичь. Mathias Conradt 8 лет назад 0
Стефан Шерер из команды Docker смог воспроизвести мою проблему на TP4: https://github.com/docker/docker/issues/21558#issuecomment-202536462 Mathias Conradt 8 лет назад 0
Я думаю, у вас есть хороший шанс, что это будет работать правильно в ближайшем будущем. Контейнеры - захватывающий предмет, даже если еще не совсем зрелый. harrymc 8 лет назад 0
До сих пор контейнеры работали с Ubuntu нормально, только на Win2016 встроенная поддержка довольно нова. Но, безусловно, отличная помощь для развертывания приложений. Ждем финального релиза. Спасибо за вашу помощь относительно моего вопроса. Mathias Conradt 8 лет назад 0
Вы можете взглянуть на [WinDocks] (http://www.windocks.com/). harrymc 8 лет назад 0
Спасибо за ссылку. Веб-сайт / проект не кажутся мне слишком заслуживающими доверия (за этим нет никакой официальной организации, веб-сайт выглядит немного старомодным, в своих документах они ссылаются на Docker 1.7 - текущая версия 1.11). Проблема с портами не так критична, я бы предпочел придерживаться официальных документов Docker и Microsoft. Не чувствует, что WinDock будет долго. Mathias Conradt 8 лет назад 0