[Windows 컨테이너] 2: Windows 컨테이너 개발 환경 구축하고 테스트하기

남정현

데브시스터즈는 Kubernetes 기반의 게임 개발 및 테스트 인프라를 성공적으로 구축하여 게임 출시에 이르는 모든 과정들을 효율적으로 처리하고 있습니다.

다년간의 성공적인 운영 경험을 바탕으로 Windows Server 기반의 Workload를 지원하기 위한 R&D 작업을 진행하였고, 그 경험담을 공유하는 아티클 시리즈를 몇 편에 걸쳐 DevTech 기술 블로그에 연재할 예정입니다.

이전 글 보기: Windows 컨테이너에 대한 이해

시작하기에 앞서

앞의 글에서는 Windows 컨테이너가 무엇이고, 왜 사용하는지, 그리고 리눅스 컨테이너와 기술적으로 어떤 차이가 있는지 살펴보았습니다. 이번 글에서는 실제로 Windows 컨테이너를 사용하기 위해 어떻게 환경을 만들고 준비할 수 있는지 살펴볼 것입니다.

준비물

Windows 컨테이너를 개발하고 테스트하기 위하여 선택할 수 있는 가장 쉬운 방법은 Hyper-V를 사용할 수 있는 Windows 10 호환 컴퓨터나 노트북을 사용하는 것입니다. 다만 주의할 것이 있습니다.

  • 일부 저가형 컴퓨터나 구형 컴퓨터는 CPU 가상화 기능을 처음부터 제공하지 않도록 기능이 막혀있는 경우가 있을 수 있으므로 반드시 CPU 가상화 기술을 사용할 수 있는 컴퓨터인지 확인합니다.
  • Windows 10 S Mode가 켜져있을 경우 S Mode를 해제해야 합니다. S Mode를 해제하는 자세한 방법은 이 문서를 참고하세요. 단, 한 번 해제하면 다시 S Mode로 돌아올 수 없습니다.

만약 Windows 10 Home 버전을 사용 중이거나, macOS나 리눅스 환경 안에서 작업하기를 원한다면 Windows 10과 개발 도구가 모두 설치된 가상 컴퓨터 이미지를 Microsoft에서 내려받아서 이용할 수 있습니다.

이 방법을 사용하면 별도의 라이선스를 취득하지 않아도 지정된 기한 내에 개발 목적으로 자유롭게 Windows 10 개발 환경을 이용할 수 있습니다. 다만 컨테이너 빌드 과정에서 오버헤드가 더 클 수 있습니다.

Windows 10 개발 환경 다운로드

웹 사이트에서 가상 머신 소프트웨어 종류 별로 이미지가 각각 제공되므로 적절한 파일을 다운로드해서 사용할 수 있습니다.

가상화 또는 중첩 가상화 지원 여부 확인하기

실제 컴퓨터의 경우 사용 중인 프로세서가 가상화를 지원하는지 여부, 가상 컴퓨터를 사용하는 경우 하이퍼바이저가 중첩 가상화를 지원하는지 여부를 다시 한 번 확인하도록 합니다.

가상화나 중첩 가상화를 어떻게 활성화하고 사용할 수 있는지에 대해서는 방법이 매우 다양하기 때문에 이 글에서는 다루기 어렵습니다. 하지만 Docker for Desktop을 사용하려면 반드시 가상화 기능이 호스트에서 지원되어야합니다.

⚠️ 만약 UEFI와 BitLocker를 사용하는 컴퓨터에서 UEFI 상의 가상화 지원 설정을 변경할 경우 다음번 시스템 시작 시 Windows OS가 잠길 수 있습니다. 이 때는 BitLocker 복구 키를 입력해주어야만 하므로, 계속 하기 전에 BitLocker 복구 키를 미리 메모한 후 작업하시는 것이 안전합니다.

Docker for Desktop 설치하기


ℹ️ 이 글에서 설명하는 Windows 컨테이너 개발은 반드시 Docker Desktop 2.0 이상의 버전이 필요합니다. Docker Toolbox for Windows는 Windows 컨테이너 개발을 지원하지 않는 버전이므로 혼동해서 설치하지 않도록 주의해야 합니다.

