티스토리 뷰

Infra

Windows Container 에 대해 알아보기

G마켓 기술블로그 2024. 12. 11. 16:40

안녕하세요 
Dev Platform & Corporate IT팀 팀 박진규입니다.
이번 포스팅에서는 Windows Container에 대한 내용을 공유드리려 합니다.


제가 담당하는 서비스들 중에서는 Windows OS에 종속적인 서비스들이 존재하는데,
(ex. net framework)
어느 날 이러한 서비스들을 Container 위에서 동작시킬 수 없을까 의문이 들었습니다.


일반적으로 Container는 Linux 기반이다 보니,
Windows에서는 이를 어떻게 해결할 수 있을까 찾아보던 도중
Windows Container에 대해 알게 되었고,


이에 대한 내용을 정리해서 공유드립니다.


Windows Container 란?

Windows 어플리케이션을 Windows Server 환경에서 격리하여 실행하기 위한 기능입니다.
Windows Server 2016부터 지원되고 있습니다.

Linux 컨테이너와 유사하게 애플리케이션을 독립된 환경에서 실행하지만
Windows 컨테이너는 Windows 커널을 기반으로 실행됩니다.


Windows Container 특이점

1. 기본 이미지

Windows Container 는 Microsoft에서 제공해 주는 4가지 종류의 기본 이미지를 사용해서 빌드가 가능합니다.
각 이미지는 포함된 Windows 기능들이 다르기 때문에 상황에 따라 필요한 이미지를 선택하여 사용하시면 됩니다.
(포함된 기능이 많을 수록 이미지 크기가 커집니다.)

Microsoft에서는 대부분의 사용자에게 Windows Server Core  Nanoserver 를 추천하고 있습니다.

아래는 직접 docker pull로 기본 이미지를 받았을 때
이미지 사이즈를 정리한 내용입니다.

이미지 종류 이미지 사이즈 특이사항
Nano Server 약 300 MB  
Server Core 약 5 GB  
Windows 약 9 GB windows server 2019 까지만 지원합니다. (ltsc2019)
windows server 2022 부터는 Windows Server 이미지를 사용해야 합니다.
Windows Server 약 10 GB windows server 2022 부터 지원합니다. (ltsc2022)

 

2. 호환성

Windows Container를 구동하기 위해서는 별도의 컨테이너 호환성 요구 사항이 존재합니다. Windows에서는 Linux와 다르게 사용자 모드와 커널 모드가 긴밀하게 결합되어 있고

이로 인해 Windows Container 는 Host 서버의 Windows OS 버전에 따라 구동이 불가능한 경우가 생깁니다.

 

대표적으로 Windows 10 환경에서는 Windows Server 2022 이미지의 Container를 구동하는 게 불가능합니다.

 

실제로 Windows 10 환경에서 Windows Server 2022 이미지의 Container를 실행할 경우 아래와 같은 오류가 발생합니다.

docker: a Windows version 10.0.20348-based image is incompatible with a 10.0.19043 host.

.Net Framework App을 Windows Container로 실행해 보기

저는 아래의 조건에서 Windows Container를 실행해 보았습니다.

  • Host OS : Windows 10
  • Container OS : windowsservercore-ltsc2022
  • 실행 Application : .net framework 4.5.2 기반의 ASP.NET Application

 

실행 Application 만들기

1) .net framework 4.5.2 기반의 ASP.NET Application을 생성합니다.

2) 생성한 ASP.NET Application 이 잘 동작하는 것을 확인한 후, 게시합니다.

 

Windows 10 Host에 Windows Server 2022 가상 컴퓨터 구축하기

앞서 이야기드린 것처럼
Windows 10에서는 windowsservercore-ltsc2022 이미지를 구동할 수 없습니다.

 

이를 해결하기 위해 Hyper-V를 사용해서 Windows Server 2022 가상 컴퓨터를 구축한 뒤
해당 가상환경 위에서 windowsservercore-ltsc2022 이미지를 container로 구동했습니다.

 

1) windows_server_2022 평가판 ISO 다운로드합니다

2) 다운로드한 ISO와 Hyper-V를 사용해서 가상 컴퓨터를 생성합니다.

  • 가상 컴퓨터 설정 요약 

  • 가상 컴퓨터를 실행 후 연결하여 정상적으로 설치되었는지 확인합니다.

3) Host 컴퓨터 가상 컴퓨터를 대상으로 중첩 가상화 설정을 추가합니다.

Set-VMProcessor -VMName "windows-server-2022" -ExposeVirtualizationExtensions $true

 

4) 가상 컴퓨터에 Container 관련 Windows Feature를 추가합니다.

Install-WindowsFeature -Name Hyper-V
Install-WindowsFeature -Name Containers

 

5) 가상 컴퓨터에 Windows Server 용 Docker CE를 설치합니다.

Invoke-WebRequest -UseBasicParsing "https://raw.githubusercontent.com/microsoft/Windows-Containers/Main/helpful_tools/Install-DockerCE/install-docker-ce.ps1" -o install-docker-ce.ps1
.\install-docker-ce.ps1
  • docker 명령어 정상 실행을 확인합니다.

 

 

가상 컴퓨터에서 Docker 빌드하기

1) "실행 Application 만들기" 단계에서 게시했던 ASP.NET Application의 결과물을 가상 컴퓨터로 이동합니다.

2) 가상 컴퓨터에 Dockerfile을 생성합니다.

# windowsservercore-ltsc2022 이미지에 ASP.NET 프로그램을 실행할 수 있도록 가공된 이미지를 받아옵니다.
## 설치된 내용
### Windows Server Core as the base OS
### IIS 10 as Web Server
### .NET Framework (multiple versions available)
### .NET Extensibility for IIS
FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8-windowsservercore-ltsc2022

# IIS의 기본 웹 루트 폴더를(/inetpub/wwwroot) 작업 디렉토리로 설정합니다.
WORKDIR /inetpub/wwwroot

# ASP.NET Application 의 게시 결과물을 현재 디렉토리에 복제합니다.
COPY ./{ASP.NET Application 의 게시 결과물이 존재하는 폴더}/ .

# IIS 기본 포트(80번)를 외부로 노출합니다.
EXPOSE 80

3) Dockerfile을 사용해서 빌드합니다.

docker build -t my-aspnet-app .

4) 빌드된 이미지를 실행합니다.

docker run -p 80:80 -d my-aspnet-app:latest

 

5) 80 포트로 정상 접근 확인합니다.


마치며

Windows Container의 경우 Linux Container에 비해서는 아직 부족한 점이 있지만

무언가의 이유로 인해 Windows에서 벗어날 수 없는 경우에는 Windows OS를 사용하면서 Container 환경으로 갈 수 있는 좋은 방법 중 하나가 될 수 있을 것으로 보입니다.

 

예제에서는 간단하게 설명하기 위해 Dockerfile을 간소화했지만,

Windows COM 모듈 설치나, IIS 설정, Windows registry 설정 등

Application 실행을 위해 필요한 작업을 미리 Dockerfile 내부에서 정의해 놓을 수 있다면

 

Windows 개발 / 운영 환경 구축 및 관리에 필요한 리소스를 크게 단축할 수 있을 것으로 보입니다.

Windows 개발자 분들께 도움이 되길 바라며 이만 글을 마치겠습니다.

 

감사합니다.


참조

댓글