성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Windows Server Containers 소개</h1> <p> 지난 글에서 Windows 10 환경의 docker 체험을 해봤는데요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Windows 10에서 경험해 보는 Windows Containers와 docker ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11013'>http://www.sysnet.pe.kr/2/0/11013</a> </pre> <br /> 아무래도 nanoserver만 가능하다 보니 활용성이 많이 떨어집니다. 이번에는 windowsservercore 이미지도 가능한 "Windows Server 2016" 환경에서 실습을 좀 더 해보겠습니다. (단지, 아직 정식 버전은 아니고 공개된 Technical Preview 5로 합니다. 윈도우 업데이트도 모두 받은 상태!)<br /> <br /> 준비 절차는 윈도우 10과 유사합니다. Containers 기능을 켜고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PS C:\Windows\system32> <span style='color: blue; font-weight: bold'>Install-WindowsFeature containers</span> Success Restart Needed Exit Code Feature Result ------- -------------- --------- -------------- True Yes SuccessRest... {Containers} WARNING: You must restart this server to finish the installation process. </pre> <br /> 재시작을 한 후,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Restart-Computer -Force </pre> <br /> docker를 설치합니다. 이번에도 (향후 안정화 될 것을 대비해) 문서상으로는 다음과 같이 하면 되지만,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Invoke-WebRequest "https://get.docker.com/builds/Windows/x86_64/docker-latest.zip" -OutFile "$env:TEMP\docker-latest.zip" -UseBasicParsing Expand-Archive -Path "$env:TEMP\docker-latest.zip" -DestinationPath $env:ProgramFiles [Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Program Files\Docker", [EnvironmentVariableTarget]::Machine) & $env:ProgramFiles\docker\dockerd.exe --register-service Start-Service docker </pre> <br /> "<a target='tab' href='http://www.sysnet.pe.kr/2/0/11015'>Windows Server 2016 TP5에서 Windows Containers의 docker run 실행 시 encountered an error during Start failed in Win32</a>" 글에서 쓴 사정으로 인해 바이너리는 직접 다음과 같이 받아줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Invoke-WebRequest https://master.dockerproject.org/windows/amd64/docker.exe -OutFile $env:ProgramFiles\docker\docker.exe Invoke-WebRequest https://master.dockerproject.org/windows/amd64/dockerd.exe -OutFile $env:ProgramFiles\docker\dockerd.exe </pre> <br /> 이제 Container OS Image를 다운로드 받아야 하는데요. "docker pull"을 쓰던 Windows 10과는 달리 Windows Server 2016에서는 한가지 방법을 더 제공합니다. "docker pull"은 Windows 10에서 알아봤으니 이 글에서는 후자의 방법으로 설명해 보겠습니다.<br /> <br /> 이를 위해 우선, Container image package provider를 설치해야 합니다. 이는 다음의 명령어로 가능하며,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PS E:\docker> <span style='color: blue; font-weight: bold'>Install-PackageProvider ContainerImage -Force</span> Name Version Source Summary ---- ------- ------ ------- ContainerImage 0.6.4.0 PSGallery This is a PackageManagement provider mo... </pre> <br /> 설치된 package provider에서 제공하는 Container 이미지 목록은 이렇게 확인할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PS E:\docker> <span style='color: blue; font-weight: bold'>Find-ContainerImage</span> Name Version Source Summary ---- ------- ------ ------- NanoServer 10.0.14300.1016 ContainerImag... Container OS Image of Windows Server 20... WindowsServerCore 10.0.14300.1000 ContainerImag... Container OS Image of Windows Server 20... </pre> <br /> 그렇군요. NanoServer와 WindowsServerCore를 기반 Image OS로 사용할 수 있습니다.<br /> <br /> 이 중에서 WindowsServerCore를 기반 이미지로 설치하는 방법은 다음과 같습니다. (시간이 꽤 걸리니 차 한잔 드시고 오세요. ^^)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PS C:\Windows\system32> <span style='color: blue; font-weight: bold'>Install-ContainerImage -Name WindowsServerCore</span> WARNING: Based on customer feedback, we are updating the Containers PowerShell module to better align with Docker. As part of that some cmdlet and parameter names may change in future releases. To learn more about these changes as well as to join in the design process or provide usage feedback please refer to http://aka.ms/windowscontainers/powershell </pre> <br /> 그런 다음 docker 서비스를 재시작하면 docker NT 서비스도 ContainerImage를 인식하게 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PS C:\Windows\system32> <span style='color: blue; font-weight: bold'>Restart-Service docker</span> PS C:\Windows\system32> <span style='color: blue; font-weight: bold'>docker images</span> REPOSITORY TAG IMAGE ID CREATED SIZE windowsservercore 10.0.14300.1000 2b824ea36a88 12 weeks ago 9.354 GB </pre> <br /> nanoserver도 Image로 다운로드 받을 수 있습니다. (이건 좀 빠릅니다. ^^)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PS C:\Windows\system32> <span style='color: blue; font-weight: bold'>Install-ContainerImage -Name NanoServer</span> PS C:\Windows\system32> <span style='color: blue; font-weight: bold'>Restart-Service docker</span> PS C:\Windows\system32> <span style='color: blue; font-weight: bold'>docker images</span> REPOSITORY TAG IMAGE ID CREATED SIZE windowsservercore 10.0.14300.1000 2b824ea36a88 12 weeks ago 9.354 GB <span style='color: blue; font-weight: bold'>nanoserver</span> <span style='color: blue; font-weight: bold'>10.0.14300.1016</span> a26adab76348 <span style='color: blue; font-weight: bold'>12 weeks ago</span> 810.2 MB </pre> <br /> 주의할 것은, "docker pull"과 "Install-ContainerImage" 간에는 3가지 차이점이 있다는 것입니다. 첫 번째는, "docker pull"로 받았을 때와 달리 Install-ContainerImage로 받으면 컨테이너의 이름에 "microsoft" 접두사가 없다는 것입니다. 예를 들어, <a target='tab' href='http://www.sysnet.pe.kr/2/0/11013'>지난 글에서 windows 10의 "docker pull"로 받은 이미지를 "docker images"로 확인한 결과</a>는 이렇습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Windows\system32>docker images REPOSITORY TAG IMAGE ID CREATED SIZE <span style='color: blue; font-weight: bold'>microsoft/nanoserver</span> <span style='color: blue; font-weight: bold'>latest</span> 3a703c6e97a2 <span style='color: blue; font-weight: bold'>7 weeks ago</span> 969.8 MB </pre> <br /> 보는 바와 같이 "microsoft" 접두사가 있습니다. 두 번째 차이점은 "TAG"가 "docker pull"로 받으면 "latest"인 반면, Install-ContainerImage로 하면 버전 정보가 된다는 점입니다. 마지막으로 세 번째는 "CREATED" 날짜가 다릅니다. 그걸로 예상해 보건대 "docker pull"과 "Install-ContainerImage"의 대상이 되는 Container registry가 다른 것이 아닌가 싶습니다. 날짜 상으로 보면, docker pull로 받은 이미지가 7주 전에 업데이트되었던 반면, Install-ContainerImage로 받은 것은 더 오래된 12주 전입니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> Windows 10에서의 실습과 마찬가지로 Container Image를 설치했으니 이것만으로도 실행을 할 수 있습니다. 그런데, 이번에는 지난번 실습과 달리 다음과 같이 명령을 내리면 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Windows\system32><span style='color: blue; font-weight: bold'>docker run windowsservercore ipconfig</span> Unable to find image 'windowsservercore:latest' locally Pulling repository docker.io/library/windowsservercore docker: Error: image library/windowsservercore:latest not found. See 'docker run --help'. </pre> <br /> 왜냐하면 위에서도 언급했지만 "TAG" 명이 다르기 때문입니다. "docker run"의 대상으로 이름을 준 경우 기본적으로 TAG 값이 "latest"인 것을 실행해 주는데 Install-ContainerImage로 설치한 경우 버전 명으로 TAG가 지정되었기 때문에 찾을 수 없어 오류가 발생합니다. 대신 이런 경우 "IMAGE ID" 값으로 직접 실행할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > docker run 2b824ea36a88 ipconfig </pre> <br /> 물론 이름으로도 실행할 수 있습니다. 이런 경우 TAG가 latest인 것을 만들어주면 됩니다. 가령 다음의 명령어는 IMAGE ID == 2b824ea36a88인 것을 latest로 하나 더 명명해 주는 것을 추가합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > docker tag 2b824ea36a88 windowsservercore:latest </pre> <br /> 그럼 다음과 같이 실행할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > docker run windowsservercore ipconfig </pre> <br /> 하지만, 현재(2016-08-07 기준) 다음의 글과 같은 사유로 인해 이에 대한 실습이 되질 않습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Windows Server 2016 TP5에서 Windows Containers의 docker run 실행 시 encountered an error during Start failed in Win32 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11015'>http://www.sysnet.pe.kr/2/0/11015</a> </pre> <br /> 따라서, 이 글에서는 그냥 Install-ContainerImage가 있다는 것과 TAG라는 것에 대한 것만 알아두시고 "docker pull"로 다시 "microsoft/windowsservercore", "microsoft/nanoserver"를 받습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > docker pull microsoft/windowsservercore docker pull microsoft/nanoserver </pre> <br /> 그렇게 하면 이제부터 다음과 같이 잘 실행이 됩니다. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Windows\system32><span style='color: blue; font-weight: bold'>docker run microsoft/windowsservercore ipconfig</span> Windows IP Configuration Ethernet adapter vEthernet (Temp Nic Name): Connection-specific DNS Suffix . : Link-local IPv6 Address . . . . . : fe80::9c9b:52e:5dbf:3f61%17 IPv4 Address. . . . . . . . . . . : 172.25.254.255 Subnet Mask . . . . . . . . . . . : 255.240.0.0 Default Gateway . . . . . . . . . : 172.16.0.1 </pre> <br /> 만약 "Install-ContainerImage"로 설치한 것이 잘 되었다면 다음과 같이 명령을 실행하면 됩니다. (microsoft 접두사가 없다는 것에 유의하세요.)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > docker run windowsservercore ipconfig </pre> <br /> <hr style='width: 50%' /><br /> <br /> 자, 그럼 이제부터는 Windows 10에서 미뤄두었던 실습을 하나 더 해보겠습니다.<br /> <br /> windowsservercore 이미지는 그 자체로 IIS 기능이 아직 설치되지 않은 상태입니다. 물론 이를 위해 windowsservercore를 command 쉘로 실행하고 그 내부에서 IIS를 활성화할 수도 있겠지만, 이미 IIS 설정을 추가하는 또 다른 docker Container Image를 이용하면 이를 쉽게 할 수 있습니다.<br /> <br /> 따라서 다음과 같이 iis 이미지를 다운로드 받습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Windows\system32><span style='color: blue; font-weight: bold'>docker pull microsoft/iis</span> Using default tag: latest latest: Pulling from microsoft/iis 1239394e5a8a: Already exists 847199668046: Pull complete 4b1361d2706f: Pull complete Digest: sha256:1d64cc22fbc56abc96e4b7df1b51e6f91b0da1941aa155f545f14dd76ac522fc Status: Downloaded newer image for microsoft/iis:latest C:\Windows\system32><span style='color: blue; font-weight: bold'>docker images</span> REPOSITORY TAG IMAGE ID CREATED SIZE <span style='color: blue; font-weight: bold'>microsoft/iis latest accd044753c1 2 days ago 7.907 GB</span> microsoft/windowsservercore latest 02cb7f65d61b 7 weeks ago 7.764 GB microsoft/nanoserver latest 3a703c6e97a2 7 weeks ago 969.8 MB </pre> <br /> 용량은 7.9GB이지만 설치 속도는 windowsservercore 이미지와 비교도 안되게 빠릅니다. 즉, windowsservercore 의존성을 동반한 크기입니다. 그리하여 다음과 같이 실행해 볼 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > docker run -p 8090:80 microsoft/iis ping -t localhost </pre> ("ping localhost"가 아닌 "ping -t localhost"를 한 것은 컨테이너 실행 후 멈추지 않도록 하기 위함입니다.)<br /> <br /> 잠시 후 "ping -t localhost"의 결과가 명령행 창에 나타나기 시작하면 이제 IIS 이미지가 docker에서 Container로 실행상태가 된 것이고, 다른 컴퓨터에서 해당 docker run을 실행 중인 PC의 [IP:8090]로 웹 브라우저를 이용해 방문하면 다음과 같이 IIS 서비스 가동 여부를 확인할 수 있습니다.<br /> <br /> <img alt='winsrv_containers_1.png' src='/SysWebRes/bbs/winsrv_containers_1.png' /><br /> <br /> 이 때 재미있는 것은, docker run을 호스팅 중인 컴퓨터 내에서는 "<a target='tab' href='http://192.168.0.41:8090'>http://192.168.0.41:8090</a>"이라고 해도 접근이 안됩니다. (즉, 오로지 외부에서만 접근할 수 있는 포트포워딩 서비스가 되는 것입니다.) 또한, docker run 실행 중인 명령행 창에서 "Ctrl + C" 키를 눌러 실행을 중지해도 실제로는 중지되지 않고 여전히 background로는 살아 있습니다. 그래서 docker ps로 확인하면 다음의 결과를 볼 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Windows\system32> <span style='color: blue; font-weight: bold'>docker ps</span> CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3c80d8db6911 microsoft/iis "ping -t localhost" 7 minutes ago Up 6 minutes <span style='color: blue; font-weight: bold'>0.0.0.0:8090->80/tcp</span> <span style='color: blue; font-weight: bold'>loving_morse</span> </pre> <br /> 이 작업을 중지하려면 "rm [Container Name]" 명령을 사용해야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > docker rm -f loving_morse </pre> <br /> 참고로, 실행 시 "-d" 옵션을 주면 실행 세션 ID를 출력하고 곧바로 제어를 반환합니다. (이때의 실행은 dockerd.exe NT 서비스가 대행합니다.)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Windows\system32><span style='color: blue; font-weight: bold'>docker run -d</span> -p 8090:80 microsoft/iis ping -t localhost 5dce546003185155499b939aaabb5163e30b827b2a2f9112999005e4ea302640 C:\Windows\system32> </pre> <br /> <hr style='width: 50%' /><br /> <br /> 여기까지 읽었으면 이제 docker와 Windows Server Containers의 활용법을 대충 짐작하실 수 있을 것입니다.<br /> <br /> 설명을 위해 docker search microsoft 결과를 보겠습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\WINDOWS\system32> <span style='color: blue; font-weight: bold'>docker search microsoft</span> NAME DESCRIPTION STARS OFFICIAL AUTOMATED microsoft/aspnet ASP.NET is an open source server-side Web ... 464 [OK] microsoft/dotnet Official images for working with .NET Core... 207 [OK] mono Mono is an open source implementation of M... 172 [OK] microsoft/azure-cli Docker image for Microsoft Azure Command L... 61 [OK] microsoft/iis Internet Information Services (IIS) instal... 25 microsoft/mssql-server-2014-express-windows Microsoft SQL Server 2014 Express installe... 23 microsoft/nanoserver Nano Server base OS image for Windows cont... 11 microsoft/windowsservercore Windows Server Core base OS image for Wind... 8 microsoft/dotnet-preview Preview bits for microsoft/dotnet image 5 [OK] microsoft/oms Monitor your containers using the Operatio... 5 [OK] microsoft/applicationinsights Application Insights for Docker helps you ... 3 [OK] microsoft/sample-nginx Nginx installed in Windows Server Core and... 2 microsoft/sample-node Node installed in a Nano Server based cont... 2 microsoft/sample-redis Redis installed in Windows Server Core and... 2 microsoft/dotnet35 2 microsoft/sqlite SQLite installed in a Windows Server Core ... 1 microsoft/sample-httpd Apache httpd installed in Windows Server C... 1 microsoft/sample-mongodb 1 microsoft/sample-mysql MySQL installed in Windows Server Core and... 1 microsoft/sample-dotnet .NET Core running in a Nano Server container 1 microsoft/sample-golang Go Programming Language installed in Windo... 0 microsoft/sample-python Python installed in Windows Server Core an... 0 microsoft/sample-ruby Ruby installed in a Windows Server Core ba... 0 microsoft/dotnet-nightly Preview bits of the .NET Core CLI 0 [OK] microsoft/sample-rails Ruby on Rails installed in Windows Server ... 0 </pre> <br /> 여러분이 만약 ASP.NET 개발자라면 "microsoft/aspnet" 이미지를 추가로 다운로드 받아 그 컨테이너를 실행시키고 내부에 여러분들의 웹 사이트 프로그램을 복사한 후 해당 컨테이너에 또 다른 이름을 붙이면 됩니다.<br /> <br /> 그렇게 이름붙은 컨테이너를 docker에 배포하든지, 여러분들의 사설 docker registry에 배포한 후 서비스를 수행할 서버에서 "Windows Containers" 기능을 켠 후 저 컨테이너를 설치해 곧바로 서비스를 수행할 수 있습니다.<br /> <br /> 이거저거 일일이 설정할 필요 없이 특정 컴퓨터에서 곧바로 컨테이너를 구동할 수 있게 된 것입니다. 게다가 성능도 VM위에서가 아닌, Host 컴퓨터의 자원을 직접 이용하면서.<br /> <br /> 이렇게 새로운 Container Image를 만드는 것에 대해서는 다음의 문서를 참조하세요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Dockerfile on Windows ; <a target='tab' href='https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-docker/manage-windows-dockerfile'>https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-docker/manage-windows-dockerfile</a> </pre> <br /> 그런데, 위의 과정을 보면서 결국 windowsservercore OS 이미지를 다운로드 받고 추가로 iis 이미지를 다운로드 받는 걸로 봐서는 왠지 Virtual Machine 구동하는 것과 별반 달라 보이지 않습니다. 저도 아직 Windows Containers 구조에 대해 확실한 이해는 못하고 있지만 이는 간단한 테스트로 확인할 수 있습니다.<br /> <br /> 가령, OS 이미지를 다운로드 받은 경로는 대략 다음과 같습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > "C:\ProgramData\Microsoft\Windows\Images\CN=Microsoft_WindowsServerCore_10.0.14300.1000" </pre> <br /> 이 폴더를 지우면 어떻게 될까요? (저처럼) 호기심 있는 분은 한번 시도해 보세요. ^^<br /> <br /> 결과를 말하자면, 많은 파일들이 삭제되지만 일부 파일은 잠겨 있다면서 지워지지 않습니다. 그리고, 지워진 많은 파일들 중에는 "Windows Containers"를 호스팅 중인 운영체제의 파일도 담겨 있습니다. 즉, 서로 연결되어 있는 것이고 호스팅 중인 운영체제의 dll들이 로드된 것들도 있으므로 "C:\ProgramData\Microsoft\Windows\Images\CN=Microsoft_WindowsServerCore_10.0.14300.1000" 폴더 내부의 일부 dll들도 잠겨진 걸로 나오는 것입니다. (이미지 폴더를 삭제 시도해 보았다면, 호스팅 운영체제를 다시 설치해야 합니다.)<br /> <br /> 이렇게 보면, 왜 windowsservercore가 Windows 10에서는 구동되지 않는 것인지 이유를 대충 짐작해볼 수 있습니다. ^^<br /> <br /> <hr style='width: 50%' /><br /> <br /> 문서에서는 IIS 이미지를 받을 때 :windowsservercore를 명시하는 식으로 나오는데, 정작 이렇게 해보니 현재(2016-08-07) 다음과 같은 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Windows\system32><span style='color: blue; font-weight: bold'>docker pull microsoft/iis:windowsservercore</span> Error response from daemon: manifest unknown: manifest unknown </pre> <br /> 다행히 windowsservercore 태그는 생략해도 됩니다. <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\Windows\system32><span style='color: blue; font-weight: bold'>docker pull microsoft/iis</span> Using default tag: latest latest: Pulling from microsoft/iis 1239394e5a8a: Already exists 847199668046: Pull complete 4b1361d2706f: Pull complete Digest: sha256:1d64cc22fbc56abc96e4b7df1b51e6f91b0da1941aa155f545f14dd76ac522fc Status: Downloaded newer image for microsoft/iis:latest </pre> <br /> 이런 경우, 의존성을 명시하지 않았으므로 nanoserver와 windowsservercore 중에 자동으로 windowsservercore에 의존성을 가진 iis 이미지가 다운로드 된다고 합니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> Install-ContainerImage를 실행하면 "<a target='tab' href='https://pshctnoncdn.blob.core.windows.net/pshctcontainer/SearchContainerImages.txt'>https://pshctnoncdn.blob.core.windows.net/pshctcontainer/SearchContainerImages.txt</a>" 경로의 파일을 다운로드 받습니다. 내용은 이렇고.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [ { "Name": "NanoServer", "Version": "10.0.14300.1016", "Description": "Container OS Image of Windows Server 2016 Technical Preview 5 : Nano Server Installation", "SasToken": "https://az887518.vo.msecnd.net/pshctcontainer/NanoServer-10-0-14300-1016.wim" }, { "Name": "WindowsServerCore", "Version": "10.0.14300.1000", "Description": "Container OS Image of Windows Server 2016 Technical Preview 5 : Windows Server Core Installation", "SasToken": "https://az887518.vo.msecnd.net/pshctcontainer/WindowsServerCore-10-0-14300-1000.wim" } ] </pre> <br /> <hr style='width: 50%' /><br /> <br /> ContainerImage를 지우고 삭제하기를 반복하다 보면, 어느 순간 새롭게 설치하는 경우 다음과 같이 오류가 발생할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PS C:\Windows\system32> <span style='color: blue; font-weight: bold'>Install-ContainerImage -Name NanoServer</span> Base image 'CN=Microsoft_NanoServer_10.0.14300.1016' already exists at 'C:\ProgramData\Microsoft\Windows\Images\CN=Microsoft_NanoServer_10.0.14300.1016'. At C:\windows\system32\windowspowershell\v1.0\Modules\Containers\1.0.0.0\Containers.psm1:84 char:13 + throw "Base image '$imageFullName' already exists at '$im ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : OperationStopped: (Base image 'CN=....0.14300.1016'.:String) [], RuntimeException + FullyQualifiedErrorId : Base image 'CN=Microsoft_NanoServer_10.0.14300.1016' already exists at 'C:\ProgramData\Microsoft\Windows\Images\CN=Microsoft_NanoServer_10.0.14300.1016'. </pre> <br /> 분명히 "docker images"로 확인해 보면 등록되어 있지 않은 상태입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PS C:\Windows\system32> <span style='color: blue; font-weight: bold'>docker images</span> REPOSITORY TAG IMAGE ID CREATED SIZE </pre> <br /> 이런 경우, <a target='tab' href='https://github.com/Microsoft/Virtualization-Documentation/blob/master/virtualization/windowscontainers/management/manage_images.md'>Uninstall-ContainerOSImage</a> 명령어를 이용해 명시적으로 삭제할 수 있다고 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Uninstall-ContainerOSImage -FullName CN=Microsoft_NanoServer_10.0.14300.1016 </pre> <br /> <hr style='width: 50%' /><br /> <br /> PowerShell에서는 "docker run -it" 옵션의 테스트를 할 수 없습니다. 이런 경우, 다음과 같이 그냥 명령행을 빠져나오고 백그라운드에도 실행되어 있지 않습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PS C:\Windows\system32> <span style='color: blue; font-weight: bold'>docker run -it microsoft/windowsservercore cmd</span> PS C:\Windows\system32> <span style='color: blue; font-weight: bold'>docker ps</span> CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES PS C:\Windows\system32> </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1578
(왼쪽의 숫자를 입력해야 합니다.)