지난 2월, 도커 데스크탑이 유료화되었다. 회사에서는 이미 사내 공지를 통해 유료 플랜을 구독하거나, 대체재인 minikube를 사용하라고 안내하고 있다.

docker-desktop-pricing

도커 데스크탑이 유료화된다고?!

유료화 소식에 화들짝 놀라 평소 도커를 얼마나 사용하고 있는지 확인해보았다. 로컬 환경에 DB 또는 캐시 서버 등을 설치하지 않고 컨테이너로 가볍게 해결하고 있던 프로젝트가 생각보다 많았다. 최소 구독 상품인 Pro 플랜을 구독해야겠다고 마음을 먹었다.

그러던 중 팀원들이 개발 서버에 도커를 설치해 사용하고 있다는 이야기를 들었다. 개발 서버는 게이트웨이를 통해야 접속할 수 있다. 로컬에서 작업한 내용을 개발 서버에서 구동하거나, 로컬에서 구동 중인 애플리케이션이 개발 서버에 띄워둔 컨테이너에 접근해야 할 텐데, 방법은 있겠지만 설정 방법이 복잡할 것 같다. 같이 돈으로 해결하자고 팀원들을 꼬드겨 보았지만 괜찮단다. 왜죠? 회사에서 사주는 건데?

i-do-not-need

#김성모 #드리겠습니다 #필요없어

혼자 구독 신청을 해도 되겠지만, 불편함을 감수하고 개발 서버에 컨테이너를 띄워 사용하고 있을 팀원들의 생산성 향상을 위해 대체재를 확인해보기로 했다.

1. minikube

사내 공지를 통해 언급되었던 미니큐브(minikube)는 로컬 머신에 작은 쿠버네티스 환경을 구성해 컨테이너를 구동할 수 있게 해준다.

먼저 문서를 읽어보았다. 한숨이 나온다. NKS, NCR을 개발할 때 쿠버네티스와 친해졌다고 생각했는데, 그게 벌써 2년 전 일이다. 이미 기억이 가물가물하다. 디플로이먼트를 구성해 팟을 띄우고, 서비스를 설정하고… 음… 벌써부터 복잡하다. 단순히 mysql 컨테이너를 하나 띄우려는데 쿠버네티스 환경을 꾸미자니 배보다 배꼽이 크다는 생각이 든다. 게다가 쿠버네티스 환경을 만들 VM이 필요하단다. 차라리 리눅스 VM에 도커를 설치해서 사용해도 될 것 같다. 어?! VM?

2. Virtaul Box

도커 엔진은 리눅스에서만 구동된다는 사실을 잊고 있었다. macOS 또는 윈도우에서 도커를 사용하기 위해서는 리눅스 VM을 만들고 도커 환경을 구성해야 한다. 이런 과정을 원클릭으로 처리해주는 것이 도커 데스크탑이다. 그렇다면 도커 데스크탑이 대신해주는 작업을 한 땀 한 땀 멀티 클릭으로 직접하면 된다. 리눅스 VM을 만들고, 도커 구동 환경을 구성하는 익숙한 작업이다. 쉽게 해결될 것 같다. 그런데…

unsupported

애플실리콘이 뭔가요? 그런거 몰라요.

오픈소스 VM 관리자인 Virtual Box는 아직 애플 실리콘을 지원하지 않는다고 한다. 애플 실리콘 맥북을 받은지 채 한달이 지나지 않았다. 현재 애플 실리콘을 지원하는 VMM은 패러렐즈뿐이다. 월 5달러를 아끼려고 연 79.99달러짜리 플랜을 구독할 수는 없는 노릇이다.

3. multipass

멀티패스(multipass)는 우분투를 배포하는 캐노니컬에서 만든 경량 크로스 플랫폼 VMM이다. 약 30초 정도면 바로 사용할 수 있는 우분투 VM을 만들어 준다. 여기에 도커만 설치하면 컨테이너를 구동할 수 있다.

multipass

홈브루를 이용해 multipass를 설치하고 VM을 만들어 보자.

// multipass 설치
$ brew install multipass

// VM 생성
$ multipass launch --name foo
Launched: foo

잠시 아스키 바람개비가 돌다가 구동이 완료되었다는 메시지가 나타난다. VM에 접속하면 우분투 셸이 환영해준다.

$ multipass shell foo
Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-105-generic aarch64)
...
Last login: Mon Apr 11 17:37:08 2022 from 192.168.64.1
ubuntu@foo:~$ sudo apt update
ubuntu@foo:~$ sudo apt install -y docker.io
ubuntu@foo:~$ sudo groupadd docker
ubuntu@foo:~$ sudo usermod -aG docker $USER
ubuntu@foo:~$ newgrp docker 
ubuntu@foo:~$ exit

바로 도커를 설치하고, 사용자 설정까지 일사천리로 진행하고 나서 쿨하게 뒤도 돌아보지 않고 VM에서 나왔다. 도커는 잘 설치되었을 것이다. 로컬 환경에서 VM의 도커를 실행해보았다.

