Colima로 Docker Desktop 없이 컨테이너 개발하기

Colima로 Docker Desktop 없이 컨테이너 개발하기

macOS에서 Docker 컨테이너를 돌리려면 보통 Docker Desktop을 설치하는데요. 그런데 Docker Desktop이 2022년부터 대규모 조직에 유료 구독을 요구하면서 무료 대안을 찾는 개발자가 부쩍 늘었습니다. 그중에서도 Colima는 설치 한 줄이면 바로 쓸 수 있어서 가장 인기 있는 선택지로 자리 잡았는데요. 이번 글에서는 Colima가 뭔지, 어떻게 쓰는지 처음부터 차근차근 살펴보겠습니다.

Colima란?

Colima는 Containers in Lima의 줄임말입니다. Lima가 Linux on Mac이니까, 결국 “Mac 위의 Linux에서 컨테이너를 돌린다”는 뜻이 되겠죠?

macOS에서는 Linux 커널이 없기 때문에 Docker 컨테이너를 직접 실행할 수 없습니다. 그래서 Docker Desktop이든 Colima든 내부적으로 경량 Linux 가상 머신(VM)을 띄우고 그 안에서 컨테이너 엔진을 실행하는 구조입니다. Docker Desktop은 GUI와 여러 부가 기능이 함께 들어 있어서 무겁지만 Colima는 CLI만으로 동작해서 가볍고 빠릅니다.

Colima가 VM을 띄우고 나면 Docker 소켓을 알아서 연결해주기 때문에 기존에 쓰던 docker 명령어를 그대로 쓸 수 있어요. 개발 워크플로우를 바꿀 필요 없이 Docker Desktop만 Colima로 교체하면 됩니다.

Docker Desktop 대신 Colima를 쓰는 이유

Docker Desktop이 나쁜 도구는 아니지만 Colima가 더 나은 선택이 되는 상황이 꽤 있습니다.

우선 라이선스 문제가 있습니다. Docker Desktop은 직원 250명 이상 또는 연매출 $10M 이상 조직에서는 유료 구독이 필요합니다. Colima는 MIT 라이선스로 어떤 조직에서든 무료로 사용할 수 있습니다.

리소스 사용량 차이도 큽니다. Docker Desktop은 GUI, 확장 마켓플레이스, 백그라운드 서비스 등이 함께 돌아가면서 CPU와 메모리를 꽤 잡아먹습니다. Colima는 최소한의 VM만 띄우기 때문에 리소스 사용이 적고 노트북 배터리도 더 오래 가요.

파일 시스템 성능도 차이가 납니다. 벤치마크를 보면 Docker Desktop이 초당 약 13회 읽기를 처리할 때 Colima는 700회 이상을 처리합니다. 빌드 속도 역시 Colima의 VZ 모드가 Docker Desktop과 비슷하거나 더 빠른 결과를 보여줍니다.

그 밖에도 Colima는 Docker뿐 아니라 Containerd나 Incus 같은 다른 컨테이너 런타임도 지원하고 프로필 기능으로 여러 독립된 환경을 동시에 띄울 수도 있습니다.

물론 Docker Desktop이 더 적합한 경우도 있습니다. Windows를 써야 하거나 GUI로 컨테이너를 관리하고 싶거나 Docker Desktop Extensions가 필요한 팀이라면 Docker Desktop이 낫겠죠.

설치

Homebrew가 있으면 아주 간단합니다.

brew install colima

Colima만 설치하면 VM을 띄울 수 있지만 실제로 컨테이너를 다루려면 Docker CLI도 필요합니다. Docker Compose와 Buildx까지 함께 설치해두면 편합니다.

brew install docker
brew install docker-compose
brew install docker-buildx

Docker Compose와 Buildx를 CLI 플러그인으로 등록하면 docker compose, docker buildx 형태로 쓸 수 있습니다.

mkdir -p ~/.docker/cli-plugins
ln -sfn $(brew --prefix)/opt/docker-compose/bin/docker-compose ~/.docker/cli-plugins/docker-compose
ln -sfn $(brew --prefix)/opt/docker-buildx/bin/docker-buildx ~/.docker/cli-plugins/docker-buildx

