อยากรัน Container แต่ไม่อยากพึ่ง Docker Daemon
ถ้าคุณดูแล Server สาย Linux โดยเฉพาะตระกูล RHEL/Rocky Linux จะเจอว่าเครื่องมือ Container ที่ถูกแนะนำมากขึ้นเรื่อย ๆ คือ Podman แทนที่จะเป็น Docker แบบเดิม จุดเด่นคือ Podman ทำงานแบบ daemonless ใช้งานแบบ rootless container ได้ดี และเข้ากับ ecosystem ของ Rocky Linux / RHEL มากกว่า
บทความนี้จะแนะนำการติดตั้ง Podman บน Rocky Linux 10.x ตั้งแต่เริ่มต้น ทดสอบรัน container แรก เปิด firewall ให้เข้าถึงจากเครื่องอื่น และแนะนำคำสั่งพื้นฐานที่ควรรู้
Podman เป็นเครื่องมือจัดการ container และ image ที่รองรับมาตรฐาน OCI โดยคู่มือ Rocky Linux ระบุว่า Podman ทำงานแบบไม่ต้องมี daemon, รองรับการจัดการ container ด้วย user ปกติ และมีอยู่ใน repository ของ Rocky Linux โดยตรง
บทความนี้จะได้อะไร
ในบทความนี้เราจะทำสิ่งต่อไปนี้
-
ตรวจสอบระบบ Rocky Linux 10
-
อัปเดต package repository
-
ติดตั้ง Podman ด้วย
dnf -
ตรวจสอบเวอร์ชันและสถานะ Podman
-
ทดสอบรัน container แรก
-
รัน Nginx container บน port 8080
-
เปิด port ด้วย
firewalld -
ใช้งาน volume ร่วมกับ SELinux อย่างถูกต้อง
-
แนะนำ
podman-composeและ systemd/Quadlet เบื้องต้น
บทความนี้เน้นใช้งานผ่าน command line เหมาะสำหรับ Server, Lab, VM, Proxmox VM, VirtualBox และเครื่องจริง
พื้นฐานที่จำเป็นก่อนเริ่ม
Environment ที่ใช้ในบทความ
-
OS: Rocky Linux 10.x
-
Package Manager:
dnf -
Container Engine: Podman จาก official repository ของ Rocky Linux
-
User: ใช้ user ปกติที่มีสิทธิ์
sudo -
Network: เชื่อมต่อ Internet ได้
-
Firewall: ใช้
firewalld
ตรวจสอบเวอร์ชันระบบก่อนเริ่ม
cat /etc/rocky-release
ตัวอย่างผลลัพธ์ที่คาดหวัง
Rocky Linux release 10.x
ตรวจสอบ kernel และ architecture
uname -a
ตรวจสอบว่า user ปัจจุบันมีสิทธิ์ sudo หรือไม่
sudo whoami
ถ้าได้ผลลัพธ์เป็น root แปลว่า user นี้สามารถใช้ sudo ได้
root
ทำไมถึงควรใช้ Podman บน Rocky Linux 10
1. ติดตั้งง่ายจาก Repository โดยตรง
คู่มือ Rocky Linux 10 แนะนำให้ติดตั้ง Podman ด้วยคำสั่ง dnf install podman โดยตรง
2. ใช้งานแบบ Rootless ได้ดี
Podman สามารถรัน container ด้วย user ปกติได้ ลดความจำเป็นในการรัน container engine ด้วยสิทธิ์ root ตลอดเวลา Rocky Linux documentation ระบุว่า Podman รองรับการจัดการ container โดยไม่ต้องเป็น root
3. คำสั่งคล้าย Docker
ผู้ที่เคยใช้ Docker มาก่อนจะปรับตัวได้ง่าย เช่น
podman run
podman ps
podman images
podman stop
podman rm
Rocky Linux documentation ระบุว่า Podman สามารถใช้คำสั่งได้ใกล้เคียงกับ Docker หลายคำสั่ง เพราะ CLI มีลักษณะคล้ายกัน
4. เหมาะกับงาน Server และ systemd
Podman สามารถนำ container ไปจัดการผ่าน systemd ได้ โดย Rocky Linux documentation มีตัวอย่างการใช้งานร่วมกับ Quadlet และ systemd user service
ขั้นตอนที่ 1: อัปเดตระบบก่อนติดตั้ง
ก่อนติดตั้ง package ใหม่ ควรอัปเดต metadata และ package ให้เรียบร้อย
sudo dnf update -y
คำอธิบาย:
-
sudoใช้รันคำสั่งด้วยสิทธิ์ผู้ดูแลระบบ -
dnf updateใช้อัปเดต package ในระบบ -
-yตอบ yes อัตโนมัติ
⚠️ คำเตือน: คำสั่งนี้อาจอัปเดต kernel หรือ service สำคัญในระบบ Production ควรทำในช่วง Maintenance Window หากเป็นเครื่องที่ให้บริการจริง
หลังอัปเดต หากมี kernel ใหม่ แนะนำให้ reboot
sudo reboot
หลังจากเครื่องกลับมา ให้ login ใหม่ แล้วตรวจสอบสถานะระบบ
uptime
ขั้นตอนที่ 2: ติดตั้ง Podman
ติดตั้ง Podman ด้วย dnf
sudo dnf install -y podman
คำอธิบาย:
-
dnf installใช้ติดตั้ง package -
podmanคือ package หลักของ Podman -
-yยืนยันการติดตั้งอัตโนมัติ
เอกสาร Rocky Linux 10 ระบุวิธีติดตั้ง Podman ด้วย dnf install podman โดยตรง
เมื่อติดตั้งเสร็จ ตรวจสอบเวอร์ชัน
podman --version
ตัวอย่างผลลัพธ์
podman version 5.8.2

