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.