Kubernetes가 필요하다면 kubectl도 설치합니다.

brew install kubectl

VM 시작과 종료

Colima를 시작하는 건 정말 간단해요.

colima start

이 한 줄이면 기본 설정(CPU 2코어, 메모리 2GB, 디스크 100GB)으로 Linux VM이 뜨고 Docker 데몬이 실행됩니다. 리소스를 더 넉넉하게 잡고 싶으면 옵션을 추가하면 됩니다.

colima start --cpu 4 --memory 8 --disk 60

Apple Silicon Mac을 쓴다면 VZ 모드를 사용하는 것이 좋습니다. Apple의 Virtualization 프레임워크를 활용해서 기본 QEMU 모드보다 성능이 좋습니다.

colima start --vm-type vz --mount-type virtiofs

VM을 멈추거나 상태를 확인하는 것도 직관적입니다.

colima status   # 현재 상태 확인
colima stop     # VM 정지
colima delete   # VM 삭제

Docker 명령어 사용

Colima가 실행되면 Docker CLI가 바로 작동합니다. 기존에 Docker Desktop에서 쓰던 명령어를 그대로 사용하면 됩니다.

docker ps
docker run hello-world
docker compose up -d
docker build -t myapp .

docker run 커맨드 사용법이나 Docker Compose 커맨드 사용법에서 다룬 명령어들이 Colima 환경에서도 동일하게 작동합니다.

VM 설정 커스터마이징

colima start 명령에 옵션을 매번 붙이는 게 번거롭다면 --edit 플래그로 YAML 설정 파일을 직접 편집할 수 있습니다.

colima start --edit

그러면 에디터가 열리면서 다음과 같은 설정을 수정할 수 있습니다.

cpu: 4
memory: 8
disk: 100
vmType: vz
mountType: virtiofs

이 설정 파일은 ~/.colima/default/colima.yaml에 저장되므로 다음번 colima start부터는 별도 옵션 없이 동일한 설정이 적용됩니다.

한 가지 주의할 점은 vmTypemountType은 VM을 생성할 때만 설정할 수 있다는 것입니다. 이미 만들어진 VM의 타입을 바꾸고 싶다면 colima delete 후 다시 생성해야 합니다.

여러 환경 동시에 운영하기

Colima의 프로필 기능을 사용하면 용도별로 독립된 VM을 여러 개 띄울 수 있습니다.

colima start --profile dev --cpu 4 --memory 8
colima start --profile ci --cpu 2 --memory 2
colima start --profile k8s --kubernetes --cpu 4 --memory 8

각 프로필은 자체적인 설정 파일과 Docker 소켓을 가지므로 서로 간섭하지 않습니다. 프로필 목록은 colima list로 확인할 수 있습니다.

colima list
결과
PROFILE    STATUS     ARCH       CPUS    MEMORY    DISK     RUNTIME    ADDRESS
default    Running    aarch64    2       2GiB      100GiB   docker
dev        Running    aarch64    4       8GiB      100GiB   docker
ci         Stopped    aarch64    2       2GiB      100GiB   docker
k8s        Running    aarch64    4       8GiB      100GiB   docker

프로필별로 멈추거나 삭제하려면 프로필 이름을 지정하면 됩니다.

colima stop dev
colima delete ci

Kubernetes 사용하기

Colima는 경량 Kubernetes 배포판인 k3s를 내장하고 있어서 별도 설치 없이 바로 Kubernetes 클러스터를 띄울 수 있습니다.

colima start --kubernetes

시작되면 kubectl이 자동으로 설정되어 바로 사용할 수 있습니다.

kubectl get nodes
kubectl get pods -A

Docker 런타임을 사용하는 경우 docker build로 빌드한 이미지가 Kubernetes에서 바로 접근 가능합니다. 로컬 개발 환경에서 이미지를 레지스트리에 푸시하지 않고도 Kubernetes에 배포해볼 수 있어서 편리합니다.