หมายเหตุ: เลขเวอร์ชันจริงอาจเปลี่ยนตาม repository และ security update ของ Rocky Linux 10 ให้ยึดผลลัพธ์จากเครื่องของผู้อ่านเป็นหลัก
ตรวจสอบข้อมูลระบบของ Podman
podman info

ถ้าต้องการดูเฉพาะข้อมูลแบบสั้น
podman info --format '{{.Host.OS}} {{.Host.Arch}}'
หรือถ้าต้องการดูผ่าน field สำเร็จรูปของ version ใช้ได้อีกแบบ
podman version –format ‘{{.Client.OsArch}}’
หรือ
podman info –format ‘{{.Version.OsArch}}’
ตัวอย่างผลลัพธ์
linux amd64

ขั้นตอนที่ 3: ทดสอบรัน Container แรก
เราจะใช้ image hello-world เพื่อทดสอบว่า Podman สามารถ pull image และ run container ได้จริง
podman run --rm docker.io/library/hello-world:latest
คำอธิบาย:
-
podman runใช้สร้างและรัน container -
--rmลบ container อัตโนมัติหลังจบการทำงาน -
docker.io/library/hello-world:latestระบุ image แบบเต็ม เพื่อลดปัญหาเลือก registry ผิด
ถ้าทำงานถูกต้อง จะเห็นข้อความประมาณว่า container ทำงานสำเร็จ
ตรวจสอบ image ที่ถูกดาวน์โหลดมา
podman images
ตัวอย่างผลลัพธ์
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/hello-world latest xxxxxxxx x days ago xx kB
ขั้นตอนที่ 4: รัน Nginx Container สำหรับทดสอบ Web Server
ต่อไปเราจะรัน Nginx container โดย map port จาก container port 80 ออกมาที่ host port 8080 (กรณีรันบรรทัดเดียวกันให้ตัด \ ออก)
podman run -d \
--name web-demo \
-p 8080:80 \
docker.io/library/nginx:alpine

คำอธิบาย:
-
-dรันแบบ background -
--name web-demoตั้งชื่อ container -
-p 8080:80map port 8080 บน host ไปยัง port 80 ใน container -
docker.io/library/nginx:alpineใช้ Nginx image รุ่น Alpine ที่ขนาดเล็ก
ตรวจสอบ container ที่กำลังทำงาน
podman ps

