본문 바로가기
DevOps

도커 데스크탑 에서 minikube + hyperkit 조합으로 갈아타기

by chaani 2021. 10. 30.
본 포스팅은 맥 환경(macOS Big Sur)을 기준으로 작성되었습니다.

도커 데스크톱 삭제 하기

먼저 기존에 사용하던 도커 데스크톱을 삭제합니다.

 

도커 데스크톱 창을 띄워 우측 상단에 벌레 모양(?)의 버튼을 눌러서 Troubleshoot 메뉴로 진입한 후

아래에 보이는 Uninstall 버튼을 클릭하여 진행할 수 있습니다.

또는 터미널 상에서 brew 패키지 관리자를 통해 삭제할 수도 있습니다.

 

brew uninstall docker

 

다만 위 두 방법을 통해 도커 데스크톱 삭제를 진행하는 경우 도커 환경을 구성하기 위해 필요했던 모든 툴들이 함께 삭제됩니다.

(Docker daemon, Hyperkit, Docker CLI 등)

 

 

Hyperkit 설치

도커 데스크톱을 삭제하면서 가상화 머신 또한 함께 삭제되었기 때문에 다시 설치를 진행합니다.

 

VirtualBox, VMware, Podman 등 여러 가상화 머신을 설치할 수 있지만 여기서는 기존 도커 데스크톱에서도 사용되었고 맥 환경에서 경량 가상화 머신으로 많이 사용되는 Hyperkit을 설치하겠습니다.

 

 

brew install hyperkit

 

잘 설치되었는지 확인해보기 위해 버전을 찍어봅니다.

 

❯ hyperkit -v
hyperkit: v0.20210107-9-gacbc2d

Homepage: https://github.com/docker/hyperkit
License: BSD

 

 

도커 CLI 설치

도커 빌드 및 실행과 같은 기본적인 도커 명령어 사용을 위해 필요한 도커 CLI 또한 설치해줍니다.

 

brew install docker
'brew install --cask docker'을 실행하는 경우 앞서 애써 지웠던 도커 데스크톱이 다시 설치되니 주의해야 합니다.

 

'docker info'를 찍어 CLI가 잘 설치되었는지 봅니다.

(도커 데몬(daemon) 설정이 안 되어있음을 확인할 수 있습니다.)

 

❯ docker info
Client:
 Context:    default
 Debug Mode: false
Server:
ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

 

 

Minikube 설치

이제 도커 데몬을 내장하고 있는 Minikube(로컬 환경에서 구동 가능한 쿠버네티스 클러스터)를 설치합니다.

 

brew install minikube

 

설치가 모두 끝나면 minikube를 구동해봅니다!

 

> minikube start --driver=hyperkit


😄  minikube v1.23.0 on Darwin 11.5.2
    ▪ MINIKUBE_ACTIVE_DOCKERD=minikube
✨  Using the hyperkit driver based on user configuration
👍  Starting control plane node minikube in cluster minikube
💾  Downloading Kubernetes v1.19.14 preload ...     
    > preloaded-images-k8s-v12-v1...: 470.78 MiB / 470.78 MiB  100.00% 6.17 MiB
🔥  Creating hyperkit VM (CPUs=6, Memory=12288MB, Disk=20000MB) ...
❗  This VM is having trouble accessing https://k8s.gcr.io
💡  To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/
🐳  Preparing Kubernetes v1.19.14 on Docker 20.10.8 ...
    ▪ Generating certificates and keys ...
    ▪ Booting up control plane ...
    ▪ Configuring RBAC rules ...
🔎  Verifying Kubernetes components...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Enabled addons: storage-provisioner, default-storageclass
❗  /usr/local/bin/kubectl is version 1.22.1, which may have incompatibilites with Kubernetes 1.19.14.
    ▪ Want kubectl v1.19.14? Try 'minikube kubectl -- get pods -A'
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

 

minikube 구동 도중에 에러가 발생하여 더 이상 진행할 수 없는 경우에는 Ctrl+C 로 빠져나온 후 아래 명령어를 입력하여 초기화한 후 다시 구동을 시도합니다.

 

minikube delete --all --purge

minikube start --driver=hyperkit

 

구동이 완료되면 minikube status 를 이용해 현재 실행 상태를 확인할 수 있습니다.

 

> minikube status
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

 

minikube에 사용되는 리소스를 수정하고 싶거나 가상화 드라이버를 고정해서 사용하고 싶다면 아래를 참고하시면 됩니다.

 

# 구동 시 할당되는 리소스 수정 (기본값 => cpu: 2 / memory: 2048)
minikube config set cpus 4
minikube config set memory 8192

