หนี Docker ไป Podman

Nutta
3 min readOct 6, 2021

--

จากความเดิมตอนที่แล้ว ซึ่งเป็นการประกาศอย่างเป็นทางการจาก Kubernetes ตั้งแต่ V1.2 (ตามลิงค์ด้านล่าง)

ซึ่งเราก็ทราบกันอย่างเป็นทางการแล้วว่าภายในปี 2021 ทาง Docker Runtime ก็ระถูกถอดออกจากการรับรองอย่างเป็นทางการสำหรับ Roadmap ของ K8s V1.22

แล้วทำไงล่ะทีนี้ ใช้ Docker มาตั้งนาน คุ้นมือมาทุกวัน

อันนี้เป็นปัญหาใหญ่เลย จากการที่เราๆ ใช้งานกันมาตั้งแต่ต้น แล้วจู่ๆ ก็มาประกาศกันกลางคันแบบนี้ งานเดิมก็มี ไหนจะเขียนโปรแกรม ดังนั้น วันนี้เรามาพูดถึงทางเลือกตัวแรกกัน นั่นก็คือ Podman

https://podman.io/

ว่าแต่ เดี๋ยว แล้วมันคืออะไร สรุปสั้นๆ Podman ก็ทำงานได้เหมือนกันกับ Docker เดี๊ยะ แต่ว่าข้อดีของมันก็คือ Runtime ทำตามกติกาของ OCI — Open Container Initiative เดี๊ยะๆ ดังนั้น ระยะยาวน่าจะ work กว่า Docker ณ ตอนนี้ ซึ่งเราก็ไม่รู้ว่าในอนาคต Docker จะเปลี่ยนแปลงอะไรหรือเปล่า (รู้ยัง Docker เริ่มเก็บตังค์แล้วนะ)

Podman ก็ Podman แล้วเราจะเริ่มต้นยังงัย

เรามาดูตัวอย่างกันสั้นๆ กันเรย เริ่มจากตัวอย่างอย่างเป็นทางการจาก Docker สำหรับการสร้าง Java Docker Image กัน ตาม Link ด้านล่าง

$ git clone https://github.com/spring-projects/spring-petclinic.git
$ cd spring-petclinic
$ ./mvnw spring-boot:run

เราก็เริ่มลอง Commands ชุดด้านบนกันเลย เราก็จะเห็นว่า Java application ก็รันทำงานเรียบร้อย (อาจจะต้องใช้เวลา Download dependencies นิดหน่อย)

และ ถ้าเราลองเข้าไปที่ http://localhost:8080 ก็จะเห็นว่า App รันละ

Step ถัดไป Dockerfile เอ๊ะ ไหนว่าจะใช้ Podman แล้วทำไม Dockerfile

เพราะว่า Podman เกิดมาจาก Open source communities และ ตอนนี้ก็ยังเป็น Open source project อยู่ ซึ่งเหล่าๆ Developers ทั่วโลกที่ Contribute ให้กับ Podman ก็ล้วนเคยใช้ Docker มาทั้งนั้น ดังนั้น เราก็ยังใช้ Docker skill ที่เรามีต่อไป แต่แค่เปลี่ยนเป็น Podman ดังนั้น ทุกอย่างเหมือนกัน เปี๊ยะ

Dockerfile ก็จะมีหน้าตาแบบนี้ ไม่มีอะไรเปลี่ยนแปลงเลยนิดเดียว

# syntax=docker/dockerfile:1

FROM openjdk:16-alpine3.13

WORKDIR /app

COPY .mvn/ .mvn
COPY mvnw pom.xml ./
RUN ./mvnw dependency:go-offline

COPY src ./src

CMD ["./mvnw", "spring-boot:run"]

ขั้นตอนต่อไป ก็ติดตั้ง Podman แล้วก็ใส่คำสั่งชุดตามด้านล่างเพื่อเริ่มใช้งาน Podman

$ brew install podman
$ podman machine init
$ podman machine start
$ podman machine list
NAME VM TYPE CPUS MEMORY DISK SIZE
podman-machine-default* qemu 1 2.147GB 10.74GB

เมื่อ podman พร้อมใช้งานแล้ว เราเริ่มคำสั่งคุ้นเคยกันดีกว่า image list

$ podman image listREPOSITORY                 TAG            IMAGE ID       SIZE
docker.io/library/openjdk 16-alpine3.13 2aa8569968b8 325 MB

ณ ตอนนี้ผมมี 1 container image ซึ่งเป็น openjdk ต่อไปเราจะสร้าง container image ด้วยคำสั่งข้างล่างนี้

$ podman build --tag java-docker .STEP 1/7: FROM openjdk:16-alpine3.13
STEP 2/7: WORKDIR /app
--> cc29541a9ff
STEP 3/7: COPY .mvn/ .mvn
--> 93a78dc607a
STEP 4/7: COPY mvnw pom.xml ./
--> 3de1129b73a
.
.
.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10:35 min
[INFO] Finished at: 2021-10-06T07:58:16Z
[INFO] ------------------------------------------------------------------------
--> 06ff8fc87e8
STEP 6/7: COPY src ./src
--> e8507ef3c05
STEP 7/7: CMD ["./mvnw", "spring-boot:run"]
COMMIT java-docker
--> 3bc091ce193
Successfully tagged localhost/java-docker:latest
3bc091ce193d550d1121323c640ae0d43c6ff16e3ecb3e9437e391a763354072

เมื่อมาถึงจุดนี้ เราก็จะได้ Container image ดังนั้นเราลองใส่ command podman check ดูกัน และ ก็จะพบว่า container image ใหม่มาได้ถูกสร้างขึ้นมาละ

$ podman image listREPOSITORY                 TAG            IMAGE ID      SIZE
localhost/java-docker latest 3bc091ce193d 572 MB
docker.io/library/openjdk 16-alpine3.13 2aa8569968b8 325 MB

สุดท้าย ลองรันดูดีกว่า

$ podman run -p 8080:8080 java-docker
[INFO] Scanning for projects...
[INFO]
[INFO] ------------< org.springframework.samples:spring-petclinic >------------
[INFO] Building petclinic 2.5.0-SNAPSHOT
.
.

ซึ่งถ้าลองเข้าไปที่ http://localhost:8080 เราก็จะเห็นว่า Java app ของเราก็รันขึ้นมาเรียบร้อยนั่นเอง

สรุป podman มีชุดคำสั่งเหมือน Docker อีกทั้ง เราไม่ต้องแก้ไข Dockerfile อีกด้วย ง่ายต่อการย้ายดีแท้ ส่วนท่านใดใช้ Docker คุ้นมือแล้วรู้สึกว่าพิมพ์ podman แล้วรู้สึกแปลก สามารถซ้อนคำสั่งได้ตามด้านล่างนี้นะครับ

$ alias docker=podman

ท้ายสุดที่ ฝากกลุ่ม Community เล็กๆ ที่นำเสนอข่าวคราวเกี่ยวกับ K8s และ OpenShift ที่ OpenShift Thailand By Red Hatters นะครับ

https://www.facebook.com/groups/openshiftthailand

--

--

Nutta

Azure Solution Architect, DevOps Expert, Software Architect, Kubernetes