การติดตั้ง Podman บน Rocky Linux 10 แบบใช้งานจริง

การติดตั้ง Podman บน Rocky Linux 10 แบบใช้งานจริง

อยากรัน 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:80 map 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