수 많은 우문은 현답을 만든다

Docker for windows 본문

개발지식/Docker

Docker for windows

aiden.jo 2021. 1. 6. 14:58

안녕하세요 조영호입니다 :)

오늘은 Docker engine을 windows 운영체제에 설치해본 경험을 포스팅하고자 합니다.

기본적으로 Docker는 CE/EE로 구분되며 CE는 개발용 (not for production), Docker EE는 프로덕션 용으로 사용됩니다. 참고로, Windows Server 2016/2019에는 라이센스가 무료로 포함되어 있습니다. Docker, Inc. 는 공식적으로 Windows Server를 프로덕션 용으로 지원하고 있습니다. 다음은 공식홈페이지에서 발췌한 내용입니다.

"Docker Engine is the industry’s de facto container runtime that runs on various Linux and Windows Server os." 

 

또한 도커사는 pricing policy에 따라 Docker EE support를 지원하고있습니다. 2016년 Docker, Inc. 는 프로덕션을 위한 docker for windows를 발표한 적이 있습니다. 그러나 이 내용은 windows OS애서 windows container만 안정적으로 배포할 수 있음을 의미합니다. 이에 따라 Windows에서도 리눅스 컨테이너 환경을 제공하기 위해 2017년에 LinuxKit을 개발했습니다.

 

그러나 제가 보기에는 아직 불안정해보입니다. 왜냐하면 Docker for windowsLinuxKit은 아직도 많은 이슈 티켓들이 올라오고 있으며 계속 Bug fix중이기 때문입니다. 실제로 리눅스 컨테이너를 쓰기 위해서는 “실험모드”로 도커엔진을 켜야합니다.

조사에 따르면 도커는 마이크로소프트와 파트너쉽 맺고 docker for windows 기술 지원을 Microsoft에서 제공합니다. 하지만 MS 공식적으로 다음과 같이 말합니다. “LCOW (Linux Containers on Windows) 기능은 현재 개발 중입니다”. 다음은 도커 프로젝트에 참여하고있는 개발자들의 코멘트입니다.
"Kralizek : LCOW Moby 프로덕션 도구보다 개발자 도구입니다. (2019.10)"
"nebuk89 : LCOW 아시다시피 아직 실험적이며 동안 계속되었습니다. (2020.04)"

현재 ms, docker 양사는 windows 10 주력하고 있으며 windows server Docker EE 이상 Docker, Inc. 소유가 아니라 Mirantis 소유하고 있으므로 LCOW 관련된 계획은 없다 합니다. (stephen-turner 2020.05)

*결론은, 윈도우서버에서 프로덕션으로 리눅스 킷을 쓰기에는 무리가 있다 입니다.

 

1. 도커 설치

기본적으로 도커의 설치 형식은 ToolBox, CE, EE 로 구분 됩니다.

도커 엔진은 기본적으로 linux kernel을 공유하고 그 위에 linux container를 생성합니다. 

 

현재는 Docker CE는 Windows 10 Pro, Enterprise, Education에 설치 가능하고 Docker EE는 Windows server 2016 에서 부터 설치 가능하다고 합니다. 참고로 Windows server에는 Docker EE license가 포함되어있어서 간단하게 Powershell command로 설치가 가능합니다. 이 외의 버전, 예를 들어 windows 7, windows server 2012 등에서는 Docker CE의 이 전 버전인 Docker ToolBox를 설치해야합니다.

 

2. 고객사 환경

필자의 첫 번째 windows os만 사용하는 고객사는 windows 10을 제공해주었습니다. 그래서 Docker CE engine을 설치해서 컨테이너를 구동했고 별 다른 문제가 없었습니다. 하지만 두번쨰 windows os만 사용하는 고객의 경우에는 조금 어려움이 있었습니다.

 해당 고객은 windows server 2008을 제공해주었는데 일단 2016 이전 버전이므로 Docker EE를 설치할 수 없었고 Docker ToolBox를 설치했습니다. ToolBox는 windows os에서  hypervisor 사용하는데 Toolbox 설치시 함께 설치되는 Oracle vm.exe를 사용해 가상 머신을 만들 수 있다. 기본적으로 Oracle vm에서 default머신(리눅스) 띄워서 도커를 실행하는데 함께 설치되는 QuickStartDocker.exe를 실행하면 default머신이 구동된다.

 

 그러나 필자의 경우 default vm이 구동되는 순간 windows server 2008이 강제 종료되는 현상이 발생했다. 알고보니 고객이 준 서버가 이미 Guest OS라고 한다. vm에서 또 vm을 띄우려 하니 시스템 에러가 난 것으로 의심이 되어 고객에게 새로운 서비스를 요청해서 Windows server 2019 (v.1809)를 제공 받았다.

 

 이번에는 ToolBox가 아닌 PowerShell로 Docker EE를 2019 서버에 설치했다. 우선 windows os 에서 컨테이너를 실행하려면 Containers기능 을 활성화 시켜야 한다.

Install-WindowsFeature -Name Containers

Restart-Computer -Force  

그리고 나서 Docker를 설치한다.

Install-Module -Name DockerMsftProvider -Repository PSGallery -Force