ทดสอบจากเครื่อง server เอง
curl http://127.0.0.1:8080
ถ้าใช้งานได้ จะเห็น HTML ของ Nginx default page
ดู log ของ container
podman logs web-demo
ดู log แบบ follow
podman logs -f web-demo

หยุด container
podman stop web-demo
เริ่ม container เดิมอีกครั้ง
podman start web-demo
ลบ container
podman rm -f web-demo
⚠️ คำเตือน: คำสั่ง podman rm -f จะบังคับลบ container แม้กำลังทำงานอยู่ ควรตรวจสอบชื่อ container ให้ถูกต้องก่อนรัน
ขั้นตอนที่ 5: เปิด Firewall สำหรับเข้าจากเครื่องอื่น
ถ้าทดสอบจากเครื่อง server เองด้วย curl http://127.0.0.1:8080 แล้วใช้งานได้ แต่เครื่องอื่นในวง LAN เข้าไม่ได้ สาเหตุที่พบบ่อยคือ firewalld ยังไม่ได้เปิด port
คู่มือ Rocky Linux ระบุว่า Rocky Linux เปิดใช้ firewalld มาโดยค่าเริ่มต้น และอาจบล็อก port 8080 หากต้องการเข้าถึง service จากภายนอกต้องเปิด port ให้ถูกต้อง
ตรวจสอบสถานะ firewall
sudo systemctl status firewalld
เปิด port 8080 แบบถาวร
sudo firewall-cmd --add-port=8080/tcp --permanent
reload firewall
sudo firewall-cmd --reload
ตรวจสอบ port ที่เปิดอยู่
sudo firewall-cmd --list-ports

ทดสอบจากเครื่องอื่นในวง LAN
curl http://SERVER_IP:8080
ตัวอย่าง
curl http://192.168.1.10:8080

เปิดเว็บเบราเซอร์ทดสอบ

