บทนำ: ทำไม Podman Rootless จึงสำคัญในปี 2026?
ในยุคที่ Container เป็นพื้นฐานของ Modern Infrastructure การเลือก Container Runtime ที่เหมาะสมนั้นมีความสำคัญมากกว่าที่เคย เพราะมันส่งผลโดยตรงต่อ:
- Security Posture: Rootless Containers ลดพื้นที่โจมตี (Attack Surface) อย่างมาก
- Permissions Management: หลีกเลี่ยงปัญหา file permissions เมื่อใช้ Docker กับ volume mounts
- Development Workflow: ใช้งานได้กับทุก user account โดยไม่ต้อง sudo
Podman เป็น Container Runtime ที่พัฒนาโดย Red Hat และเป็นส่วนหนึ่งของ libpod projectซึ่งเป็น library สำหรับ container management ที่เป็น open source
จุดเด่นที่สำคัญที่สุดของ Podman คือ Rootless Mode - คุณลักษณะที่ทำให้ Podman แตกต่างจาก Docker และ Containerd ที่ต้องใช้ root privileges หรือ daemon ในการทำงาน
"ถ้าคุณกำลังหา Container Runtime ที่ปลอดภัยกว่า Docker และไม่ต้องการจัดการกับ root permissions ลอง Podman ดูสิ - มันจะเปลี่ยนวิธีการทำงานของคุณ"
1. Podman คืออะไร?
Podman (Container Manager) เป็น:
Podman คือ
- Container Runtime - รัน container ตาม OCI (Open Container Initiative) standard
- Rootless by Default - สามารถรัน container ได้โดยไม่ต้อง root
- Daemon-less - ไม่มี daemon process ที่ต้องจัดการ
- Docker-compatible CLI - ใช้งาน CLI แบบเดียวกับ Docker
- Kubernetes Native - สร้าง pod พร้อมกับ Kubernetes Pod API
ความแตกต่างจาก Docker
- Container Runtime: Docker ใช้ docker-engine (daemon)
- Rootless: Docker ต้อง sudo หรืออยู่ใน docker group
- Architecture: Podman เป็น library (libpod) + CLI
- Security: Podman มี attack surface น้อยกว่า
- Performance: ใกล้เคียงกัน แต่ Docker เร็วกว่าเล็กน้อย (~10%)
Podman ถูกพัฒนาขึ้นเพื่อแก้ปัญหาด้าน security และ complexity ที่เกิดจาก Docker daemon architecture โดยใช้ approach ที่เรียกว่า "daemon-less container runtime"
2. Rootless Containers คืออะไร?
Rootless Container คือ Container ที่ถูกรันโดย user account ปกติ (non-root user) โดยไม่ต้องใช้ สิทธิ์ root หรือ sudo
ปัญหา Dockerแบบดั้งเดิม approach
Problem #1: Docker daemon ต้องรันด้วย root
Problem #2: User ต้องอยู่ใน docker group เพื่อรัน container
Problem #3: Volume mounts มักมี file permission issues
Problem #4: Root full access ทำให้เกิดsecurity risk มากขึ้น
Problem #5: Multi-tenant environments ยากที่จะจัดการ
Rootless รีมแก้ปัญหาเหล่านี้ทั้งหมด โดยใช้:
Rootless Solution
-
slirp4netns
Network namespace for rootless networking
-
fuse-overlayfs
Union filesystem without root
-
user namespaces
Isolate user IDs inside container
-
seccomp/SELinux/AppArmor
Mandatory access controls
Security Benefits
- No root privileges required
- Limited network access by default
- Isolated user ID namespace
- Reduced attack surface
- Harder to escape container
How it works: Rootless Podman ใช้ User Namespaces เพื่อ map user ID ภายนอก (non-root) ไปยัง root (UID 0) ภายใน container ทำให้ container มี root ภายในแต่ host machine ยังคงเป็น non-root user
3. การติดตั้ง Podman
Podman รองรับหลาย Linux distributions โดยหลักการติดตั้งจะแตกต่างกันไปตาม distro แต่โดยทั่วไปแล้วมักมีใน package repository หลักอยู่แล้ว
3.1 Ubuntu / Debian
# Update package list
sudo apt update
# Install Podman
sudo apt install -y podman
# Verify installation
podman --version
Note: ต้องติดตั้ง slirp4netns และ fuse-overlayfs เองสำหรับ rootless mode
# Install networking and storage backends
sudo apt install -y slirp4netns fuse-overlayfs
3.2 CentOS / RHEL / Rocky Linux / AlmaLinux
# Install Podman (CentOS Stream/RHEL 8+)
sudo dnf install -y podman slirp4netns fuse-overlayfs
# For older versions
sudo yum install -y podman
3.3 Fedora
# Fedora มี Podman มีอยู่ใน main repo แล้ว
sudo dnf install -y podman slirp4netns fuse-overlayfs
3.4 Arch Linux
# Install from [community] repo
sudo pacman -S podman slirp4netns fuse-overlayfs
3.5 การติดตั้งจาก Binary (.tar.gz)
ถ้า distro ของคุณไม่มี Podman ใน repository หรือต้องการ version ล่าสุด สามารถดาวน์โหลด binary จาก GitHub releases
# Download latest release (v4.8.2 เป็นตัวอย่าง)
wget https://github.com/containers/podman/releases/download/v4.8.2/podman-remote-release.tar.gz
# Extract
tar -xzf podman-remote-release.tar.gz
cd podman-4.8.2
# Run installer script
./install.sh
# หรือ manually copy binary
sudo cp bin/podman /usr/local/bin/
sudo cp bin/podman-remote /usr/local/bin/
3.6 การตรวจสอบการติดตั้ง
# Check version
podman --version
# Output: podman version 4.8.2
# Check if rootless mode is working
podman info --human-readable
# Check rootless networking
slirp4netns --version
# Output: slirp4netns version 1.2.0
4. การตั้งค่า Rootless Mode
การตั้งค่า Rootless Mode มี 2 ส่วนหลัก: User Namespace Allocation และ Storage Configuration
4.1 User Namespace Range Setup
ต้องกำหนด range ของ user IDs สำหรับ rootless containers โดยแก้ไขไฟล์ /etc/subuid และ /etc/subgid
# Add user namespace ranges for 'ubuntu' user
echo "ubuntu:100000:65536" | sudo tee -a /etc/subuid
echo "ubuntu:100000:65536" | sudo tee -a /etc/subgid
คำอธิบาย: บรรทัด ubuntu:100000:65536 คือให้ user ubuntu ใช้ UID range จาก 100000 ถึง 165535 (65536 IDs) สำหรับ mappings ภายใน container
4.2 Storage Configuration (fuse-overlayfs)
ต้องตั้งค่า container storage ให้ใช้ fuse-overlayfs สำหรับ Layered filesystem แทนที่จะใช้ overlay ที่ต้องการ root
# Create user config directory
mkdir -p ~/.config/containers
# Create storage configuration
cat < EOF > ~/.config/containers/storage.conf
[storage]
driver = "overlay"
graphroot = "$HOME/.local/share/containers/storage"
runroot = "$RUNTIME_DIR/containers"
mount_program = "fuse-overlayfs"
[storage.options]
mount_program = "fuse-overlayfs"
mountopt = "nodev,fsync=0"
EOF
# Set environment variable for runroot
export RUNTIME_DIR=/tmp
4.3 Network Configuration (slirp4netns)
Rootless containers ใช้ slirp4netns สำหรับ networknamespace ซึ่งให้ networking แบบ user-space
# Verify slirp4netns is installed
which slirp4netns
# Output: /usr/bin/slirp4netns
# Check version
slirp4netns --version
# Expected: version 1.1.0+ (ต้อง version ใหม่กว่า)
4.4 Check Rootless Mode is Working
# Check if running in rootless mode
podman info | grep -i rootless
# Output: rootless: true
5. Podman CLI - รู้จักคำสั่งพื้นฐาน
Podman มี CLI interface ที่ Docker-compatible หมายความว่าคำสั่งส่วนใหญ่ทำงานเหมือน Docker เลยก็ว่าได้
Docker vs Podman Commands
docker ps
→
Podman: podman ps
docker run
→
Podman: podman run
docker images
→
Podman: podman images
docker build
→
Podman: podman build
docker stop
→
Podman: podman stop
docker rmi
→
Podman: podman rmi
Common Podman Commands
podman search nginx - ค้นหา container images
podman run -d --name web -p 8080:80 nginx - รัน container
podman ps -a - ดู container ทั้งหมด (running + stopped)
podman images - ดู images ทั้งหมด
podman logs web - ดู logs ของ container 'web'
podman exec -it web bash - เข้า container แบบ interactive
podman stop web && podman rm web - ลบ container
Important! Podman มี 2 commands หลัก ที่ต้องรู้:
- podman - ตัวหลักสำหรับ all-in-one container operations
- podman-remote - สำหรับ remote management (ใช้กับ Podman Machine)
6. ตัวอย่างการใช้งานจริง
ตอนนี้มาถึงส่วนที่สำคัญที่สุด - การใช้งาน Podman แบบ Rootless ด้วยตัวอย่างจริง
6.1 Run Container พื้นฐาน
# รัน nginx container (Daemon mode)
podman run -d \
--name webserver \
-p 8080:80 \
--restart=unless-stopped \
nginx:latest
# ตรวจสอบว่า container ทำงาน
podman ps
# ดู logs
podman logs webserver
# เข้า container แบบ interactive
podman exec -it webserver bash
# ออกจาก container
exit
# หยุด container
podman stop webserver
# ลบ container
podman rm webserver
6.2 Run Container แบบ Interactive
# Run Ubuntu container แบบ interactive
podman run -it \
--name ubuntu-test \
--rm \
ubuntu:22.04 bash
# Inside container:
# apt update && apt install -y curl vim
# Exit (container จะถูกลบด้วย --rm)
exit
6.3 Volume Mounts (Rootless Edition)
# สร้าง directory สำหรับ mount
mkdir -p ~/data/nginx/html
mkdir -p ~/data/nginx/logs
# Run nginx with volume mounts
podman run -d \
--name nginx-data \
-p 8081:80 \
-v ~/data/nginx/html:/usr/share/nginx/html:Z \
-v ~/data/nginx/logs:/var/log/nginx:Z \
nginx:latest
# สร้าง test HTML file
cat > ~/data/nginx/html/index.html << EOF
<html>
<head><title>Podman Rootless Test</title></head>
<body>
<h1>Hello from Podman Rootless!</h1>
<p>Volume mounts working correctly!</p>
</body>
</html>
EOF
# ทดสอบด้วย curl
curl http://localhost:8081
# ดู logs
podman logs nginx-data
Important about Volume Mounts in Rootless: ใช้ :Z flag เพื่อ set SELinux context ถ้าใช้ SELinux หรือใช้ :U เพื่อ fix file permissions
6.4 Build Image (Rootless)
# สร้างไฟล์ Dockerfile
mkdir -p ~/myapp
cd ~/myapp
cat > Dockerfile << EOF
FROM ubuntu:22.04
RUN apt update && apt install -y \
curl \
vim \
net-tools
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
EXPOSE 8080
ENTRYPOINT ["/entrypoint.sh"]
EOF
cat > entrypoint.sh << EOF
#!/bin/bash
echo "Container started at $(date)"
exec tail -f /dev/null
EOF
# Build image (rootless)
podman build -t myapp:latest .
6.5 Run Multi-Container App (Rootless)
Podman รองรับการรัน multi-container applications โดยใช้ Podman Pods ซึ่งคล้ายกับ Kubernetes Pod
# สร้าง Pod (กลุ่มของ containers)
podman pod create \
--name webapp-pod \
-p 8080:80 \
-p 3306:3306
# Run web container กับ pod
podman run -d \
--name nginx \
--pod webapp-pod \
-v ~/data/nginx/html:/usr/share/nginx/html:Z \
nginx:latest
# Run database container กับ pod (MariaDB)
podman run -d \
--name mariadb \
--pod webapp-pod \
-e MYSQL_ROOT_PASSWORD=secret123 \
-e MYSQL_DATABASE=webapp \
-v ~/data/mysql:/var/lib/mysql:Z \
mariadb:10.6
6.6 Systemd Integration (Rootless)
Podman ทำงานร่วมกับ systemd เพื่อจัดการ container เป็น services
# สร้าง systemd user service file
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/nginx.service << EOF
[Unit]
Description=Nginx Web Server
After=network.target
[Service]
Type=simple
ExecStartPre=-/usr/bin/podman stop nginx
ExecStartPre=-/usr/bin/podman rm nginx
ExecStart=/usr/bin/podman run \
--name nginx \
-p 8080:80 \
-v ~/data/nginx/html:/usr/share/nginx/html:Z \
--restart=unless-stopped \
nginx:latest
ExecStop=/usr/bin/podman stop nginx
Restart=always
RestartSec=3
[Install]
WantedBy=default.target
EOF
# Enable and start service
systemctl --user daemon-reload
systemctl --user enable nginx
systemctl --user start nginx
# Check status
systemctl --user status nginx
# ดู logs
journalctl --user -u nginx -f
7. การจัดการ Container Images
Podman ใช้ container registry แบบเดียวกับ Docker - คือ Docker Hub และยังรองรับ other registries เช่น quay.io, registry.fedoraproject.org
7.1 Search for Images
# Search for nginx images
podman search nginx
# Search with filters
podman search nginx --filter is-official=true
# Search on specific registry
podman search quay.io/nginx
7.2 Pull Images
# Pull latest nginx image
podman pull nginx:latest
# Pull specific version
podman pull nginx:1.24
# Pull from specific registry
podman pull quay.io/bitnami/nginx:latest
# List pulled images
podman images
7.3 Push Images (to private registry)
# Tag image for pushing
podman tag myapp:latest myregistry.com/myuser/myapp:latest
# Login to registry (quay.io เป็นตัวอย่าง)
podman login quay.io
# Push image
podman push myregistry.com/myuser/myapp:latest
7.4 Image Management Tips
Tips for Image Optimization
- Use multi-stage builds for smaller images
- Use official images as base
- Combine RUN commands to reduce layers
- Use .dockerignore to exclude unnecessary files
- Use specific tags instead of 'latest'
8. การเปรียบเทียบ: Podman vs Docker vs Containerd
สรุปข้อมูลเปรียบเทียบระหว่าง Container runtimes ที่สำคัญที่สุดในปี 2026
| Criteria | Podman | Docker | Containerd |
|---|---|---|---|
| Rootless Mode | Built-in | Required sudo | Root only |
| Daemon | None (libpod) | dockerd | containerd |
| Security | Excellent | Good | Good |
| Performance | 95% | 100% | 100% |
| Kubernetes Native | Native | Indirect | Primary |
| CLI Compatibility | High | 100% | Low |
| Multi-tenancy | Excellent | Moderate | Moderate |
| Best For | Security, Rootless, DevSecOps | General use, Ecosystem | K8s, Production |
Recommendation Guide
-
เลือก Podman ถ้าคุณ...
- ต้องการ rootless containers
- งาน security-sensitive environments
- ใช้ Linux desktop หรือ workstation
- ต้องการ avoid Docker daemon complexity
-
เลือก Docker ถ้าคุณ...
- ต้องการ ecosystem ที่ครบครัน
- ใช้ Docker Desktop (Windows/Mac)
- มี legacy code that depends on Docker
-
เลือก Containerd ถ้าคุณ...
- ทำงานกับ Kubernetes
- ต้องการ lightweight runtime
- เขียน container runtime tools
9. Troubleshooting Rootless Podman
ปัญหาที่พบบ่อยเมื่อใช้ Rootless Podman และวิธีแก้ไข
9.1 "Error: the binary `slirp4netns` was not found"
# Install slirp4netns
sudo apt install slirp4netns # Ubuntu/Debian
sudo dnf install slirp4netns # RHEL/CentOS/Fedora
9.2 "Error: the binary `fuse-overlayfs` was not found"
# Install fuse-overlayfs
sudo apt install fuse-overlayfs # Ubuntu/Debian
sudo dnf install fuse-overlayfs # RHEL/CentOS/Fedora
9.3 Volume Mount Permission Denied
# Check and fix permissions
# ใช้ --userns=auto หรือ chown ให้ถูก user namespace
chown -R $USER:$USER ~/data
# หรือใช้ :U flag เพื่อ fix ownership
podman run -v ~/data:/data:U nginx:latest
9.4 No Network in Container
# Check if slirp4netns is installed
which slirp4netns
# Try explicit network mode
podman run --net slirp4netns:port_handler=slirp4netns nginx:latest
9.5 Debug Commands
# Debug info
podman info --debug
# Check logs
podman logs <container-name>
# Check events
podman events
# Check pod status
podman pod ps
# Check image storage
podman images -a
# Check container storage
podman storage ls
10. Best Practices & Recommendations
สรุป best practices สำหรับการใช้งาน Podman Rootless
ทำ
- ใช้ multi-stage builds
- Use
:Zor:Uflags for volume mounts - Set up user namespace ranges properly
- Use systemd user services for long-running containers
- Enable automatic updates with systemd timer
- Use podman system reset to clean up storage
ไม่ควรทำ
- อย่าใช้ root modeใน container security
- อย่า mount sensitive host directories root
- อย่าใช้ --privileged flag rootless
- อย่า ignore volume mount permissions
- อย่าใช้ latest tagใน production
- อย่า forget to clean up unused images
Podman Commands Reference Card
# Quick Reference for Common Tasks
# Container Management
podman run -d --name app image # Run detached
podman ps -a # List all containers
podman stop app # Stop container
podman start app # Start container
podman restart app # Restart container
podman rm app # Remove container
podman logs app # View logs
podman exec -it app bash # Enter container
# Image Management
podman images # List images
podman search nginx # Search images
podman pull nginx:latest # Pull image
podman push user/app:latest # Push image
podman rmi nginx # Remove image
podman build -t app:latest . # Build image
# System Management
podman info # system info
podman system prune # Clean up unused data
podman system reset # Reset storage
podman pod ps # List pods
podman pod stop mypod # Stop pod
podman pod rm mypod # Remove pod
# Rootless Specific
podman info | grep rootless # Check rootless status
slirp4netns --version # Check networking
podman storage history # Check storage usage
11. แหล่งข้อมูลเพิ่มเติม
แหล่งข้อมูลที่เป็นประโยชน์สำหรับPeloman และ Rootless Containers
Official Documentation
- podman.io - หน้าเว็บหลัก
- GitHub - Source code
- docs.podman.io - Documentation
- Storage - containers/storage
- Netavark - Network stack
Rootless-specific
- rootlesscontaine.rs - Rootless Container Guide
- slirp4netns - Networking daemon
- fuse-overlayfs - Union filesystem
Community Resources
- Manjaro Forum - User discussions
- YouTube Tutorials - Video guides
- Hacker News - Community feedback
Reading time: ~15 minutes
Last updated: February 2026