Skip to main content

도커 머신 vs 도커 데스크탑

도커 머신 (Docker Machine)

Docker Machine은 Mac 또는 Windows에서 Docker를 실행하는 최초의 접근 방식으로 기본적으로 제공된 하이퍼바이저(virtualbox, parallels 및 vmware) 내에서 boot2docker 가상 머신을 시작하는 CLI 도구 세트입니다. 파일 시스템 마운트는 하이퍼바이저 자체 또는 NFS (하이퍼바이저는 일반적으로 다소 느리기 때문)와 같은 추가 도구를 통해 제공됩니다. 여기서 VM 이미지는 Docker 호스트 역할을 합니다.

  • macOS와 Windows용으로 docker를 만든 것
  • VirtualBox나 Parallels와 같은 솔루션으로 가상머신을 만들고 docker용 OS이미지를 이용
  • 해당 이미지는 최소한으로 공간을 사용하고 최고의 성능을 내기 위해 만들어진 미니멀 Linux 배포판
  • 해당 가상머신이 docker host의 역할을 함
  • 도커에서는 이렇게 만들어진 docker machine을 관리하기 위한 cli도 제공
  • 도커를 위한 리소스(가상머신의 리소스 - RAM, CPU) 확장을 위해서는 가상머신 솔루션에서 설정

도커 데스크탑 (Docker Desktop)

Docker의 심장이라고 할 수 있는 Docker Engine은 리눅스에서만 구동되기 때문에 윈도우/맥에서 사용하기 위해서는 리눅스 VM을 생성하고 Docker를 설치하고 세팅하는 복잡한 과정이 필요합니다. 이런 과정을 한 번에 해주는 제품이 바로 Docker Desktop입니다.

Docker Desktop은 다른 종류의 솔루션이며 기본 OS 가상화 방법에 의존하기 때문에 타사 가상화가 필요하지 않습니다. macOS의 경우 이러한 기술을 하이퍼바이저 프레임워크라고 합니다. Docker Desktop은 Hypervisor 가상화를 앱에 내장하기 위한 오픈소스 솔루션인 HyperKit을 사용하여 일종의 VM을 가동합니다. 이 VM을 관리할 필요가 없으며 해당 Docker 인스턴스에 할당되는 가상 CPU와 RAM의 수를 제어하기 위한 인터페이스가 존재합니다. Docker VM을 관리할 때 오버헤드가 적지만 일부 기능은 OS 구현에 의해 제한됩니다.

  • Native Application이기 때문에 Docker machine처럼 가상머신이 필요하지 않음
  • docker는 PC의 가상화 기술(hypervisor)를 이용하기 때문에 CPU가 해당 기능을 제공하지 않으면 사용 불가
  • 가상 머신을 관리할 필요가 없어 오버헤드가 적음
  • windows와 mac 모두 GUI 환경 제공
  • OS에서 제한한다면 기능제한 발생 가능성
  • windows에서 다른 가상화 솔루션(하이퍼바이저, vmware, virtualbox)와 동시 사용 불가

기존에 설치하고 사용하던 도커 데스크탑을 삭제하고 가상 머신위에 도커를 올려 사용하도록 하는 과정입니다.

도커 데스크탑 삭제

  1. 도커 데스크탑 애플리케이션 삭제
  2. 아래 잔여 파일 삭제
sudo rm -Rf /Applications/Docker.app
sudo rm -f /usr/local/bin/docker
sudo rm -f /usr/local/bin/docker-machine
sudo rm -f /usr/local/bin/docker-compose
sudo rm -f /usr/local/bin/docker-credential-desktop
sudo rm -f /usr/local/bin/docker-credential-ecr-login
sudo rm -f /usr/local/bin/docker-credential-osxkeychain
sudo rm -Rf ~/.docker
sudo rm -Rf ~/Library/Containers/com.docker.docker
sudo rm -Rf ~/Library/Application\ Support/Docker\ Desktop
sudo rm -Rf ~/Library/Group\ Containers/group.com.docker
sudo rm -f ~/Library/HTTPStorages/com.docker.docker.binarycookies
sudo rm -f /Library/PrivilegedHelperTools/com.docker.vmnetd
sudo rm -f /Library/LaunchDaemons/com.docker.vmnetd.plist
sudo rm -Rf ~/Library/Logs/Docker\ Desktop
sudo rm -Rf /usr/local/lib/docker
sudo rm -f ~/Library/Preferences/com.docker.docker.plist
sudo rm -Rf ~/Library/Saved\ Application\ State/com.electron.docker-frontend.savedState
sudo rm -f ~/Library/Preferences/com.electron.docker-frontend.plist

