Life without Docker Desktop & build image on Mac M1
ด้วยเหตุจากที่ Docker Inc. ได้ประกาศว่า Docker Desktop นั้นจะคิด paid subscription ตั้งแต่ August 31, 2021 โดยมีเวลาเตรียมตัวถึง January 31, 2022 (ซึ่งช่วงเดียวกับที่เราเขียนอยู่นี้)
ทุกคนอาจจะตกใจ แต่เดี๋ยวก่อน เคสนี้จะมีผลกับแค่องค์กรที่มีขนาดใหญ่ ~250 คน และรายได้มากกว่า $10 milllion ต่อปี ถ้าใช้ personal use หรือยังอยู่ใน small business ก็ยังใช้ได้ฟรีอยู่ค่ะ
บทความนี้จึงจะมาเล่าว่า เราจะใช้ Docker ยังไงโดยไม่ใช้ Docker Desktop (ที่แสนจะสะดวกสบาย) แบบไม่ปวดหัวกัน
ก่อนอื่น เรามาทำความเข้าใจกันก่อน ทุกคนคงจะสงสัยว่า เห้ย ถ้าไม่มี Docker Desktop แล้วจะทำอะไรได้เหรอ เมื่อก่อนติดตั้งแค่โปรแกรมนี้ก็ใช้ Docker ได้เลยนินา
ความจริงแล้ว Docker นั้นมีสิ่งที่เรียกว่า Docker Engine ซึ่งเป็น core หลักbehind the scene ดังนั้นแปลว่าต่อให้คุณไม่ใช้ Docker Desktop ก็สามารถใช้ Docker ได้ สบายใจได้เลย
Tools ที่เป็นพระเอกของเรา คือ Colima
สิ่งที่ Colima ทำนั้น คือทดแทนตัวเองเป็น Docker Daemon ซึ่งเป็นส่วนหนึ่งของ Docker Engine นี่เอง และหากจะใช้งานร่วมกับ Colima แล้ว เรายังต้องใช้ควบคู่กับ Docker CLI ด้วย แต่ในบทความนี้เราจะสอนลงแค่ Colima อย่างเดียว
การติดตั้ง Colima
brew install colima
การใช้งาน Colima
หากเราจะลง Airflow ด้วยข้อกำหนดว่า require 4GB memory เราก็สามารถกำหนดตรงนี้ได้เหมือนกันด้วยคำสั่ง
colima start --cpu 4 --memory 8
หรือถ้าไม่ซีเรียสเรื่อง resource เท่าไร ก็ไม่จำเป็นต้องระบุ CPU หรือ memory ก็ได้ โดย default มันจะจองให้ 2 CPUs และ 2 GB memory
colima start
เราสามารถเช็คว่า colima ที่เรารันนั้นจองไว้เท่าไรด้วย
colima list
แต่การใช้ colima บางทีนางก็จะมีอาการเอ๋อๆบ้าง เช่น ตอนนั้นเราลองเราจองไว้สัก 8 GB ก็จริง แต่พอรัน Airflow แล้ว webserver กลับตายด้วย exit 137 ที่แปลว่า resource มันไม่พอ เราสามารถ reset ตัว colima ด้วยการ delete แล้ว start ใหม่
colima delete
colima start --cpu 4 --memory 8
จบในส่วนตัวตายตัวแทน Docker Desktop แล้ว เราจะมาเล่าสิ่งที่น่าปวดหัวอีกเรื่องคือการ build image บน Apple Mac M1 ที่รักของเรานั้นเอง
ปัญหาที่ใครหลายคนมักจะเจอคือ ไม่ว่าจะ build image จาก Dockerfile เอง หรือ pull image มาเแล้วรัน ก็จะ เจอ error ที่พ่นมาว่า
standard_init_linux.go:228: exec user process caused: exec format error
ยินดีด้วย คุณเจอปัญหาของ M1 แล้ว ฮูเร่
แล้วเราจะแก้ปัญหานี้ยังไงดี ?
ตอบคือ งั้นก็ build image นี้ให้รองรับหลาย multi-architecture สิ จะ Linux x64, ARM หรือ Windows ก็ตาม
ดังนั้น ตัวที่เป็นพระเอกของเราคือ Docker Buildx ! ที่สามารถทำเรื่องการ support multi-platform ได้
โดยมี steps คือ
- ก่อนอื่นเลย เราต้อง download docker buildx ก่อน เลือกที่เป็น ARM64 (ถ้าใช้ Docker Desktop ก็ข้าม step นี้ไปได้เลย เพราะนาง provide ให้แล้ว)
step นี้ก็สามาารถทำตาม Document ของ Docker ได้ตามสะดวกเลย
2. คราวนี้เรามี buildx แล้ว แต่ในการที่เราจะให้ images นี้ support ทุก platform จะต้องใช้ QEMU emulator เป็นตัวช่วย โดยเราจะรันคำสั่ง
docker run --privileged --rm tonistiigi/binfmt --install all
ใครอยากอ่านรายละเอียดลึกๆ ไปอ่านต่อได้ที่ https://docs.docker.com/buildx/working-with-buildx/#build-multi-platform-images
3. เรามา build image กัน
เราจะใช้ ‘ — platform’ ตามด้วย architect ที่เราอยากได้ เพื่อเป็นการกันไม่ให้เรา build image ด้วย M1 (arm64)
docker buildx build --platform=linux/amd64 -t <registry_name>/<image_name>:<version> --load .
เราเติม ` — load` เพื่อเก็บ images นี้ไว้ local เฉยๆ (เวลา docker images จะเห็น)
e.g.
docker buildx build --platform=linux/amd64 -t mesodiar/airflow-demo:v1 --load .
มาถึงตรงนี้ หากเราลอง docker buildx ls
ดู จะเห็นว่าตอนนี้เราได้ใช้ colima ที่ยัง support linux/amd64, linux/arm64, ... หลายๆ platform ชัดเจน
คราวนี้เราก็สามารถ build image โดยไร้ปัญหาบน Mac M1 อีกต่อไป
ถ้าใครมีท่าเท่ๆ โดยไม่ใช้ Docker Desktop หรือวิธีการ build image แบบอื่น อย่าลืมมาเล่าให้เราฟังด้วยนะ !
Ref:
- https://docs.docker.com/buildx/working-with-buildx/#build-multi-platform-images
- https://www.docker.com/blog/the-magic-behind-the-scenes-of-docker-desktop/
- https://dhwaneetbhatt.com/blog/run-docker-without-docker-desktop-on-macos
- https://www.arthurkoziel.com/replacing-docker-desktop-for-mac-with-colima/