Mac에서 Docker Desktop 사용하지 않고 Docker 사용하기 (feat. minikube)

Image: Docker Desktop by Docker Inc.

Docker에서 얼마 전 맥/윈도우에서 Docker를 쉽게 사용할 수 있게 도와주는 Docker Desktop을 제품을 250명이 넘는 회사에서 사용하는 경우 유료로 전환하겠다고 밝혔습니다. 윈도우/맥 개인사용자는 해당사항이 없으며 계속 무료로 사용할 수 있습니다. 250명 이상의 기업 사용자들에 대한 라이센스 변경은 21년 8월 31일부터 적용되고, 내년 1월(22년 1월 31)까지 유예되며 유예기간 이후에는 돈을 내고 사용해야 합니다.

Docker 자체는 오픈소스 프로젝트이기 때문에 Docker가 유료화 되는 것은 아닙니다. (Docker CLI/Docker Engine/Docker Compose 등은 기존과 동일하게 오픈소스 라이선스로 사용할 수 있습니다). Docker의 심장이라고 할 수 있는 Docker Engine는 리눅스에서만 구동되기 때문에 윈도우/맥에서 사용하기 위해서는 리눅스 VM을 생성하고 Docker를 설치하고 세팅하는 복잡한 과정이 필요합니다. 이런 귀찮은 과정을 한번에 해주는 제품이 바로 Docker Desktop입니다.

따라서 Docker Desktop이 필요 없는 리눅스 사용자들과 Docker Desktop을 사용하지 않고 Docker 환경을 따로 세팅한 윈도우/맥 유저는 해당사항이 없습니다.

이 글에서는 이번에 유료화 되는 Docker Desktop을 사용하지 않고 minikube를 이용해 맥에서 Docker를 사용할 수 있는 방법에 대해 살펴보려고 합니다.

그 전에 몇 가지 다른 대안들도 소개해 드립니다. 기본적으로 리눅스 VM을 세팅하고 도커 엔진을 설치하는 것은 동일하기 때문에 이런 툴을 사용하지 않고 직접 VM을 세팅해서 사용하셔도 됩니다.

minikube

minikube는 리눅스/맥/윈도우에서 개발/테스트를 위한 Kubeneretes 클러스터를 쉽게 만들어 주는 프로젝트입니다.

공식 문서가 매우 잘 되어 있기 때문에 문서를 따라하시면 쉽게 설치할 수 있습니다. 공식 문서를 따라가면서 필요한 설정들을 살펴보려고 합니다.

공식 문서: https://minikube.sigs.k8s.io/docs/start/

Driver 정하기

먼저 Linux VM를 설치할 드라이버를 정해야 합니다. 공식 문서 https://minikube.sigs.k8s.io/docs/drivers/ 에 지원하는 Driver가 잘 설명되어 있습니다.