Apple Silicon에서 x86 이미지 실행하기

Apple Silicon Mac에서 x86_64 전용 이미지를 실행해야 할 때가 있는데요. Colima는 두 가지 방법을 제공합니다.

QEMU 에뮬레이션은 전체 시스템을 에뮬레이션하는 방식입니다. 호환성은 좋지만 네이티브 대비 85% 정도 느립니다.

colima start --arch x86_64

Rosetta 변환은 프로세스 수준에서 명령어를 변환하는 방식입니다. QEMU보다 훨씬 빠르고 네이티브 대비 약 20% 정도만 느립니다. macOS 13.5 이상에서 VZ 모드와 함께 사용할 수 있습니다.

colima start --vm-type vz --vz-rosetta --mount-type virtiofs

가능하면 ARM64 네이티브 이미지를 사용하는 게 가장 좋고 x86_64 이미지가 꼭 필요할 때만 Rosetta를 활용하세요.

Docker 소켓 연결

Colima를 시작하면 Docker 소켓이 ~/.colima/default/docker.sock에 생성됩니다. 보통 docker 명령어는 자동으로 이 소켓을 인식하지만 일부 도구나 IDE에서 소켓 경로를 직접 지정해야 할 때가 있습니다.

# 환경 변수로 소켓 경로 지정
export DOCKER_HOST="unix://$HOME/.colima/default/docker.sock"

심볼릭 링크로 기본 경로에 연결하는 방법도 있습니다.

sudo ln -sf $HOME/.colima/default/docker.sock /var/run/docker.sock

현재 Docker 컨텍스트가 어떤 소켓을 가리키는지는 docker context ls로 확인할 수 있습니다.

자주 만나는 문제와 해결법

Colima를 쓰다 보면 몇 가지 흔한 문제에 부딪힐 수 있는데 대부분 간단하게 해결됩니다.

DNS 문제docker pull이 DNS 관련 에러로 실패할 때 발생합니다. 노트북을 닫았다 열거나 네트워크를 전환한 후에 자주 나타나는데요. Colima를 시작할 때 DNS 서버를 명시하면 해결됩니다.

colima stop
colima start --dns 8.8.8.8

소켓 연결 에러는 IDE나 다른 도구에서 Docker에 접근하지 못할 때 나타납니다. 앞서 설명한 DOCKER_HOST 환경 변수 설정이나 심볼릭 링크로 해결할 수 있습니다.

포트 포워딩 지연은 컨테이너를 시작한 직후 localhost에서 접근이 안 될 때 발생합니다. Colima는 SSH 터널을 통해 포트를 포워딩하기 때문에 몇 초 정도 지연이 있을 수 있습니다. 잠시 기다리면 보통 해결되고 그래도 안 되면 colima stop && colima start로 재시작해보세요.

디스크 공간 회수는 이미지를 삭제한 후에도 VM 디스크 크기가 줄지 않을 때 필요합니다.

docker system prune
colima ssh -- sudo fstrim -a

또는 Colima를 재시작하면 v0.5.0부터 미사용 공간이 자동으로 회수됩니다.

마치며

Colima는 macOS에서 Docker 컨테이너를 돌리기 위한 가볍고 실용적인 도구입니다. 설치가 간편하고 기존 Docker 워크플로우와 호환되면서도 Docker Desktop보다 적은 리소스로 더 빠른 성능을 보여주죠.

Docker를 처음 시작하신다면 Docker 시작하기에서 컨테이너와 이미지 같은 기본 개념을 먼저 익혀보시고, Docker Compose로 여러 컨테이너를 함께 관리하는 방법이 궁금하시다면 Docker Compose 커맨드 사용법도 참고해보세요.

Colima에 대해 더 알고 싶다면 공식 문서GitHub 저장소를 확인해보세요.

This work is licensed under CC BY 4.0 CC BY

개발자를 위한 뉴스레터

달레가 정리한 AI 개발 트렌드와 직접 만든 콘텐츠를 전해드립니다.

Discord