# 구동 시 사용하는 가상화 머신을 항상 hyperkit으로 고정
minikube config set driver hyperkit

 

추가적으로 minikube 클러스터 내 쿠버네티스 자원들을 조회하려는 경우 kubectl 설치가 필요할 수 있습니다. (본 포스팅에서는 설치 과정은 생략합니다.)
그 외 좀 더 자세한 minikube 사용 가이드는 https://minikube.sigs.k8s.io/docs/handbook/controls/ 를 참고하시면 됩니다.

 

도커 데몬 설정

로컬에서 도커 CLI를 통해 minikube의 도커 데몬과 통신하기 위해 아래 명령어를 실행합니다.

 

eval $(minikube docker-env)
모든 터미널 세션에서 도커 CLI를 사용하기 위해 ~/.bashrc 또는 ~/.zshrc 파일에 위 명령어를 추가해주세요!

 

이후 다시 docker info 를 찍어보면 이제 정상적으로 도커 데몬 설정이 잡힌 것을 확인할 수 있습니다.

 

❯ docker info
Client:
 Context:    default
 Debug Mode: false
Server:
 Containers: 14
  Running: 14
  Paused: 0
  Stopped: 0
 Images: 10
 Server Version: 20.10.8
 Storage Driver: overlay2
  Backing Filesystem: extfs
 ...

 

 

그 외 도커 데스크톱을 사용했을 때와의 차이점

위 과정을 모두 끝냈다면 드디어 도커를 자유롭게 사용할 수 있습니다. (이미지 pull / push 혹은 빌드 등)

 

대부분의 경우에서 도커 데스크탑을 사용할 때와 큰 차이가 없지만 몇 가지 경우에서 조금 번거로운 점들은 있었습니다.

 

먼저, 컨테이너 실행 시 포트 포워딩 옵션을 통해 로컬에서 컨테이너 내부 서비스로 접속하려는 경우 minikube IP를 이용해야 합니다.

 

# minikube IP 조회
minikube ip

# 편의를 위해 hosts 파일에 등록해두고 alias로 사용할 수 있습니다.
echo "`minikube ip` docker.local" | sudo tee -a /etc/hosts > /dev/null

 

그리고 volume 옵션을 사용하여 로컬 호스트(Mac)에서 컨테이너 내부 디렉터리에 접근하려는 경우 사전에 minikube 구동 시 마운트 옵션을 주어야 합니다.

 

로컬 호스트와 Minikube VM 내부 볼륨 간의 마운트 옵션이 필요하다.

 

 

# 컨테이너 실행 시 볼륨 옵션을 주는 경우 minikube VM 내부의 볼륨과 마운트됩니다.
docker run --name tomcat -p 80:8080 -v /etc/tmp/lib:/usr/local/tomcat/lib tomcat:alpine

# minikube를 중지합니다.
minikube stop

# minikube 구동 시 마운트 옵션을 지정합니다.
# 호스트(mac) 와 minikube VM 내부 볼륨을 마운트 합니다.
minikube start --mount --mount-string="/etc/tmp/lib/:/etc/tmp/lib"

 

 

 

정리

도커 데스크톱의 라이센스가 유료화(250명 이상의 직원을 가지거나 연매출이 1000만 달러 이상인 기업인 경우) 되면서 어쩔 수 없이 이를 삭제하고 minikube + hyperkit 조합으로 대체하는 과정 속에서 그동안 도커 데스크톱이 리눅스 커널이 없는 맥/윈도우 환경에서 어떤 역할을 해주고 있었는지 좀 더 깊이 이해할 수 있게 되었습니다.

 

minikube + hyperkit 조합 이외에도 multipass 를 이용하는 방법으로도 도커 데스크톱을 대체할 수 있지만 multipass를 이용하는 경우 해당 VM 환경에서 별도로 도커를 설치해야 하는 작업이 필요하기 때문에 minikube를 이용하는 것이 더 좋은 선택지가 될 수 있을 것 같습니다.

 

다만 도커 데스크톱과 비교 했을 때 volume 설정 시 minikube를 재시작해야 하는 점과 Dockerfile을 이용해 이미지 빌드를 할 때 빌드 컨텍스트를 전송하는 시간이 생각보다 꽤 오래 걸린다는 점은 조금 아쉽습니다. 혹시 이런 점들을 개선할 수 있는 방법을 알고 계신다면 댓글을 통해 알려주세요! :)

 

 

 

 

 

참고 링크

https://medium.com/rahasak/replace-docker-desktop-with-minikube-and-hyperkit-on-macos-783ce4fb39e3

https://itnext.io/goodbye-docker-desktop-hello-minikube-3649f2a1c469

https://arnon.me/2021/09/replace-docker-with-minikube/