Microsoft의 컨테이너(Container) 기술, Windows Server 2016과 Docker.. 2편, Container Host 구성

약 한달전에, Microsoft의 컨테이너(Container) 기술, Windows Server 2016과 Docker.. Windows/Hyper-V Container 포스팅에서 Windows Server 2016 Technical Preview(TP) 3에서 새롭게 추가된 Windows Container 기술에 대한 대략적인 기술 정리 및 간단한 활용을 살펴보았습니다. 빠르게 2번째 포스팅을 해야지라는 마음은 굴뚝같았지만, Windows 10 Enterprise 쪽에 대한 오프라인 세미나 요청이 많으셔서, 이를 진행하느라, 지긋이 앉아, 새로운 글을 쓸 시간이 많지 않았습니다. ㅜㅜ

각설하고! 오늘은 Windows Server 2016 TP3을 이용하여 Windows Container를 사용하기 위한, Container Host를 구성해보도록 하겠습니다. (Container Host라는 단어가 익숙하지 않으시다면, 앞선 개념 이해 포스팅을 다시 한번 읽어보시고~!)

Container Host를 구성하기 위한 운영 체제는 Windows Server 2016 TP3이어야 합니다. Container Host는 실제 물리적인 서버에 설치하셔도 되고, Windows Server 2012/2012 R2 기반의 VM에 설치하셔도 무방합니다.

다만 주의 사항은, Windows Server 2016 TP3을 코어(Core) 버전으로 사용하셔야 한다는 것입니다. 차후 Windows Server 2016이 릴리즈되면, 코어 버전의 Windows Server뿐만 아니라, Nano Server (언젠가 포스팅을 또 하겠습니다. ㅜㅜ) 기반에서도 활용할 수 있습니다. 많이 사용하시는 GUI 기반의 전체 설치 버전은 Container Host의 형태로 사용할 수 없는 방향으로 가고 있습니다. 어찌 생각해보면, Container 기술 자체가, 빠른 배포 및 유연성을 위한 기술이기에, 작은 용량의 형태가 필요해지고, 이러한 방향성에서는 전체 설치 버전은 잘 맞지 않는 것이라고 해석할 수 있습니다.

image

Windows Server 2016 TP3 코어 버전을 설치하셨다면, Container Host를 구성하기 위한 절반의 절차는 완료하신 셈입니다. 또한, 현재 Container Host를 구성하시려면, 반드시 대상 서버(혹은 VM)이 인터넷에 연결되어 있어야 합니다. (관련 파일 다운로드를 위해) GUI에 익숙하신 분들은 시작부터 명령어가 감이 안오실 수 있습니다. 우선 서버의 이름, IP 주소등을 설정해야 하므로, 명령 프롬프트에서 sconfig를 이용하는 것입니다.

image

Container Host를 구성하는 가장 편리한 방법은 Windows PowerShell을 이용하시는 것입니다. 이를 위해 PowerShell이라고 입력하여, 이를 실행합니다.

image

Windows PowerShell에서 Container Host를 구성하는 PowerShell 스크립트를 Microsoft에서 다운로드받습니다. 브라우저가 없기 때문에, Invoke-WebRequest(wget으로 Alias가 설정되어 있음)을 이용하여, https://aka.ms/setupcontainers의 스크립트를 ContainerSetup.ps1으로 다운로드합니다.

image

https://aka.ms/setupcontainers 에 접속해보면, Setup용 스크립트임을 알 수 있습니다. 보다 세부적인 구성 순서나 기술 습득을 위해서 시간이 허락될 때, 해당 스크립트 파일을 분석해보시는 것도 좋습니다.

image

한가지를 결정하고 이후 작업을 진행해야 합니다. Container들에 대한 네트워크 방식을 결정해야 합니다. Windows Server 2016 TP3의 Container는 2가지 형태의 네트워킹을 지원합니다.

  1. Container와 Container Host간의 NAT 구성
  2. Container와 Container Host가 동일한 네트워크에 배치(현재는 DHCP 시나리오만 지원)

그냥 방금 다운로드받은 스크립트를 실행하면, Container가 Container Host를 게이트웨이로 쓰는 형태인 NAT가 구성됩니다. 이 경우에 Container의 네트워킹을 위해 개인 네트워크(Private Network) 스위치가 생성되고, Container Host가 실제 NIC과 개인 네트워크에 연결된 vNIC의 네트워킹을 NAT 형태로 처리하게 됩니다.

image

NAT로 구성된 경우에는 Container가 외부 네트워크에 연결되어 서비스할 경우, 외부 IP 주소와 외부 포트를, 내부의 주소와 포트로 맵핑해주는 NAT의 포트 포워딩을 사용해야 합니다.

image

이 경우, 많은 NetNat 관련 cmdlet 중 Add-NetNatStaticMapping을 이용합니다.

image

Container도 직접 네트워크가 가능한 형태로 구성을 하기 위해서는 ContainerSetup.ps1 스크립트를 실행시 하나의 옵션을 설정해야 합니다. 바로 UseDHCP 옵션입니다.

image

해당 스크립트의 75번째 줄에는 UseDHCP에 대한 옵션을 지정할 수 있으며,

image

293번째 줄에서 UseDHCP를 지정했을 경우엔, New-ContainerDhcpSwitch Function으로, 아닐 경우엔 New-ContainerNatSwitch와 New-ContainerNat Function이 동작함을 알 수 있습니다.

image

203번째 줄에서 시작되는 New-ContainerDhcpSwitch Function은 전역 변수 SwitchName으로 그냥 VmSwitch를 생성합니다. (외부 네트워크입니다.)

