Windows 10 Home에 Docker 설치하기

Windows 10에 Docker를 설치하는 잘 알려진 방법은 "Docker Desktop"을 설치하는 것입니다. 이 방법이 현재 가장 권장하는 방법입니다.
이 방법의 제약은 Windows 10 Professional 이상에 설치 가능하고 Windows 10 Home에는 설치가 안 된다는 점입니다. 레지스트리를 수정하면 할 수는 있는데, 굳이 그렇게까지. 개인적으로 이 방법을 꺼리는데, 설치 패키지 파일 크기가 약 900MB이고 뭔지 모를 파일이 참 많이 생기기 때문입니다.

그래서, Docker를 수동으로 설치하는 방법을 소개합니다. 가장 큰 장점은 Windows 10 Home에도 설치할 수 있다는 점이고, 약간의 장점은 약 100MB 저장공간만 사용한다는 점입니다. 단점은, 이 방식은 Hyper-V와 LCOW(Linux Container on Windows 10)를 이용하여 실행되는데, 이 실행 방식은 컨테이너를 종료할 때(만) 약간 불안정한 느낌이 있다는 겁니다. 하지만 다른 실행 방식도 불안정하긴 마찬가지인 것 같습니다. 아직 Docker for Windows 10은 어느 실행 방식이든, 개발용으로 이용하는게 맞고 안정적인 서비스를 위해 이용하기엔 이릅니다. Hyper-V와 LCOW를 이용하는 실행 방식은 장점도 있습니다. 그건 맨 아래에.

순서는 아래와 같습니다.
1. Windows 10 Home에 Hyper-V와 Containers feature 활성화
2. Docker, lcow 파일 다운로드 및 복사
3. config 파일 준비 및 실행

아래 2가지 설치 명령을 이용합니다. CMD를 관리자 권한으로 실행한 후에 설치 명령을 이용해야합니다.

Windows 10에 Hyper-V feature 설치 (InstallHyperV.bat)

pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL
pause

Windows 10에 Containers feature 설치 (InstallContainers.bat)

pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*containers*.mum >containers.txt
for /f %%i in ('findstr /i . containers.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del containers.txt
dism /online /enable-feature /featurename:Containers -All /LimitAccess /ALL
pause

설치 후 윈도우즈 설정에서 아래 그림과 같이 Hyper-V와 Containers를 활성화된 상태로 둡니다.

windows10_features_containers.pngDocker 최신 개발 버전을 이용합니다. 안정 버전도 좋습니다만, 안정 버전이 별 의미는 없는 것 같습니다.

Docker for Windows 다운로드

아래 파일을 다운로드 받습니다. 묶음을 풀면 안에 docker 디렉토리가 있습니다. 이 디렉토리를 C:\Program files 디렉토리 아래에 둡니다. C:\Program files\docker\dockerd.exe 가 있는지 확인합니다.

https://master.dockerproject.org/windows/x86_64/docker.zip

위 파일 대신 다른 버전의 파일을 이용해도 됩니다.

https://download.docker.com/components/engine/windows-server/19.03/docker-19.03.5.zip

https://download.docker.com/win/static/stable/x86_64/docker-17.09.0-ce.zip

LCOW (kernel, initrd.img) 다운로드

아래 웹 페이지에 방문하여 release.zip 파일을 다운로드 받습니다. 묶음을 풀면 안에 kernel, initrd.img 파일이 있습니다. C:\Program Files\Linux Containers 디렉토리를 만들고 두 파일을 디렉토리 아래에 둡니다. C:\Program Files\Linux Containers\initrd.img 가 있는지 확인합니다.

https://github.com/linuxkit/lcow/releases

dockerd.exe 실행

CMD를 관리자 권한으로 실행한 후에 아래 명령을 이용합니다. UNIX 환경에서 Docker를 실행할 때 /var/lib/docker 에 다양한 파일을 생성하게 됩니다. --data-root는 이 디렉토리를 설정할 때 씁니다. 저는 C:\Program Files\Docker\var-lib-docker 디렉토리로 설정했습니다. 기본값은 C:\ProgramData\Docker 입니다. Docker를 이용하다보면 이 디렉토리에 크고 많은 파일을 두기 때문에 저장공간을 많이 차지 하게 됩니다. --experimental 옵션이 꼭 필요합니다.

set LCOW_SUPPORTED=1
"C:\Program Files\docker\dockerd.exe" -D --data-root "C:\Program Files\docker\var-lib-docker" --experimental

docker.exe 실행

CMD를 관리자 권한으로 실행한 후에 아래 명령을 이용합니다. 출력 내용 중에 Default Isolation: hyperv 가 있는지 확인합니다.

C:\Program Files\docker\docker.exe info

잘 실행되는 것을 확인했으면 dockerd를 종료합니다.

Config file 생성

매번 command line 옵션을 지정하는 건 번거로우니 config 파일을 만듭니다. dockerd를 이렇게 실행하게 됩니다.

"C:\Program Files\Docker\dockerd.exe" --config-file "C:\Program Files\docker\daemon.json"

daemon.json 파일의 내용은 아래와 같습니다.

{
"data-root": "C:\\Program Files\\docker\\var-lib-docker",
"experimental": true,
"debug": false,
"log-level": "fatal"
}

docker pull

이제 원하는 Docker image를 받아 이용합니다. 예를 들면,

C:\> docker pull fedora:32
C:\> docker run -i -t --name fedora32 -p 22:22 -p 80:80 -p 443:443 -p 3000-3009:3000-3009 -p 5900:5900 -p 5901:5901 -v C:\data:/data fedora:32

저는 Fedora를 권장합니다. 위 명령은 22, 80, 443, 3000~3009번 포트를 도커 컨테이너에게 열어줍니다. 저는 Perl 과 Dancer2 를 이용해 웹 사이트를 만들 거라 80, 443, 3000~30009번 포트를 열었습니다. ssh 접속도 할거라 22번 포트를, X Window System과 VNC를 이용할 거라 5900, 5901번 포트를 열었습니다. 윈도우즈와 파일도 주고 받을 거라 C:\data 를 /data 로 마운트 하였습니다.

docker_windows10_20200503.png이 스크린샷은, 컨테이너 안의 GNU/Linux에서 Perl로 그래프를 만들어 /data 디렉토리에 넣은 것을, 호스트인 윈도우즈의 C:\data 디렉토리에서 확인하고 열어본 화면입니다.

sudo 오류 메시지

컨테이너 안에 게스트 운영체제로 GNU/Linux를 쓰다가 sudo 실행 시 오류를 본다면 아래와 같이 설정을 합니다. 무시해도 됩니다.

echo "Set disable_coredump false" >> /etc/sudo.conf

Hyper-V(그리고 LCOW)를 이용하는 실행 방식의 장점

게스트 운영체제로 Windows 10을 사용하는 컨테이너와 Linux를 사용하는 컨테이너를 동시에 만들고 실행할 수 있습니다.