Windows-Containerportbindung unter Windows Server 2016 funktioniert nicht

3346
Mathias Conradt

Ich führe einen Windows-Container auf einem Windows-Host (Windows Server 2016 TP4) aus .

Der Container soll intern einen IIS-Webserver auf Port 80 ausführen, und ich möchte auch Port 80 an den Host binden, damit ich ihn über die Host-IP / URL erreichen kann.

Ich folgte den Anweisungen von Microsoft weiter

Ich habe sowohl den Ansatz über Powershell als auch Docker ausprobiert, und in beiden Fällen funktioniert die Port-Bindung zum Host nicht.

========================== Powershell-Ansatz ======================== ===

Bereitstellen des Containerhosts auf einem vorhandenen System (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! 

Image und Container mit IIS vorbereiten (basierend auf WindowsServerCore-Image)

Dies sind die genauen Schritte, die in der Microsoft-Dokumentation unter https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/manage_powershell beschrieben sind . Ich erstelle aus WindowsServerCore einen Container, installiere IIS und mache daraus ein neues Image, das ich später wiederverwenden kann.

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 

Port-Mapping und Firewall-Regel hinzufügen:

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

Nachdem ich nun die Portzuordnung (und die Firewall-Regel) hinzugefügt habe, sollte ich den IIS über meinen Host erreichen können. (Nur um sicherzugehen, habe ich die Firewall auf dem Host vollständig deaktiviert.)

Die Host-Port-Bindung funktioniert jedoch nicht. Ich kann den IIS nicht über die Host-IPs und den gebundenen Port über http: // localhost: 80 / oder http://172.16.0.1:80/ oder http://10.10.0.79:80/ erreichen.

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 

Ich kann die IIS-Standardseite nur über die Container-IP ( http://172.16.0.2:80 ) erreichen.

=========================== Docker-Ansatz ======================== ===

Und dies ist mein Ansatz, der Docker zur Verwaltung des Containers verwendet:

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 

Am Ende kann ich den IIS nur über die Container-IP erreichen, nicht über die Host-IP.

Ich verwende Docker Version 1.10.0-dev, Build 18c9fe0.

5
Tickets, die unter Docker https://github.com/docker/docker/issues/21558 und der Dokumentation zur Microsoft Virtualization erstellt wurden: https://github.com/Microsoft/Virtualization-Documentation/issues/181 Mathias Conradt vor 8 Jahren 0

2 Antworten auf die Frage

1
Mathias Conradt

Scheint ein Problem mit Windows Server TP4 zu sein.

Stefan Scherer vom Docker-Team antwortete auf meine gemeldete Ausgabe: https://github.com/docker/docker/issues/21558#issuecomment-202536462

Ich kann die Probleme von @mathiasconradt reproduzieren. Ich habe die letzte Woche mit der Voting-App mit TP4 gespielt und habe die gleiche Problemumgehung: Firewall-Ports auf dem Host öffnen, Webserver-URL mit den IP-Adressen des Containers öffnen. Ich kann es kaum erwarten, die Voting-App auf TP5 zu testen.

Warten auf TP5 ... Inzwischen verwende ich Apache httpd auf dem Host, um die Portweiterleitung zu bearbeiten.

TP5 sollte in etwa 7 Stunden verfügbar sein, oder? Falco Alexander vor 8 Jahren 0
@FalcoAlexander Ich weiß nicht, woher hast du diese Informationen? Auch am Veröffentlichungsdatum interessiert. Ich habe gegoogelt und habe https://twitter.com/wzornet/status/701532616839847937 gesehen, die bereits bestanden ist. Mathias Conradt vor 8 Jahren 0
Die Build 2016 (in SF) -Konferenz beginnt in 7 Stunden. Dies ist normalerweise ein Ereignis zum Verteilen neuer Versionen. Ich denke: VisualStudio und TFS 2015 Update 2, neues Windows 10 Release 1603 und Server 2016 TP5. Falco Alexander vor 8 Jahren 1
meine schlechten ... falschen Spekulationen ...: / Falco Alexander vor 8 Jahren 0
0
harrymc

Hinweis: Schließlich ist dies ein Fehler in Windows Server 2016 TP4, der das nachfolgend beschriebene Verhalten verursacht (siehe Kommentare). Obwohl der Docker-Daemon angeblich installiert ist, scheint der Client stattdessen mit allen unten beschriebenen Einschränkungen verwendet zu werden. Dieser Fehler kann im zukünftigen TP5 behoben werden.


Dies ist eine Einschränkung der Docker-Implementierung unter Windows, bei der Sie über den Host keine Verbindung zum Container herstellen können.

Dies ist die Antwort auf die gleiche Frage im Fehlerbericht # 15740: Port Exposure unter Windows =? :

Der Grund dafür ist, dass unter Linux der Docker-Daemon (und Ihre Container) auf dem Linux-Computer selbst ausgeführt werden. "Localhost" ist also auch der Host, auf dem der Container ausgeführt wird, und die Ports werden zugeordnet.

Unter Windows (und OS X) können der Docker-Daemon und Ihre Container nicht nativ ausgeführt werden. Daher wird nur der Docker-Client auf Ihrem Windows-Computer ausgeführt, der Daemon (und Ihre Container) jedoch auf einer virtuellen VirtualBox-Maschine, auf der Linux ausgeführt wird.

Um eine Verbindung zum Container herzustellen, müssen Sie eine Verbindung mit der IP-Adresse der virtuellen Maschine und nicht mit Ihrem Windows-Computer herstellen.

Dies ist alles in der Windows-Installationsdokumentation beschrieben, die hier zu finden ist. http://docs.docker.com/installation/windows/ .

Die virtuelle Maschine wird in diesem Abschnitt beschrieben.
http://docs.docker.com/installation/windows/#learn-the-key-concepts-vor der Installation

Hier wird erklärt, wie Sie Ports zuordnen und eine Verbindung zu ihnen herstellen.
http://docs.docker.com/installation/windows/#container-port-redirection

Ich werde dieses Problem schließen, da dies kein Fehler ist und in der Dokumentation erläutert wird. Ich hoffe die obige Erklärung hilft dir.

Vielen Dank für den Link, aber das verknüpfte Github-Ticket bezieht sich auf Windows 7 (oder einen beliebigen Windows-Server vor Windows 2016) und die Ticket-Antwort lautet: "Unter Windows (und OS X) können der Docker-Daemon und Ihre Container nicht nativ ausgeführt werden , so dass nur der Docker-Client auf Ihrem Windows-Computer ausgeführt wird, der Daemon (und Ihre Container) jedoch auf einer virtuellen VirtualBox-Maschine ausgeführt werden, auf der Linux ausgeführt wird. "; Dies gilt für Windows7, dies sollte jedoch nicht für Windows 2016 der Fall sein, wo Container nativ ausgeführt werden können. Mathias Conradt vor 8 Jahren 1
Beachten Sie auch den Kommentar von thaJeztah auf der github-Seite, auf die Sie verlinkt haben: "Die Docker Engine wird nativ unter Windows Server 2016 ausgeführt. Diese Engine wird jedoch nur Windows-Anwendungen und nicht Linux ausführen" <- das versuche ich machen und verwenden Mathias Conradt vor 8 Jahren 1
Sie fragen jedoch nach Docker, das nicht von Microsoft entwickelt wurde. Für die nahtlose Integration mit Windows sollten Sie die Windows-Technologie verwenden, bei der es sich um Windows-Container und Hyper-V-Container handelt, nicht um Docker. harrymc vor 8 Jahren 0
Ich weiß, dass Docker nicht von MS entwickelt wurde, ich verwende es problemlos für Linux-Container. Laut Microsoft-Dokumentation sollte Docker auf Win2016 genauso wie Windows-Container arbeiten. Ich verzichte ausdrücklich auf Hyper-V, um keine VM dazwischen zu haben. Ich werde den Ansatz von Windows Containers ausprobieren, würde aber Docker vorziehen, da ich dies auch außerhalb der Windows-Welt benutze. Mathias Conradt vor 8 Jahren 0
Die Unterschiede werden in Zukunft sicherlich verschwinden. Für die aktuelle Situation siehe zum Beispiel diesen Artikel: [Docker Engine für Windows Server 2016] (https://www.sumologic.com/2015/11/05/docker-engine-for-windows-server/). Ich würde vermuten, dass Microsoft die totale Integration mit Docker anstrebte, vielleicht sogar in der Release-Version von WS2016. harrymc vor 8 Jahren 0
Danke für den Artikel-Link. Ich habe den Ansatz nun mit Powershell anstelle von Docker ausprobiert, der Dokumentation Schritt für Schritt gefolgt, aber immer noch kein Glück. Siehe mein Update oben ("UPDATE (Powershell statt Docker verwenden")) Mathias Conradt vor 8 Jahren 0
Seltsam, es scheint, als hätte ein Typ dies bereits mit der PowerShell in WS2016 TP3 erreicht. Siehe sein [schrittweises Konto] (http://www.aidanfinn.com/?p=18911). Sie könnten versuchen, genau seine Befehle zu kopieren. harrymc vor 8 Jahren 0
Ich folgte den Schritten in seinem Artikel. Es funktioniert immer noch nicht. Eine Sache ist jedoch zu erwähnen: Er scheint andere IP-Bereiche seines vEthernet / Virtual Switch (und Ethernet0) zu haben als ich. Nicht sicher, ob es sich um TP3 vs. TP4 handelt. In seinem Blog schrieb er: "Hinweis: Der VM-Host wird zu diesem Zeitpunkt mit einem funktionierenden virtuellen NAT-Switch mit einem IP-Bereich von 192.168.250.0/24 erstellt", aber der MS-Standard "Install-ContainerHost.ps1" legt normalerweise den virtuellen Switch fest IP-Bereich bis 172.16.0.0/16. Es scheint vertauscht zu sein, es sei denn, er hat die Standardkonfiguration geändert und verwirrt mich etwas. Hat ihm einen Kommentar unter seinem Artikel hinterlassen. Mathias Conradt vor 8 Jahren 0
Natürlich habe ich die Befehle in seinem Artikel angepasst, angepasst an meine IP-Adressen usw. Ohne Erfolg :( Mathias Conradt vor 8 Jahren 0
Übrigens - wurde der Docker-Daemon-Dienst gestartet? harrymc vor 8 Jahren 0
Ja, der Docker-Daemon läuft als Dienst. Übrigens: Als ich Docker ausprobierte, folgte ich den Schritten aus der MS-Dokumentation. Ich habe gerade festgestellt, dass der Artikel gestern 27.03. aktualisiert wurde. Daher sollte es für TP4 gültig sein, Docker in der dort beschriebenen Weise zu verwenden. https://msdn.microsoft.com/de-de/virtualization/windowscontainers/quick_start/manage_docker Mathias Conradt vor 8 Jahren 0
Ich habe tp4 in einer VM ausprobiert, stecke aber wegen fehlender Virtualisierungsunterstützung fest. Soweit ich sehen kann, sollte dies auf einer physischen Maschine funktionieren. Möglicherweise versuchen Sie Ihr Glück im [Windows Containers Forum] (https://social.msdn.microsoft.com/Forums/en-US/home?forum=windowscontainers), auf das ein MS-Techniker antworten kann. Wenn Sie dies tun, schlage ich vor, dass Sie Ihre Frage um ein Vielfaches reduzieren, indem Sie einfach die PowerShell-Befehle und ihre Ergebnisse auflisten. BTW - haben Sie versucht, mit dem Telnet zu kommunizieren: 8080? harrymc vor 8 Jahren 0
Ich habe meinen Beitrag vereinfacht und die Ausgabe meines Powershell-Ansatzes Schritt für Schritt eingefügt. Ich werde auch das Windows-Containerforum überprüfen. Ich habe bereits zuvor einen Fehler in Windows Container in Bezug auf ein anderes Problem gefunden, das ich gemeldet habe und von einem der MS-Ingenieure genehmigt wurde. Vielleicht ist es noch einer. Telnet: Ich habe kein `telnet`-Kommando, ich habe ein` wget` gemacht, siehe aktualisierten Post (Verbindung zum Remote-Server kann nicht hergestellt werden). Ich habe auch zwei Tickets bei Docker's und MS Virtualization eingereicht, vielleicht bekomme ich dort auch eine Antwort. Mathias Conradt vor 8 Jahren 0
Es könnte in der Tat eine Regression von TP4 sein, zumindest wurde die Netzwerk-Codebase verschoben - siehe Kommentar hier: https://github.com/docker/docker/issues/21558#issuecomment-202165532. Ich denke, ich werde auf TP5 oder eine Antwort vom Docker / MS-Team warten. In der Zwischenzeit werde ich Apache httpd auf dem Host als Reverse-Proxy verwenden und die Portweiterleitung dort durchführen. Das sollte das tun, was ich erreichen möchte. Mathias Conradt vor 8 Jahren 0
Stefan Scherer vom Docker-Team konnte meine Ausgabe auf TP4 reproduzieren: https://github.com/docker/docker/issues/21558#issuecomment-202536462 Mathias Conradt vor 8 Jahren 0
Ich denke, Sie haben gute Chancen, dass dies in naher Zukunft richtig funktioniert. Container sind ein faszinierendes Thema, auch wenn sie noch nicht ausgereift sind. harrymc vor 8 Jahren 0
Container funktionierten mit Ubuntu bisher gut für mich, nur unter Win2016 ist die native Unterstützung alles ziemlich neu. Aber auf jeden Fall eine großartige Hilfe für die App-Bereitstellung. Ich freue mich auf die endgültige Veröffentlichung. Danke für Ihre Hilfe bezüglich meiner Frage. Mathias Conradt vor 8 Jahren 0
Sie können sich [WinDocks] (http://www.windocks.com/) ansehen. harrymc vor 8 Jahren 0
Danke für den Link. Die Website / das Projekt erscheint mir jedoch nicht zu vertrauenswürdig (keine offizielle Organisation dahinter, die Website wirkt etwas altmodisch, sie verweisen in ihren Dokumenten auf Docker 1.7 - 1.11 ist die aktuelle Version). Das Port-Problem ist nicht so kritisch, ich möchte lieber das offizielle von Docker und Microsoft behalten. Hat nicht das Gefühl, dass WinDock für lange Zeit da sein wird. Mathias Conradt vor 8 Jahren 0