나는 Windows 컨테이너 ~에 Windows 호스트 (Windows Server 2016 TP4) .
컨테이너는 포트 80의 IIS 웹 서버 내부적으로하고 싶다. 포트 80을 호스트에 바인드 그래서 호스트 IP / URL을 통해 연결할 수 있습니다.
나는 마이크로 소프트의 지침을
- https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/inplace_setup 과
- https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/manage_powershell 만큼 잘
- https://msdn.microsoft.com/en-us/virtualization/windowscontainers/quick_start/manage_docker .
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을 빌드합니다.