$ multipass exec foo -- docker -v
Docker version 20.10.7, build 20.10.7-0ubuntu5~20.04.2

모든 것이 계획대로다. 이제 nginx 컨테이너를 구동하고, 로컬에서 VM의 IP로 접근해 보자.

// nginx 컨테이너 구동
$ multipass exec foo -- docker run -d -p 8080:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
...
Digest: sha256:2275af0f20d71b293916f1958f8497f987b8d8fd8113df54635f2a5915002bf1
Status: Downloaded newer image for nginx:latest
98ef601a13cb1f3529e7ef2c7dd178521c02a73fc377b0ee14333e27f5c583ee

// 컨테이너 확인
$ multipass exec foo -- docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
98ef601a13cb   nginx     "/docker-entrypoint.…"   30 seconds ago   Up 29 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   goofy_satoshi

// VM IP 확인
$ multipass list
Name    State       IPv4            Image
foo     Running     192.168.64.8    Ubuntu 20.04 LTS
                    172.17.0.1

$ curl 192.168.64.8:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
...

잘 된다. multipass exec {vm-name} -- docker를 alias 설정하여 docker 명령을 대체하면 기존과 동일하게 사용할 수 있을 것이다.

$ alias docker="multipass exec foo -- docker"

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    fd3d31a07ae6   12 days ago   134MB

몇 가지 과정을 거치긴 했지만 어렵지 않게 도커 환경을 구축하고, 로컬에서 기존과 동일하게 사용할 수 있게 되었다. 로컬 머신의 디렉토리를 VM의 동일한 경로에 마운트하면 컨테이너를 구동할 때도 사용할 수 있다.

multipass mount {path} {vm-name}:{path}

합격이다.

4. podman

팟맨(podman)은 레드햇이 주도적으로 개발하고 있는 오픈소스 컨테이너 런타임 인터페이스다. 도커 엔진 대신 팟맨이 컨테이너를 띄우고 관리해준다. 쿠버네티스의 런타임으로도 사용할 수 있다. 도커 데스크탑이 아닌 도커의 대체재라고 할 수 있다.

podman

도커 데스크탑처럼 원클릭으로 설치되는 것은 아니지만 멀티패스보다는 간단하다.

// podman 설치
$ brew install podman

// podman vm 생성 및 구동
$ podman machine init
$ podman machine start

500MB가 넘는 페도라 이미지를 다운로드하기 때문에 시간이 좀 걸린다. VM이 시작되면 이제 컨테이너를 구동할 수 있다. 역시 nginx 컨테이너를 구동해보았다.

$ podman run -d -p 8080:80 nginx
Resolving "nginx" using unqualified-search registries (/etc/containers/registries.conf.d/999-podman-machine.conf)
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
...
Writing manifest to image destination
Storing signatures
b032f4dbcc22d6b0c07a2fb7e11faf773d674ae93e3422536093bea9d3e5e121

커맨드가 도커와 동일하다. 멀티패스처럼 alias 설정으로 docker 명령을 대체하면 편리하게 사용할 수 있다.

컨테이너에 접근하기 위해 VM의 IP를 이용해야했던 멀티패스와는 달리 팟맨의 컨테이너에는 localhost로 접근할 수 있다.

$ curl localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
...

여기까지만 보면 팟맨이 훨씬 좋아 보인다. 그러나 VM에 로컬 디렉토리를 마운트하는 것이 자유롭지 않다. 구동 중인 머신에는 마운트할 수 없고, 초기화 단계에서 설정해야 한다.

$ podman machine init -v ${HOME}:${HOME}
$ podman machine start
Starting machine "podman-machine-default"
INFO[0000] waiting for clients...
...
Mounting volume... /Users/nhn:/Users/nhn

로컬 디렉토리 마운트가 불편하긴 하지만 초기에 마운트 설정을 잘해주면 되기 때문에, VM을 간단히 설치할 수 있고 도커와 동일한 사용자 인터페이스를 제공하는 팟맨은 여전히 매력적인 대체재이다.

5. 그밖에…

LIMA(LInux virtual MAchine), UTM 등을 이용해 VM을 만들고 로컬의 도커 컴포저와 연동해 사용하는 방법도 있었으나, 설정 방법이 복잡해 보여 테스트해보진 않았다.

minikube와 비슷한 컨셉의 Rancher Desktop 도 있다. LIMA VM에 K8S의 경량화 버전인 K3S가 설치된다고 한다. 쿠버네티스 환경이 필요하다면 minikube와 함께 고려해볼 만한 선택지이다.

마치며…

몇 가지 테스트를 해보고 멀티패스를 사용하기로 했다. 컨테이너 접근성만 보자면 팟맨이 조금 더 좋긴 하지만, 멀티패스를 사용하면 컨테이너 구동 환경이 아닌 다른 목적의 VM도 가볍고 빠르게 만들 수 있다는 점이 가장 큰 이유이다.

세상에는 이미 도커 데스크탑의 다양한 대체재가 있고 각각 장단점이 있다. 필요한 용도에 맞게 선택해 사용하시라.