minikube로 도커 환경 구성하기 #1 with VirtualBox

  • docker, docker-compose, minikube, docker-crendential-helper 설치
brew install docker docker-compose minikube docker-credential-helper
Minikube란?

쿠버네티스를 설치하고 Minikube를 사용할 수 있는데 Minikube는 가벼운 쿠버네티스 구현체이며 로컬 머신에 VM을 만들고 하나의 노드로 구성된 간단한 클러스터를 생성한다. Minikube는 리눅스, 맥, 그리고 윈도우 시스템에서 구동이 가능하며 Minikube CLI는 클러스터에 대해 시작, 중지, 상태 조회 및 삭제 등의 기본적인 부트스트래핑(bootstrapping) 기능을 제공한다.

minikube가 동작하기 위해서는 사전에 컨테이너 엔진이 설치되어 있어야 합니다. minikube에서 지원하는 컨테이너 엔진은 다음과 같습니다.

  • Docker
  • Hyperkit
  • Hyper-V
  • KVM
  • Parallels
  • Podman
  • VirtualBox
  • VMWare
  • virtualbox, virtualbox-extension-pack 설치
brew install -—cask virtualbox virtualbox-extension-pack
  • 가상 머신 리소스(도커를 위한 리소스) 설정
minikube config set driver virtualbox
minikube config set memory 4096
minikube config set cpus 2
minikube config view
  • 가상머신(minikube) 실행
minikube start --driver=virtualbox
  • 가상 머신 상태 확인
minikube status
  • docker CLI에 minikube 관리 설정
eval $(minikube docker-env)
  • node 확인
kubectl get nodes -o wide
  • Host 마운트 확인 (현재 실행중인 리눅스 VM에 SSH로 접근)
minikube ssh

minikube로 도커 환경 구성하기 #2 with HyperKit

minikube config set cpus 6
minikube config set memory 12g
kubectl version --short
minikube start --kubernetes-version=v1.24.3 --driver=hyperkit --container-runtime=docker --mount --mount-string="/host/path:/downloads"
  • 파드 yaml 파일 생성
vi minikube-mount.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: minikube-mount
spec:
volumes:
- name: minikube-mount
hostPath:
path: /downloads
type: DirectoryOrCreate
containers:
- image: alpine:latest
name: one
command:
- sleep
- 24h
volumeMounts:
- name: minikube-mount
mountPath: /mnt/minikube
  • 파드 생성
kubectl apply -f minikube-mount.yaml
  • 전체 파드 확인
kubectl describe pods
  • 파드 내 명령어 실행 (마운트 파일 확인)
kubectl exec -it minikube-mount -- ls /mnt/minikube
  • 생성한 파드 상태 확인
kubectl get pod minikube-mount

mount 테스트

# 마운트 한 볼륨 디렉토리에 파일 생성
kubectl exec -it minikube-mount -- /bin/sh
cd /mnt/minikube
echo hello > file.txt
exit

# 미니쿠베에 접속하여 위에서 생성한 파일 확인
minikube ssh
cd /downloads
cat file.txt
minikube addons enable ingress
minikube ip
minikube addons enable ingress-dns
minikube addons enable metallb
  • minikube ip를 포함하는 ip 대역 설정 (stateful)
minikube addons configure metallb

minikube docker-env

eval $(minikube docker-env)

위 명령어를 터미널에서 실행할 경우 docker 명령어를 사용할 수 있게 되는데 minikube를 종료하거나 다시 시작했을 때 또는 다른 터미널에서 docker 명령어를 시작해야 할 경우 매번 입력해줘야 하는 불편함이 있습니다. 따라서 사용하고 있는 터미널 설정 파일에 아래 명령어를 입력하여 저장합니다.

vi ~/.zshrc
eval $(minikube docker-env) > /dev/null
source ~/.zshrc

클러스터 명령어

  • 클러스터 일시정지
minikube pause
  • 클러스터 재개
minikube unpause
  • 클러스터 시작
minikube start
  • 클러스터 멈춤
minikube stop
  • 클러스터 삭제
minikube delete