Windows Server 2016에서 Windows 컨테이너 포트 바인딩이 작동하지 않음


5

나는 Windows 컨테이너 ~에 Windows 호스트 (Windows Server 2016 TP4) .

컨테이너는 포트 80의 IIS 웹 서버 내부적으로하고 싶다. 포트 80을 호스트에 바인드 그래서 호스트 IP / URL을 통해 연결할 수 있습니다.

나는 마이크로 소프트의 지침을

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        {Common HTTP Features, Default Document, D...


[TP4Demo]: PS C:\Windows\system32> exit
PS C:\> Stop-Container -Name TP4Demo

PS C:\> New-ContainerImage -ContainerName TP4Demo -Name WindowsServerCoreIIS -Publisher Demo -Version 1.0

Name                 Publisher Version IsOSImage
----                 --------- ------- ---------
WindowsServerCoreIIS CN=Demo   1.0.0.0 False


PS C:\> Remove-Container -Name TP4Demo -Force

이제 IIS 컨테이너를 준비하여 "가상 스위치"에 바인딩합니다.

PS C:\> New-Container -Name IIS -ContainerImageName WindowsServerCoreIIS -SwitchName "Virtual Switch"

Name State Uptime   ParentImageName
---- ----- ------   ---------------
IIS  Off   00:00:00 WindowsServerCoreIIS


PS C:\> Start-Container -Name IIS

PS C:\> Invoke-Command -ContainerName IIS {ipconfig}

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})) {Add-NetNatStaticMapping -NatName "ContainerNat" -Protocol TCP -ExternalIPAddress 0.0.0.0 -InternalIPAddress 172.16.0.2 -InternalPort 80 -ExternalPort 80}

PS C:\> if (!(Get-NetFirewallRule | where {$_.Name -eq "TCP80"})) {New-NetFirewallRule -Name "TCP80" -DisplayName "HTTP on TCP/80" -Protocol tcp -LocalPort 80 -Action Allow -Enabled True}

이제 포트 매핑 (및 방화벽 규칙)을 추가 했으므로 호스트를 통해 IIS에 연결할 수 있어야합니다. (확실하게, 나는 호스트의 방화벽을 완전히 비활성화했다.)

그러나 호스트 포트 Y 인딩이 작동하지 않습니다. 호스트 IP 및 포트를 통해 IIS에 연결할 수 없습니다. 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