Install-Package -Name docker -ProviderName DockerMsftProvider -Force -RequiredVersion 19.03  

Start-Service docker  

 

3. 리눅스 컨테이너 활성화

고객사 환경으로 docker image를 pull하고 실행을 해보자. docker pull을 하면 다음과 같은 에러가 발생한다.

[image operating system "linux" cannot be used on this platform]

이 내용의 의미는 Docker for Windows에서는 기본적으로 window os 를 베이스로 하는 window container를 사용하게 되어있는데 나의 이미지는 Linux os를 베이스로 하는 이미지이기 때문에 Linux container를 생성할 수 없다는 이야기다. 이런 경우에는 linuxKit을 설치해야하고 실험모드로 Docker를 실행시켜야 한다. Windows 10 desktop에서는 쉽게 Docker를 우클릭해서 container 실행환경을 swich할 수 있다.

 

4. 하이퍼바이저와 중첩 가상화

다시 끌어온 이미지로 컨테이너를 생성해보았다. 이번에는 다음과 같은 에러가 발생했다.

[docker: Error response from daemon: failed to start service utility VM (createreadwrite): hcsshim::CreateComputeSystem 0ce..95_svm: The request is not supported.]

이 내용의 의미는 windows os에서 linux container를 쓰려면 하이퍼바이저 기능이 필수인데 설치되지 않았거나 기능이 꺼져있다는 의미이다. 실제로 서비스에 가서 hyper-v 서비스를 켜면 장치 동작 에러가 발생한다.

Hyper-v 장치가 있는지 확인하기 위해서 CMD를 열고 systeminfo를 입력한 뒤 맨 아래 줄을 보면 일반적으로는 Hyper-V 기능들이 활성화 되었는지 나와야 하지만 필자의 경우에는

Hyper-V 요구 사항:      

 하이퍼바이저가 검색되었습니다. Hyper-V에 필요한 기능이 표시되지 않습니다.

라고 출력되었다.

 

이를 해결하기 위해서는 Host vm에서 Guest vm에도 가상화가 되도록 중첩 가상화를 실행해줘야한다. 그리고 Hyper-v를 설치해준다.

서비스에 들어가보면 "Hyper-v 가상 컴퓨터 관리"가 중지에서 실행으로 바뀐 것을 확인할 수 있다. 드디어 정상적으로 컨테이너가 도는 것을 확인할 수 있다.

 

종합적으로 정리하자면, Windows server에서 리눅스용 컨테이너를 동작시키려면

1. LinuxKit을 설치해야 한다.

2. Docker Engine은 실험 모드로 실행되어야 한다.

3. Hyper-v 설치 및 기능이 활성화 되어야 한다.

4. vm위의 vm인 경우 중첩 가상화를 Host vm에서 설정해주어야 한다.

 

 

5. 컨테이너 생성 에러

필자가 가지고 있는 컨테이너는 4개 (front, server, db, deploy)로 모두 Windows server 2019에서 구동시키려고 했다. 3개의 컨테이너는 정상 구동이 되지만 server만 구동되지 않았다. deploy와 server 모두 springboot로 구성되어있으니 java instal이나 springboot의 문제는 아니다. 또한 windows 10에서는 정상적으로 모두 구동되는 컨테이너들임을 확인 했다.

 

Docker engine의 로그를 보니(실험모드로 하면 로그를 실행 창에서 볼 수 있다) 다음과 같은 메세지들을 발견할 수 있었다.

level=debug msg="process exited" exitCode=1 
spanID=c965161a44ecfb80 traceID=b886f65dd1ec8ab686c0753a47189264

-> 컨테이너 실행시 실행에러가 발생해서 종료되었습니다 (code 1)

level=debug msg="failed to shutdown container, terminating it" 
error="container da55af731a8fc9c007fa56de encountered an error during hcsshim::
       System::waitBackground: 
       failure in a Windows system call: 
       The virtual machine or container with the specified identifier is not running. 
       (0xc0370110)" module=libcontainerd namespace=moby
       
-> 종료되는 과정에서 microsoft hcsshim 관련 에러가 발생해서 컨테이너를 삭제합니다.

 

필자는 windows os에서 에러가 발생했다고 판단했고 관련 레퍼런스들을 찾아봤지만 문제나 해결 방법이 아직 없어보였다. 그래서 리눅스 VM을 다시 받아서 똑같이 환경을 구축해보았는데 같은 문제로 컨테이너가 종료되었다. 왜일까?

 

부팅 후 10초 이내로 사라지는 컨테이너의 헬스체킹을 위해서 실시간으로 컨테이너의 로그를 찍어보았다. 이럴수가, spring이 부팅될때 vpn에 연결 되어야만 접근할 수 있는 사내 DB의 datasource URL을 application.properties가 가지고 있었기 때문에 connection fail이 발생했던 것이다. mysql 컨테이너를 바라보게 함으로써 해결을 했으나 개인적으로 window server에서 완벽히 구동시켜보지 못한게 다소 아쉽다.

 

감사합니다.

'개발지식 > Docker' 카테고리의 다른 글

docker for windows 이론  (0) 2021.01.12