⚠️ คำเตือนด้าน Security: เปิดเฉพาะ port ที่จำเป็นเท่านั้น หากเป็น server ที่ต่อ Internet โดยตรง ควรจำกัด source IP, ใช้ reverse proxy, เปิด HTTPS และวาง policy ให้รัดกุม
ขั้นตอนที่ 6 — ใช้งาน Volume ร่วมกับ SELinux
Rocky Linux ใช้ SELinux เป็นกลไกความปลอดภัยสำคัญ หาก mount directory จาก host เข้า container แล้วเจอปัญหา Permission denied อาจเกี่ยวกับ label ของ SELinux
แนวทางที่แนะนำคือใส่ suffix :Z กับ bind mount เพื่อให้ container engine relabel directory สำหรับ container นั้นโดยเฉพาะ Red Hat Developer อธิบายว่า :Z ใช้ relabel volume สำหรับการใช้งานแบบ private ของ container และไม่ควร relabel directory ระบบสำคัญ เช่น /home, /etc, /var/log ทั้งก้อน
สร้าง directory สำหรับทดสอบ
mkdir -p ~/podman-demo/html
สร้างไฟล์ HTML ง่าย ๆ
cat > ~/podman-demo/html/index.html <<'EOF'
<h1>Hello from Podman on Rocky Linux 10</h1>
<p>Managed by SysAdminth</p>
EOF
รัน Nginx โดย mount directory เข้า container
podman run -d \
--name web-volume \
-p 8081:80 \
-v ~/podman-demo/html:/usr/share/nginx/html:Z \
docker.io/library/nginx:alpine
ทดสอบจากเครื่อง server
curl http://127.0.0.1:8081
ถ้าต้องการให้เครื่องอื่นเข้าถึงได้ ให้เปิด firewall port 8081
sudo firewall-cmd --add-port=8081/tcp --permanent
sudo firewall-cmd --reload
ตรวจสอบ container
podman ps
ลบ container ทดสอบ
podman rm -f web-volume
ขั้นตอนที่ 7: รู้จัก Rootless Podman
ค่า default ที่ควรใช้ในงานทั่วไปคือรัน Podman ด้วย user ปกติ ไม่ใช่ root เช่น
podman run --rm docker.io/library/alpine:latest cat /etc/os-release
เมื่อใช้ rootless container ตำแหน่ง storage จะต่างจาก root container โดย Red Hat documentation ระบุว่า root ใช้ path /var/lib/containers/storage ส่วน non-root user ใช้ $HOME/.local/share/containers/storage
ตรวจสอบ storage path ของ user ปัจจุบัน
podman info --format '{{.Store.GraphRoot}}'
ตัวอย่าง rootless path
/home/student/.local/share/containers/storage
ข้อควรรู้ของ rootless container:
-
เหมาะกับงาน development และ lab
-
ลดความเสี่ยงจากการให้ container engine ทำงานด้วย root
-
ไม่ควร bind port ต่ำกว่า 1024 เช่น 80 หรือ 443 โดยตรง หากยังไม่ได้ปรับ system setting
-
นิยม map เป็น port สูง เช่น 8080, 8443 แล้วค่อยใช้ reverse proxy จัดการภายหลัง
ขั้นตอนที่ 8: ติดตั้ง podman-compose เมื่อต้องใช้ Compose File
ถ้ามีไฟล์ docker-compose.yml เดิม และต้องการนำมาทดสอบกับ Podman สามารถใช้ podman-compose ได้
Rocky Linux documentation ระบุว่าหากต้องใช้ compose file ให้ติดตั้ง podman-compose จาก EPEL โดยติดตั้ง epel-release ก่อน
ติดตั้ง EPEL repository
sudo dnf install -y epel-release
ติดตั้ง podman-compose
sudo dnf install -y podman-compose
ตรวจสอบเวอร์ชัน
podman-compose --version
ตัวอย่างไฟล์ compose.yml
services:
web:
image: docker.io/library/nginx:alpine
container_name: compose-web
ports:
- "8082:80"
รัน compose
podman-compose up -d
ตรวจสอบ container
podman ps
หยุดและลบ container จาก compose
podman-compose down
หมายเหตุ:
podman-composeเหมาะกับงาน lab และ migration เบื้องต้น หากเป็น production ควรทดสอบ behavior ของ network, volume และ environment variable ให้ครบก่อนใช้งานจริง
ขั้นตอนที่ 9: จัดการ Container ด้วยคำสั่งพื้นฐาน
ดู container ที่กำลังทำงาน
podman ps
ดู container ทั้งหมด รวมที่หยุดแล้ว
podman ps -a
ดู image ทั้งหมด
podman images
ดาวน์โหลด image ล่วงหน้า
podman pull docker.io/library/alpine:latest
เข้า shell ใน container
podman exec -it web-demo sh
หยุด container
podman stop web-demo
ลบ container
podman rm web-demo
ลบ image
podman rmi docker.io/library/alpine:latest
ดูการใช้พื้นที่ของ Podman
podman system df
ล้าง container และ image ที่ไม่ได้ใช้
podman system prune
⚠️ คำเตือน: หลีกเลี่ยงการใช้ podman system prune -a บนเครื่อง Production หากยังไม่แน่ใจ เพราะอาจลบ image ที่ไม่ได้ถูกใช้งานอยู่ในขณะนั้น แต่ยังจำเป็นต่อ deployment รอบถัดไป
ขั้นตอนที่ 10: ตัวอย่างใช้งานกับ systemd/Quadlet แบบสั้น
สำหรับ server ที่ต้องการให้ container start อัตโนมัติเมื่อ login หรือ reboot สามารถใช้ systemd user service ผ่าน Quadlet ได้ Rocky Linux documentation มีตัวอย่างการสร้างไฟล์ .container ใน path ~/.config/containers/systemd/ แล้วสั่ง systemctl --user daemon-reload เพื่อให้ systemd รู้จัก service ใหม่
สร้าง directory
mkdir -p ~/.config/containers/systemd
สร้างไฟล์ service สำหรับ Nginx
cat > ~/.config/containers/systemd/webdemo.container <<'EOF'
[Container]
Image=docker.io/library/nginx:alpine
ContainerName=webdemo
PublishPort=8083:80
[Service]
Restart=always
[Install]
WantedBy=default.target
EOF
reload systemd user
systemctl --user daemon-reload
start service
systemctl --user start webdemo.service
ตรวจสอบสถานะ
systemctl --user status webdemo.service
เปิดให้ start อัตโนมัติ
systemctl --user enable webdemo.service
หากต้องการให้ user service ทำงานต่อหลัง logout ให้ใช้ linger
sudo loginctl enable-linger $USER
⚠️ คำเตือน: การเปิด linger ทำให้ systemd user service ของ user นั้นสามารถทำงานต่อได้แม้ logout แล้ว ควรใช้กับ user ที่จัดไว้สำหรับ service โดยเฉพาะในระบบ Production
Troubleshooting — ปัญหาที่พบบ่อย
1. Pull image แล้วถามให้เลือก registry
ให้ระบุ image แบบเต็ม เช่น
podman pull docker.io/library/nginx:alpine
แทนที่จะใช้
podman pull nginx
2. เข้าเว็บจากเครื่องอื่นไม่ได้
ตรวจสอบว่า container ทำงานอยู่หรือไม่
podman ps
ตรวจสอบว่า port เปิดใน firewall หรือยัง
sudo firewall-cmd --list-ports
ตรวจสอบว่า server listen port หรือไม่
ss -tulpen | grep 8080
3. Mount volume แล้ว Permission denied
ตรวจสอบว่าใช้ :Z แล้วหรือไม่ เช่น
-v ~/podman-demo/html:/usr/share/nginx/html:Z
อย่า mount directory ระบบขนาดใหญ่ เช่น /home, /etc, /var/log เข้า container พร้อม :Z โดยไม่จำเป็น เพราะอาจกระทบ label ของไฟล์ในระบบ
4. คำสั่ง Docker เดิมใช้ไม่ได้ทั้งหมด
Podman คล้าย Docker มาก แต่ไม่เหมือนกัน 100% โดยเฉพาะเรื่อง daemon, network, compose และ permission ควรทดสอบทีละ service ก่อน migration
Verify Checklist
ก่อนจบบทความ ให้ตรวจสอบตาม checklist นี้
cat /etc/rocky-release
podman --version
podman info --format '{{.Store.GraphRoot}}'
podman run --rm docker.io/library/hello-world:latest
podman run -d --name web-demo -p 8080:80 docker.io/library/nginx:alpine
curl http://127.0.0.1:8080
sudo firewall-cmd --list-ports
ถ้าทุกคำสั่งทำงานได้ แปลว่าระบบ Rocky Linux 10 พร้อมใช้งาน Podman แล้ว
สรุป
Podman เป็นเครื่องมือ container ที่เหมาะมากสำหรับ Rocky Linux 10 เพราะติดตั้งง่ายผ่าน dnf, ใช้งานแบบ rootless ได้ดี, ไม่ต้องพึ่ง daemon กลาง และสามารถต่อยอดไปใช้กับ systemd/Quadlet ได้สะดวก สำหรับผู้ดูแลระบบที่คุ้นกับ Docker อยู่แล้ว การเริ่มต้นกับ Podman ไม่ยาก เพราะคำสั่งหลัก ๆ คล้ายกันมาก
แนวทางที่แนะนำคือเริ่มจากการติดตั้ง podman, ทดสอบด้วย hello-world, ทดลองรัน Nginx บน port 8080, เปิด firewall เฉพาะ port ที่จำเป็น และเรียนรู้เรื่อง volume กับ SELinux ตั้งแต่ต้น เพราะเป็นจุดที่พบบ่อยในงานจริงบน Rocky Linux
—
Write by Dr.Arnut Ruttanatirakul
SysAdmin Knowledge
https://www.sysadmin.in.th
July 6, 2026


