Life without Docker Desktop & build image on Mac M1

Burasakorn Sabyeying
Mils’ Blog
Published in
3 min readJan 28, 2022

ด้วยเหตุจากที่ 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 อย่างเดียว

Docker Engine (cr. https://www.aquasec.com/cloud-native-academy/docker-container/docker-architecture/)

การติดตั้ง 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
รายละเอียดว่าเราได้จอง Memoryไป 10 GB และ 6 CPUs บนเครื่อง Apple M1 chip

แต่การใช้ 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 ที่รักของเรานั้นเอง

cr. https://9gag.com/gag/aEP52Qe

ปัญหาที่ใครหลายคนมักจะเจอคือ ไม่ว่าจะ 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 คือ

  1. ก่อนอื่นเลย เราต้อง 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:

--

--

Burasakorn Sabyeying
Mils’ Blog

Data engineer at CJ Express. GDE in Cloud. Women Techmakers Ambassador. Co-lead GDG Cloud Bangkok. Other channel > Mesodiar.com