image

93번째 줄에 SwitchName에 대한 전역 변수가 선언되어 있습니다. (이를 바꾸시면 Container에서 사용 가능한 스위치 이름도 바뀝니다.) 물론, NAT로 구성 후, DHCP로 구성 후, 상호 변경이 가능합니다. 또한 2개 이상의 스위치를 생성하시고, 이를 묶어서 활용하실 수도 있습니다.

외부 네트워크에 직접 Container들을 바로 연결하려면, ContainerSetup.ps1 -usedhcp 를 입력하시고, 그냥 NAT로 사용하실 것이라면, ContainerSetup.ps1만 바로 실행하면 됩니다. NAT 활용시, Container들은 기본적으로 스크립트내 61번째 줄에서 선언된 172.16.0.0/12 IP 서브넷을 사용합니다. 이 역시 실행 전, 차후 변경이 가능합니다.

image

설치는 한 줄로 되는 것을 알 수 있습니다.

image

설치 이후, Windows Container가 동작할 때, 필요한 각종 파일을 다운로드받습니다. 자 이제 설치를 시작하기 위해, Windows PowerShell에서 ContainerSetup.ps1을 실행하죠.

image

한번의 다시 시작이 발생하고, 다시 로그온을 요청합니다. Windows Server 2016부터는 기존 코어 버전에 있었던 로그온 UI 페이지가 없이, 글자로 표시됩니다. Smile

image

다시 로그온을 완료하면, 사전 다시 설치 프로세스가 시작되도록, 구성되고, 다시 시작되었으므로, Windows PowerShell이 자동 시작됩니다. 그 후, 옵션을 별도로 붙이지 않았기에, 네트워크는 NAT 모드로, 그리고 NAT 내부 IP 대역은 언급한 172.16.0.0/12입니다.

image

Container에서 활용할 Container OS 이미지를 https://aka.ms/ContainerOSImage에서 다운로드를 시작합니다. 해당 이미지가 각종 Container를 생성할 때, 기반이 될 OS 이미지가 되며, Windows Server 2016 TP3에서는 Windows Server 2016 Core만 제공하고 있습니다. 다운로드에 걸리는 시간은 네트워크의 상황에 따라 유동적입니다. 해당 경로를 직접 브라우저에 넣으면, 약 3G의 크기를 가진 Windows Server 2016 TP3 Core가 다운로드됩니다.

image

다운로드가 잘 진행되는지 확인하고 싶다면, Ctrl+Alt+Del을 누르고, 작업 관리자를 선택합니다.

image

이더넷에 Receive 쪽이 속도가 나옴을 알 수 있습니다.

image

그리고 작업 관리자의 메뉴 파일, 새 작업 실행을 통해 PowerShell이나 명령 프롬프트를 하나 더 열수 있습니다. 이를 통해 다른 작업을 하실 수도 있습니다.

image

설치가 완료된 이후, 작업 관리자의 세부 정보 탭에서 Docker.exe를 확인하실 수 있습니다.

image

NAT 형태로 네트워크를 구성하였기에, NAT 서비스가 구성되어 있고, Get-VMSwitch cmdlet에서 2개의 네트워크가 나타나게 됩니다.

image

Container IP 주소 172.16.0.2의 80번 포트를 외부로 매핑하려면, Add-NetNatStaticMapping cmdlet을 사용하게 됩니다.

image

NAT는 외부에서 접속하는 형태의 Container는 조금 불편한 감이 있습니다. 이에 IP 주소를 직접 가지는 모드가 더 유용할 수 있습니다. 이를 외부 네트워크 유형의 가상 스위치라고 하며, 현재는 DHCP 서버가 IP 주소를 제공해야 합니다. 일단 현재의 NAT 유형의 VM Switch를 제거합니다.

image

그 후, New-VMSwitch cmdlet으로 새롭게 외부 네트워크 유형의 가상 스위치를 생성합니다. Get-NetAdapter를 통해 NIC의 Name 속성을 확인하고, New-VMSwitch <스위치 이름> -NetAdapterName <NIC의 Name 속성>을 입력합니다. 이러면 SwitchType이 External인 가상 스위치가 만들어집니다.

image

물리적인 서버를 직접 이용하는 형태라면, 이 후, 해당 가상 스위치를 사용하는 Container는 IP 주소를 DHCP 서버에서 받아 옵니다. 그러나 VM의 경우에는 Hyper-V에서 구성해준 기본 설정을 사용한다면, IP 주소를 받지 못하는 문제(?!?!)아닌 문제가 발생합니다.

image

이유는 Hyper-V의 보안 기능때문입니다. VM 설정에 NIC에 대한 MAC 주소 스푸핑(Spoofing)을 할 수 없게 하는 옵션이 기본이기 때문입니다. 하나의 NIC에서 여러 MAC 주소가 나오는 형태이기에, Hyper-V에서는 MAC 주소 스푸핑이라고 판단하는 것이죠. (소프트웨어 네트워크 로드 밸런싱인 NLB시에도 동일한 이슈가 발생합니다.) 이를 할 수 있게 하는 옵션이 VM 설정에 있습니다.

image

이럼, 이렇게 잘 해결이 됩니다. Smile

image

현재 Windows Container와 관련된 PowerShell Cmdlet은 여기에서 확인하실 수 있습니다.

자세한 설정을 설명하고자, 스크린샷이 많아서, 길어졌던 포스팅이었습니다. 다음에는 Container를 직접 만들고, 운영하는 사항에 대해서 살펴보겠습니다.