Windows 10 실행 환경이 준비되면, Docker for Desktop을 설치하고 구성할 차례입니다.

Docker for Desktop 다운로드하기

이후에는 설치 마법사의 안내에 따라 설치를 진행하도록 합니다. 특별히 변경할 옵션 없이 설치를 완료하고, 시스템을 다시 시작하거나 로그오프 등이 필요하다는 안내 문구가 나오면 그대로 따릅니다.

설치한 후에는 Docker Desktop을 시작 메뉴의 검색 기능을 이용하여 아래 그림과 같이 실행할 수 있습니다.

Docker Desktop for Windows 실행

Docker Desktop for Windows 실행

Docker Desktop을 실행하면 작업 표시줄의 트레이 아이콘에 고래 모양의 아이콘이 아래 그림과 같이 표시됩니다. 처음에 시작하는 과정에서 트레이 아이콘에 애니메이션이 계속 재생되는데, 멈출 때까지 기다리도록 합니다.

Docker Desktop 트레이 아이콘

Docker Desktop 트레이 아이콘

Windows 컨테이너 호스트로 전환하기

보편적으로 사람들은 리눅스 컨테이너 개발 환경을 필요로 하기 때문에, 처음 Docker for Desktop을 설치하면 리눅스 컨테이너 호스트로 실행됩니다. 그래서 Windows 컨테이너 모드로 전환을 해야 합니다.

Windows 컨테이너 모드로 전환을 하려면 트레이 아이콘을 오른쪽 마우스 버튼으로 클릭하고, 나타나는 팝업 메뉴에서 Switch to Windows Container 메뉴를 클릭합니다. 이 메뉴가 보이지 않으면 이미 전환이 완료된 것입니다.

Switch to Windows Container 메뉴 선택

Switch to Windows Container 메뉴 선택 - 출처

잠시 기다리면 Windows 컨테이너 호스트 모드로 로딩이 완료됩니다. Hyper-V 가상 머신을 기반으로 하는 리눅스 컨테이너 호스트 모드와는 달리 Windows OS의 기능을 직접 사용하므로 훨씬 로딩이 빠릅니다.

설치가 잘 되었는지 확인해보기 위하여 다음 명령어를 실행합니다.

docker run -it --rm hello-world

아래 그림과 같이 메시지가 표시되면 정상적으로 Windows 컨테이너 호스트 구동이 완료된 것입니다.

docker run it --rm hello-world 실행 결과

docker run it --rm hello-world 실행 결과

이제 Windows 컨테이너를 사용하여 개발할 준비를 모두 마쳤습니다.

첫 Windows 컨테이너 애플리케이션 만들기

Windows 컨테이너 이미지 중 Core 컨테이너에 기본으로 포함되어있는 PowerShell을 이용하여 외부에서 웹 요청을 받아들일 수 있는 간단한 웹 서버 컨테이너를 만들어보겠습니다.

이 글에서 설명하는 모든 명령줄은 PowerShell 문법을 사용합니다.

우선 작업의 편의를 위하여 사용자 홈 디렉터리 아래에 새로운 작업용 디렉터리 dockertest를 생성합니다.

cd $env:USERPROFILE
mkdir dockertest
cd dockertest

샘플 컨테이너에서 표시할 웹 페이지를 방금 만든 디렉터리 안에 추가합니다. 파일 이름은 index.html로 만들고 원하는 내용으로 채워넣습니다.

echo '<h1>Hello, World! from Windows Container</h1>' > index.html

그리고 새로운 Dockerfile 파일을 만들어 원하는 텍스트 편집기로 엽니다. 확장자를 붙이지 않도록 만들어야 하기 때문에, 명령어로 새 파일을 먼저 만드는 것이 정확합니다.

New-Item -Type File .\Dockerfile

Dockerfile의 내용은 다음과 같이 작성합니다.

FROM mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019