컨테이너 IP를 통해 IIS 기본 페이지에만 연결할 수 있습니다 ( http://172.16.0.2:80 ).

============= Docker 접근 ===================== ===

그리고이게 내거야. 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

결국 호스트 IP가 아닌 컨테이너 IP를 통해서만 IIS에 연결할 수 있습니다.

Docker 버전 1.10.0-dev를 사용 중이며 18c9fe0을 빌드합니다.


답변:


1

Windows Server TP4에 문제가있는 것으로 보입니다.

Docker 팀의 Stefan Scherer가보고 한 문제에 대한 답변 : https://github.com/docker/docker/issues/21558#issuecomment-202536462

@mathiasconradt의 문제를 재현 할 수 있습니다. 함께 연주 한   지난 주 TP4로 투표 - 응용 프로그램을 투표, 나는 동일한 해결 방법 : 개방   호스트의 방화벽 포트, 웹 서버 URL 열기   컨테이너의 IP 주소. TP5에서 투표 용 앱을 테스트 할 때까지 기다릴 수 없습니다.

TP5를 기다리는 중 ... 포트 포워딩을 처리하기 위해 호스트에서 Apache httpd를 사용합니다.


TP5는 약 7 시간 안에 사용할 수 있어야합니다. 그렇지 않습니까?
Falco Alexander

@FalcoAlexander 나도 몰라. 그 정보는 어디서 얻었 니? 또한 출시일에 관심이 있습니다. 나는 그것을 봤다, 톱 twitter.com/wzornet/status/701532616839847937 이미 통과되었습니다.
Mathias Conradt

1
Build 2016 (SF에서) 회의는 7 시간 만에 시작됩니다. 이것은 대개 새로운 릴리스를 배포하는 이벤트입니다. 내 생각에 : VisualStudio 및 TFS 2015 업데이트 2, 새로운 Windows 10 릴리스 1603 및 서버 2016 TP5.
Falco Alexander

내 나쁜 ... 잘못된 추측 ... : /
Falco Alexander

0

참고 : 마지막으로 이것은 Windows Server 2016 TP4의 버그로 밝혀졌습니다. 아래에서 설명하는 동작 (주석 참조). Docker Daemon이 설치되었다고해도 클라이언트는 대신 아래에 설명 된 모든 제한 사항과 함께 사용되는 것 같습니다. 이 버그는 향후 TP5에서 수정 될 수 있습니다.


이것은 Windows에서 Docker 구현의 한계이며, 여기서 호스트를 통해 컨테이너에 연결할 수 없습니다.

이것은 버그 리포트에 대한이 같은 질문에 대한 대답입니다. # 15740 : 창에서 포트 노출 =? :

당신이 이것을 가지고있는 이유는 리눅스에서, docker 데몬   (및 컨테이너)가 Linux 컴퓨터에서 실행되므로 "localhost"   컨테이너가 실행중인 호스트이며 포트는 다음과 같습니다.   에 매핑 됨.

Windows (및 OS X), docker 데몬 및 컨테이너에서   기본적으로 실행되므로 Windows에서만 도커 클라이언트가 실행 중입니다.   machine하지만 데몬 (및 컨테이너)은 VirtualBox에서 실행됩니다.   Linux를 실행하는 Virtual Machine.

컨테이너에 연결하려면 IP 주소에 연결해야합니다.   가상 컴퓨터가 아니라 Windows 컴퓨터의.

이 모든 것은 Windows 설치 설명서에서 찾을 수 있습니다.   이리; http://docs.docker.com/installation/windows/ .

이 절에서는 가상 컴퓨터에 대해 설명합니다.
http://docs.docker.com/installation/windows/#learn-the-key-concepts-before-installing

포트를 매핑하고 연결하는 방법에 대한 설명은 다음과 같습니다.   여기에 설명되어 있습니다;
http://docs.docker.com/installation/windows/#container-port-redirection

이 문제는 버그가 아니기 때문에 닫을 예정입니다.   설명서에 설명되어 있습니다. 위의 설명이 도움이되기를 바랍니다.   당신.


1
링크를 가져 주셔서 감사하지만 링크 된 github 티켓은 Windows 7 (또는 Windows 2016 이전의 Windows Server)을 참조하며 티켓 회신은 "Windows (및 OS X)에서 docker 데몬과 컨테이너는 기본적으로 실행할 수 없습니다 따라서 도커 클라이언트 만 Windows 컴퓨터에서 실행되지만 데몬 (및 컨테이너)은 Linux를 실행하는 VirtualBox 가상 머신에서 실행됩니다. "; 이것은 Windows7에 유효하지만 컨테이너가 기본적으로 실행될 수있는 Windows 2016의 경우는 아닙니다.
Mathias Conradt

1
또한 thaJeztah가 연결된 github 페이지의 주석을 주목하십시오 : "Docker Engine을 기본적으로 Windows Server 2016에서 실행하기위한 작업이 진행 중입니다. 그러나 해당 엔진은 Linux가 아닌 Windows 응용 프로그램 만 실행합니다"& lt; - 이것은 내가 시도하는 것입니다. 해야 할 일.
Mathias Conradt

그러나 Microsoft에서 개발하지 않은 Docker에 대해 묻고 있습니다. Windows와의 완벽한 통합을 위해서는 Docker가 아닌 Windows 컨테이너 및 Hyper-V 컨테이너 인 Windows 기술을 사용해야합니다.
harrymc

Docker가 MS에 의해 개발되지 않았다는 것을 알고 있습니다. 문제없이 Linux 컨테이너에 Docker를 사용합니다. Microsoft 문서에서 Docker는 Windows 컨테이너와 동일한 방식으로 Win2016에서 작동해야합니다. 그 사이에 VM이 없도록 Hyper-V를 명시 적으로 피하고 있습니다. Windows Container 접근 방식을 시도해 볼 것이지만 Docker는 Windows 이외의 환경에서 사용하기 때문에 Docker를 사용하는 것을 선호합니다.
Mathias Conradt

미래의 차이점은 반드시 사라질 것입니다. 현재 상황을 보려면 다음 기사를 참조하십시오. Windows Server 2016 용 Docker 엔진 . 마이크로 소프트가 Docker와의 완전한 통합을 목표로해야한다고 생각 하겠지만 어쩌면 WS2016의 릴리스 버전에서도 가능할 것입니다.
harrymc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.