featured image

Docker Desktop alternative for MacOS

มันมีเครื่องมือตัวไหนอีกไหมนะที่แทน Docker Desktop บน MacOS ได้

4 min readJun 17, 2024

--

ก่อนจะไปเริ่มกัน

มันจำเป็นรึป่าวที่จะไม่ใช้ Docker Desktop?

ผมว่า ไม่นะครับ จะใช้ Docker Desktop ก็ได้ นี่เป็นเพียงทางเลือกสำหรับใครที่ใช้ Docker Desktop แล้วมันกินแรมเยอะ, ไม่ได้ใช้ GUI, ไม่ได้ใช้ Extensions, เรื่อง licensing สำหรับ Enterprise หรืออะไรก็ตามแต่ที่แถมมากับ Docker Desktop และต้องการลงโปรแกรมที่ใช้รัน container ได้แบบ minimal สุดๆครับ

ทำไมถึงเจาะจงไปที่ MacOS?

แหม่ ก็ Docker engine รันบน Linux ได้แบบไม่มีปัญหาอะไรอยู่แล้ว ไม่ต้องใช้ Docker Desktop ก็ได้ แต่มาบน MacOS นี้มันต้องสร้าง VM ไง Docker Desktop ก็เลยเป็นตัวเลือกแรกๆที่เข้ามาให้คนใช้กัน และก็น่าจะมีคนที่สนใจว่ามันมีเครื่องมือตัวอื่นที่ใช้แทนกันได้รึป่าว

ในบล็อคนี้จะแนะนำเครื่องมือ 2 ตัวที่สามารถเอามาใช้แทน Docker Desktop ได้ คือ

  • Colima
  • Minikube

ลองทดสอบแล้วเป็นยังไงบ้าง

ลองใช้รัน build image ดู

Test run builds

จากที่ทดสอบ build ถึงแม้ความเร็วจะไม่ต่างกันเท่าไรเลย แต่บาง benchmarks บอกว่า Colima เร็วกว่า Docker Desktop ถึง 10 เท่า อันนี้ก็ต้องลองใช้กันดูครับ

นอกจากนี้ลอง build image ขนาดใหญ่ (linux/amd64 cross platform จาก MacOS M2 Pro) เพื่อจำลองการทำ emulation เทียบระหว่าง VM แบบ QEMU กับ VZ (rosetta) ได้ว่า

  • colima x86_64 QEMU → 249.1s
  • colima x86_64 VZ Rosetta → 245.0s
  • colima aarch64 QEMU → 218.s
  • colima aarch64 VZ Rosetta → 154.1s

เห็นได้ว่า build ด้วย VZ Rosetta เร็วกว่ามากๆบน MacOS
เพราะ Colima VM ด้วย aarch64 Rosetta จะเป็นการใช้ VM แบบ native จริงๆ

มาเริ่มกันดีกว่า

Package ที่จำเป็นต้องมี

แน่นอน Docker Cli

brew install docker

Packages ที่เป็นตัวเลือก (Optional)

สำหรับใครที่ใช้ Docker Desktop จะแถม plugin พวกนี้มาให้เลย ดังนั้นจะลงหรือไม่ลงก็ได้ แต่ว่าลงแค่ docker ไม่แถมมาให้นะครับ

brew install docker-credential-helper docker-completion docker-buildx docker-compose

เพิ่ม config ใน ~/.docker/config.json

{
“cliPluginsExtraDirs”: [
“/opt/homebrew/lib/docker/cli-plugins”
]
}

Colima

Container runtimes on macOS

Colima Logo https://github.com/abiosoft/colima/raw/main/colima.png

Colima แปลว่า Containers in Lima, และเมื่อ Lima ย่อยมาจาก Linux on Mac. ดังนั้นแล้ว Colima จึงแปลว่า Containers on Linux on Mac ตามตัวเลยครับ

ตัว Colima นั้นใช้งานได้ง่ายมากๆ ไม่ต้องทำอะไรให้วุ่นวายเลย

ติดตั้งของที่จำเป็นกันก่อน

brew install colima docker

จากนั้นเริ่มการทำงานตามด้านล่าง เลือกมาตาม comment ได้เลย
default architecture จะเป็นตามเครื่องนะ

# สำหรับ linux และ MacOS <13.0 (จะใช้ qemu)
colima start
# สำหรับ MacOS >=13
colima start --vm-type=vz
# สำหรับ MacOS >=13 และเป็น Apple Sillicon (M1,M2 +)
colima start --vm-type=vz --vz-rosetta

สำหรับใครที่รันบนเครื่องที่เป็น architecture arm64 เช่น Apple Sillicon แต่อยากให้ container รันด้วย amd64 โดยที่ไม่ต้องใส่ option --platform ให้ยุ่งยาก ให้ใช้ colima option --arch x86_64 เท่านี้ container เราก็รันด้วย amd64 ทั้งหมดเลย

หรือใช้ทั้งคู่ไปเลย แล้วสลับไปมาด้วย docker context ก็ได้นะ

$ colima start # default arm64
$ colima start amd64 --arch x86_64 --cpu 6 --memory 12 --vm-type vz --vz-rosetta # additional adm64

$ docker context ls
NAME DESCRIPTION DOCKER ENDPOINT ERROR
colima colima unix:///Users/cotton/.colima/default/docker.sock
colima-amd64 * colima [profile=amd64] unix:///Users/cotton/.colima/amd64/docker.sock

จากนั้นเราสามารถรัน container ได้เลย

