1. แนะนำเบื้องต้น
วิวัฒนาการของเทคโนโลยีคอนเทนเนอร์และเหตุผลที่ได้รับความสนใจ
ในช่วงไม่กี่ปีที่ผ่านมา เทคโนโลยีคอนเทนเนอร์ มีความสำคัญเพิ่มขึ้นอย่างรวดเร็วในแวดวงการพัฒนาและการปฏิบัติงานของแอปพลิเคชัน โดยเฉพาะอย่างยิ่งการทำให้สภาพแวดล้อมการพัฒนาและสภาพแวดล้อมจริงมีความเหมือนกัน ช่วยให้สามารถทำซ้ำการทำงานได้อย่างแม่นยำ จึงเป็นที่ยอมรับในหมู่วิศวกรจำนวนมาก
ในบรรดาเทคโนโลยีเหล่านี้ Docker ถือเป็นตัวอย่างที่โดดเด่น แต่ในระยะหลัง Podman (พอดแมน) ได้รับความสนใจในฐานะทางเลือกใหม่ Podman มี CLI (Command Line Interface) คล้ายกับ Docker มาก และมีจุดเด่นที่ ไม่ต้องใช้เดมอน (daemonless) และไม่จำเป็นต้องใช้สิทธิ์ root (rootless) จึงเบาและปลอดภัย
เหตุผลที่เลือกใช้ “Podman + Dockerfile + Ubuntu”
บทความนี้จะอธิบายการใช้งานคอนเทนเนอร์แบบทันสมัยในสภาพแวดล้อม Linux โดยผสมผสาน Podman Dockerfile และ Ubuntu เข้าด้วยกัน
- Ubuntu เป็นดิสทริบิวชัน Linux ยอดนิยมที่ใช้งานได้ตั้งแต่มือใหม่จนถึงผู้เชี่ยวชาญ
- Dockerfile คือไฟล์ที่เปรียบเสมือนพิมพ์เขียวสำหรับสร้างอิมเมจคอนเทนเนอร์
- Podman คือเครื่องมือรุ่นใหม่ที่ช่วยให้การจัดการคอนเทนเนอร์ปลอดภัยและยืดหยุ่นมากขึ้น
โดยเฉพาะอย่างยิ่ง เมื่อความตระหนักเรื่องความปลอดภัยเพิ่มขึ้น การใช้ Podman ร่วมกับ Dockerfile บน Ubuntu กลายเป็นที่นิยมทั้งในหมู่นักพัฒนารายบุคคลและองค์กร
วัตถุประสงค์และกลุ่มเป้าหมายของบทความนี้
จุดประสงค์ของบทความนี้คืออธิบายวิธีการใช้ Podman เพื่อ build Dockerfile และสร้างคอนเทนเนอร์ที่ใช้งานได้จริงบน Ubuntu อย่างละเอียด
กลุ่มเป้าหมายคือ:
- ผู้ที่มีประสบการณ์กับ Docker แต่อยากลองใช้ Podman
- ผู้ใช้ Ubuntu ที่ต้องการจัดการคอนเทนเนอร์ในสภาพแวดล้อมที่ปลอดภัย
- วิศวกรที่ต้องการนำเทคโนโลยีคอนเทนเนอร์มาใช้ในงาน
- มือใหม่ที่อยากลองเขียน Dockerfile และ build ด้วย Podman
เนื้อหาครอบคลุมตั้งแต่การใช้งานพื้นฐาน, เคล็ดลับการหลีกเลี่ยงปัญหา, ความแตกต่างและวิธี migration จาก Docker
2. Podman คืออะไร?
ภาพรวมพื้นฐานของ Podman
Podman (Pod Manager) คือเครื่องมือจัดการคอนเทนเนอร์รุ่นใหม่ที่พัฒนาโดยชุมชนที่นำโดย Red Hat เช่นเดียวกับ Docker, Podman สามารถ build, run และจัดการคอนเทนเนอร์ที่เป็นไปตามมาตรฐาน OCI (Open Container Initiative) แต่มีแนวคิดและโครงสร้างที่แตกต่างกันอย่างมาก
จุดเด่นที่สุดคือ Podman ไม่ต้องใช้เดมอน (daemonless) ช่วยให้การทำงานเบาและปลอดภัย นอกจากนี้ยังรองรับโหมด rootless ที่ผู้ใช้ทั่วไปสามารถใช้งานคอนเทนเนอร์โดยไม่ต้องยกระดับสิทธิ์ คำสั่ง CLI ก็เกือบจะเหมือนกับ Docker
จุดเด่นหลักของ Podman
จุดเด่นที่สำคัญของ Podman มีดังนี้
โครงสร้างแบบ daemonless
Podman ไม่ต้องใช้เดมอน (process ประเภท background) ในการจัดการคอนเทนเนอร์ จึงไม่สิ้นเปลืองทรัพยากรและระบบทำงานได้มีประสิทธิภาพ
รองรับ rootless (ผู้ใช้ทั่วไป)
Podman อนุญาตให้ผู้ใช้ทั่วไปสามารถรันและจัดการคอนเทนเนอร์ได้ จึงเหมาะกับเซิร์ฟเวอร์หรือ multi-user environment และลดความเสี่ยงด้านความปลอดภัยอย่างมาก
CLI ที่เข้ากันได้กับ Docker
Podman ใช้ชุดคำสั่งที่เกือบจะเหมือนกับ Docker เช่น คำสั่งต่อไปนี้ก็ใช้กับ Podman ได้เช่นกัน
podman build -t myimage .
podman run -it myimage bash
ดังนั้นผู้มีประสบการณ์กับ Docker สามารถเปลี่ยนมาใช้ Podman ได้ทันที
ฟีเจอร์ pod (กลุ่มคอนเทนเนอร์)
Podman นำแนวคิด “Pod” จาก Kubernetes มาใช้ สามารถจัดกลุ่มคอนเทนเนอร์หลายตัวเป็นหนึ่งหน่วย ซึ่งเหมาะกับการพัฒนา local หรือ migration ไปยัง cloud environment
ความเข้ากันได้กับ Ubuntu
แม้ว่า Podman จะได้รับความนิยมใน Fedora หรือสาย RHEL แต่ สามารถใช้งานได้เสถียรบน Ubuntu เช่นกัน สามารถติดตั้งจาก official repository ได้ง่าย โดยเฉพาะ Ubuntu 20.04 LTS ขึ้นไป มี package ที่รองรับอย่างดี
3. วิธีติดตั้ง Podman บน Ubuntu
ก่อนเริ่ม: ข้อควรตรวจสอบก่อนติดตั้ง
ก่อนติดตั้ง Podman บน Ubuntu ควรตรวจสอบเวอร์ชัน Ubuntu ที่ใช้อยู่ แนะนำให้ใช้ Ubuntu 20.04 LTS ขึ้นไป หากเป็นเวอร์ชันเก่า package ที่จำเป็นอาจไม่มีใน repository
ตรวจสอบเวอร์ชัน Ubuntu ด้วยคำสั่งต่อไปนี้
lsb_release -a
การติดตั้ง Podman ต้องใช้สิทธิ์ sudo ถึงแม้จะใช้ rootless mode ได้ แต่ขณะติดตั้งต้องมีสิทธิ์ admin
ขั้นตอนติดตั้ง Podman (Ubuntu official repository)
สำหรับ Ubuntu 20.04, 22.04 ขึ้นไป สามารถติดตั้ง Podman ได้ง่ายด้วย APT
sudo apt update
sudo apt install -y podman
ติดตั้งเสร็จแล้วตรวจสอบเวอร์ชันเพื่อยืนยันการติดตั้ง
podman --version
หากต้องการใช้เวอร์ชันล่าสุด (เพิ่ม official PPA)
Podman ใน Ubuntu repository อาจจะไม่ใช่เวอร์ชันล่าสุด ถ้าอยากใช้ฟีเจอร์ใหม่ๆ ให้เพิ่ม official PPA (Personal Package Archive)
. /etc/os-release
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/xUbuntu_${VERSION_ID}/Release.key | sudo apt-key add -
sudo apt update
sudo apt install -y podman
ด้วยวิธีนี้จะสามารถใช้ Podman รุ่นล่าสุดเช่นเดียวกับ Red Hat หรือ Fedora
ทดสอบการทำงานขั้นพื้นฐานของ Podman
ติดตั้งเสร็จแล้ว ให้ลองทดสอบการทำงานเบื้องต้น
podman info
คำสั่งนี้จะแสดงข้อมูลเวอร์ชัน podman, การตั้งค่าต่างๆ และฟีเจอร์ที่รองรับ (เช่น rootless mode)
ลองดึงและรัน Alpine Linux container เพื่อตรวจสอบด้วย
podman run --rm -it alpine sh
ถ้าเข้าสู่ shell ได้ แสดงว่า Podman ใช้งานได้ปกติ
4. พื้นฐานของ Dockerfile และการใช้งานกับ Podman
Dockerfile คืออะไร?
Dockerfile คือไฟล์พิมพ์เขียวสำหรับสร้างอิมเมจคอนเทนเนอร์ โดยเขียนเป็น text ระบุ base image, คำสั่งติดตั้ง package, การ copy ไฟล์ ฯลฯ แบบเป็นลำดับ
เมื่อมี Dockerfile แล้ว Podman หรือ Docker จะสร้าง environment ที่เหมือนกันได้โดยอัตโนมัติ
ตัวอย่างคำสั่งใน Dockerfile:
FROM ubuntu:22.04
RUN apt update && apt install -y curl
COPY ./app.sh /usr/local/bin/app.sh
CMD ["bash", "/usr/local/bin/app.sh"]
ลำดับคือ: ใช้ base image Ubuntu, ติดตั้ง package, copy script, และกำหนดคำสั่งรัน
วิธีใช้ Dockerfile กับ Podman
Podman สามารถ build image จาก Dockerfile ได้ วิธีใช้เหมือนกับ Docker
1. เตรียมไดเรกทอรี
เช่น โครงสร้างต่อไปนี้
project/
├── Dockerfile
└── app.sh
app.sh
เป็นสคริปต์ง่ายๆ เช่น
#!/bin/bash
echo "Hello from Podman container!"
อย่าลืมให้สิทธิ์ execute
chmod +x app.sh
2. Build ด้วย Podman
ถ้าอยู่ใน directory เดียวกับ Dockerfile ให้ build ด้วย
podman build -t mypodmanapp .
จะได้ image ชื่อ mypodmanapp
3. ตรวจสอบผลลัพธ์
ดูรายการ image ที่สร้าง
podman images
4. รันคอนเทนเนอร์
ใช้ image ที่ build มา รันคอนเทนเนอร์
podman run --rm mypodmanapp
ถ้าตั้งค่าถูกต้อง จะเห็นข้อความ Hello from Podman container!
ความแตกต่างระหว่าง Dockerfile และ Containerfile
Podman อาจเรียกไฟล์ Dockerfile ว่า Containerfile เพื่อเน้นความเป็นกลางไม่ผูกกับ Docker
แต่เนื้อหาและการใช้งานเหมือนกันทั้งสองชื่อ จะใช้ Dockerfile
หรือ Containerfile
ก็ได้กับ Podman
podman build -f Containerfile -t myimage .
ใช้ option -f
เพื่อระบุชื่อไฟล์ได้