WORKDIR C:\\Inetpub\\wwwroot
ADD index.html .

EXPOSE 80/tcp

위의 Dockerfile은 웹 서버가 보여줄 index.html 파일을 추가하는 것 이외에 특별한 내용이 없습니다. 다만 Windows 환경을 접할 기회가 많지 않으신 분들은 코드 중 일부가 무슨 의미인지 이해가 되지 않을 수 있습니다. 그 중 핵심적인 것 두 가지만 짚고 넘어가겠습니다.

리눅스는 드라이브라는 개념이 없고 모든 것이 루트 디렉터리로부터 출발하지만, 모두가 잘 알고 있듯이 Windows는 루트 디렉터리라는 개념이 없고 드라이브라는 개념을 사용합니다. Windows 컨테이너 안에서도 이는 마찬가지입니다. 다만 호스트 OS의 파티션 설정을 공유하지 않으므로 컨테이너에는 C 드라이브만이 존재합니다. 그리고 왜 C 드라이브가 시작점인가 하면, 관습적으로 Windows OS는 시스템 파티션의 드라이브 문자를 C로 정하고 이를 기본값으로 택합니다.

그리고 WORKDIR 지시자를 사용하여 C:\Inetpub\wwwroot 디렉터리를 기본 경로로 잡은 부분에 대해 설명하면 이렇습니다. 예제에서 사용하는 컨테이너는 IIS 컨테이너이며, IIS 컨테이너는 Windows OS가 설치된 파티션에 할당된 드라이브에 \Inetpub\wwwroot 디렉터리를 만들어 첫 웹 사이트를 띄웁니다. 이 경로를 원하는대로 바꿀 수는 있지만, 예제에서는 빠른 이해를 돕기 위해 굳이 변경하지 않았습니다.

이제 위의 Dockerfile을 이용하여 웹 서버 컨테이너를 빌드해보겠습니다.

⚠️ 빌드를 하기 전에, 현재 작업 중인 컴퓨터가 종량제 인터넷을 사용하고 있다면 접속 수단을 먼저 바꾸는 것이 좋습니다. Windows 컨테이너의 Base 이미지 크기는 종류에 따라 다르지만 최소 1GiB 내외에서 최대 4GiB까지 매우 크기 때문에 종량제 플랜을 사용할 경우 사용량을 모두 소진하거나 추가 과금을 일으킬 수 있으므로 주의해야 합니다.

docker build -t wwwtest:latest .

처음 빌드를 할 때에는 이미지를 받아올 때 시간이 많이 소요될 수 있습니다.

빌드가 완료된 후에는 다음과 같이 명령어를 실행하여 IIS 컨테이너를 실행합니다.

docker run -d -p 8080:80 --name=wwwtest wwwtest:latest

이제 웹 서버가 잘 실행되었는지 확인하기 위하여 웹 브라우저로 다음 주소에 접속합니다.

http://localhost:8080

아래 그림과 같이 여러분이 만든 index.html 페이지가 잘 나타나면 성공한 것입니다.

첫 웹 서버 컨테이너 실행 모습

첫 웹 서버 컨테이너를 실행한 모습

축하합니다! 이제 성공적으로 Windows 컨테이너를 개발할 수 있습니다.

이제 만들어진 컨테이너를 제거하기 위하여 다음 명령을 실행합니다.

docker rm -f wwwtest

다음 시간에는

이번 글에서는 IIS 웹 서버 컨테이너를 테스트하는 과정을 살펴보았습니다. 다음 글에서는 Windows 기반 백엔드에서 많이 채택되는 NT 서비스 기반의 프로세스를 컨테이너화하는 방법에 대해 살펴보도록 하겠습니다.

참고 자료

데브시스터즈는 최고의 인재를 찾고 있습니다.

데브시스터즈에서는 능력있는 플랫폼 DevOps 엔지니어를 찾고 있습니다.
자세한 내용은 채용 사이트를 확인해주세요!
채용 사이트게임인프라KubernetesDevOps

© 2019 Devsisters Corp. All Rights Reserved.