แน่นอนเราสามารถแก้ไข CPU, Memory และตั้งค่าอื่นๆได้ด้ว

  • colima start --edit แต่วิธีนี้จะเป็นการแก้ไขแบบชั่วคราว ถ้า colima deleteแล้วสร้างใหม่ การตั้งค่าทั้งหมดจะกลับไปเป็นแบบ default
  • colima template วิธีนี้จะแก้ไฟล์ default

ลองดึง image nginx มารัน จากนั้นทดสอบเรียกหน้าเว็บดูว่าทำงานได้ปกติไหม

$ docker pull nginx && docker images
Using default tag: latest
latest: Pulling from library/nginx
24c63b8dcb66: Pull complete
cfe05c174c17: Pull complete
f72850762d9b: Pull complete
82945d645e12: Pull complete
a6f455b832da: Pull complete
22fc067a16f6: Pull complete
4bd9fc5c1e9f: Pull complete
Digest: sha256:0f04e4f646a3f14bf31d8bc8d885b6c951fdcf42589d06845f64d18aec6a3c4d
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 705b7f60fea5 13 days ago 193MB

สร้าง Nginx container instance และเปิด port 80 to 8080

docker run -p 8080:80 -d nginx

curlได้หน้าเว็บตั้งต้นของ nginx เลย แปลว่าเรียบร้อยครับเสร็จแล้ว เพียงเท่านี้ก็ใช้แทน Docker Desktop ได้เลยครับ พร้อมใช้งานแล้ว แค่นี้เลยง่ายใช่ไหม!

Extra

สำหรับใครที่อยากให้ Colima รันทุกครั้งที่เปิดเครื่องให้ใช้วิธี autostart แบบนี้ครับ

brew services start colima

อีกวิธีที่ผมยกมานอกจากใช้ Colima ก็คือใช้ Minikube ครับ แต่ค่อนข้างซับซ้อนและใช้งานลำบากกว่า Colima

Minikube

minikube logo https://minikube.sigs.k8s.io/

เป็นโปรแกรมที่ช่วยให้เราสร้าง Kubernetes cluster บนเครื่องเราได้อย่างรวดเร็ว ใช้ได้ทั้ง Linux, Window, MacOS แต่ในบล็อคนี้ผมจะเอามันมาใช้แทน Docker Desktop หมายความว่าเราจะใช้มันแบบไม่ใช้ Kubernetes ครับ (น่าจะมีคนไม่รู้ว่ามันทำได้ด้วย~)

Minikube as Docker Desktop replacement

จาก minikube doc บอกว่าสำหรับ MacOS ให้ลง Hyperkit แล้วใช้งาน แต่ๆๆ นั้นมันสำหรับ MacOS intel ครับ สำหรับ Apple Silicon หรือ M1, M2, etc. ไม่รองรับ Hyperkit เราจึงจำเป็นต้องใช้ Qemu สำหรับ Apple Sillicon แทนนั้นเอง

ก่อนอื่นต้องติดตั้งของที่จำเป็นกันก่อน

brew install minikube docker qemu socket_vmnet
brew tap homebrew/services
HOMEBREW=$(which brew) && sudo ${HOMEBREW} services start socket_vmnet

เราจะสร้าง minikube ขึ้นมาแต่ไม่ต้องสร้าง components ที่เกี่ยวกับ Kubernetes เลยด้วย --no-kubernetes

minikube start --driver qemu2 --memory 4Gb --no-kubernetes

ป.ล. สำหรับใครใช้ MacOS intel ให้ลง Hyperkit แล้วใส่ตัวเลือก --driver hyperkit แทนนะครับ

ถ้าขึ้นแบบนี้ให้รันตามคำสั่งที่เขาแนะนำได้เลย

ถ้าลอง minikube profile list ดูก็จะเห็น profile minikube ที่เพิ่งสร้างไป

ให้ใช้คำสั่งแก้ไข env เพื่อให้ docker client สามารถติดต่อเข้าไปยัง minikube ได้ แนะนำให้เอาไปใส่ใน ~/.bashrcหรือ~/.zshrc ด้วย

$ eval $(minikube docker-env)

ลองทดสอบดูว่าเชื่อมต่อไป Docker Server ได้รึยัง

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

จากนั้นลองรัน Nginx contianer เหมือนเดิมดู

docker run -p 8080:80 -d nginx
$ docker ps | grep nginx
43fde9ddad30 nginx “/docker-entrypoint.…” 3 seconds ago Up 2 seconds 0.0.0.0:8080->80/tcp heuristic_elgamal

มีข้อสังเกตุถ้าเทียบกับ Colima คือ การเข้าถึง container ใน minikube ต้องใช้ minikube ip นะ

curl $(minikube ip):8080

ได้ผลลัพธ์ตามต้องการเลย พร้อมใช้งานแล้ว

อีกอย่างคือเราต้อง mount volume เข้าไปใน minikube ก่อนด้วยนะ ถึงจะใช้ mount ได้ ไม่อย่างนั้น volume ที่ใส่ไปจะหมายถึงใน minikube แทนที่จะเป็น Host

$ minikube mount /host-volume:/minikube-volume
$ docker run — rm -it -v /minikube-volume:/container-volume busybox sh

อ้างอิง

--

--

Piravit Chenpittaya
Piravit Chenpittaya

Written by Piravit Chenpittaya

call me karn | Computer of Engineering : PSU | IG: karn.svg | git: https://github.com/karnzx /

No responses yet