Host 폴더를 컨테이너에 마운트(-v 옵션)하는 것이 필요하다면 hyperkit 대신 Virtualbox, VMWare, Parallels를 사용하는 것을 추천드립니다. (참고:
https://minikube.sigs.k8s.io/docs/handbook/mount/#driver-mounts)

별도의 설정이 없으면 기본값은 docker를 사용하게 되는데, 목적은 docker를 사용하지 않는 것이기 때문에 이 글에서는 Host file sharing이 편리한 virtualbox를 사용하려고 합니다.

설치하기

먼저 Virtualbox를 다운받아 설치해 줍니다. https://www.virtualbox.org/wiki/Downloads

docker-clidocker-compose, minikube, docker-credential-helper를 설치합니다.

$ brew install docker
$ brew install docker-compose
$ brew install minikube
$ brew install docker-credential-helper

AWS ECR 로그인이 필요하다면 brew install docker-credential-helper-ecr 를 함께 설치합니다.

minikube 클러스터를 생성합니다. 드라이버 기본값이 docker이기 때문에 virtualbox 옵션을 명시해 줍니다.

$ minikube start --driver=virtualbox
😄  minikube v1.22.0 on Darwin 11.5.2
✨  Using the virtualbox driver based on user configuration
👍  Starting control plane node minikube in cluster minikube

🔥  Creating virtualbox VM (CPUs=2, Memory=4096MB, Disk=20000MB) ...

클러스터 생성이 완료되면 기본 driver를 virtualbox로 설정해 줍니다.

$ minikube config set driver virtualbox

VM을 생성할 때 2cpu, 4G memory, 20G disk를 기본값으로 생성하게 됩니다.
minikube config로 기본 설정을 변경할 수 있습니다. (재시작 필요)

참고: https://minikube.sigs.k8s.io/docs/commands/config/

$ minikube config set memory 4096
$ minikube config set cpu 2
$ minikube config set disk-size 20000mb

Docker 사용하기

Docker CLI에서 방금 설치한 minikube를 사용할 수 있도록 설정합니다.

$ eval $(minikube docker-env)

docker ps로 아래와 같이 Kubernetes 관련 컨테이너들이 나오면 성공입니다.

$ docker ps
CONTAINER ID   IMAGE                    COMMAND   ...
9135728194c1   6e38f40d628d             "/storage-provisioner"
ba92b0c5b14c   k8s.gcr.io/pause:3.4.1   "/pause"
...

만약 새로운 터미널 세션을 열었을 때 자동으로 Docker 환경을 사용할 수 있게 하고 싶다면 아래 명령을 선호하는 쉘에 따라 ~/.bashrc 혹은 ~/.zshrc 등의 rc 파일에 추가해 줍니다. 새로운 터미널 세션을 열었을 때 minikube 클러스터가 실행중이어야 합니다.

minikube status > /dev/null && eval $(minikube docker-env)

Podman

Docker-cli와 호환되는 podman도 사용할 수 있습니다.

※ 현재 minikube의 리눅스 VM에 설치되는 podman의 버전이 낮아 v2를 설치해서 사용하셔야 합니다. (참고: https://github.com/kubernetes/minikube/pull/11727)

$ eval $(minikube podman-env)

Hello world를 실행해 테스트해 봅니다. Hello from Docker! 메시지가 나오면 성공입니다.

$ podman run --rm docker.io/library/hello-world
Trying to pull docker.io/library/hello-world:latest...
...

Hello from Docker!

Host mount 확인하기

minikube ssh 명령을 사용해서 현재 실행중인 리눅스 VM에 ssh로 접근할 수 있습니다.

$ minikube ssh
                         _             _
            _         _ ( )           ( )
  ___ ___  (_)  ___  (_)| |/')  _   _ | |_      __
/' _ ` _ `\| |/' _ `\| || , <  ( ) ( )| '_`\  /'__`\
| ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )(  ___/
(_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)
$

minikube는 지원되는 driver에 대해 host file mount를 기본으로 제공합니다. Mac에서는 Virtualbox, VMWare Fusion을 사용하는 경우 /Users 경로를 기본으로 사용할 수 있습니다. (참고: https://minikube.sigs.k8s.io/docs/handbook/mount/#driver-mounts)

터미널에서 /Users 경로를 확인해보면 Linux VM에 호스트의 경로가 마운트 되어 있는 것을 확인할 수 있습니다.

$ ls /Users/
Shared	bskim

기존에 사용하던 것 처럼 -v bind mount를 사용할 수 있습니다.
(/Users 이외의 경로를 사용하고자 하는 경우 별도로 설정해주어야 합니다)

$ docker run --rm -it -v "$(pwd):/app" busybox "ls /app"
hello.txt	world.txt

클러스터 관리하기

# 클러스터 일시정지
$ minikube pause
# 클러스터 재개
$ minikube unpause

# 클러스터 시작
$ minikube start
# 클러스터 멈춤
minikube stop

# 클러스터 삭제
$ minikube delete

이 외에도 다양한 기능을 handbook에서 확인할 수 있습니다.
https://minikube.sigs.k8s.io/docs/handbook/