อัปเดตล่าสุด: กุมภาพันธ์ 2026

Podman Rootless Containers

Container Runtime แบบ Rootless สำหรับ DevOps & System Administration สมัยใหม่

เรียนรู้การใช้งาน Podman ซึ่งเป็น Container Runtime ที่นักพัฒนาและผู้ดูแลระบบสมัยใหม่ควรรู้จัก - ปลอดภัยกว่า Docker ด้วย_rootless mode_

Linux
Container
Rootless
DevOps
DevOps Container Security 15 นาที

บทนำ: ทำไม 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: docker ps Podman: podman ps
Docker: docker run Podman: podman run
Docker: docker images Podman: podman images
Docker: docker build Podman: podman build
Docker: docker stop Podman: podman stop
Docker: 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 :Z or :U flags 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

Rootless-specific

Community Resources

Reading time: ~15 minutes

Last updated: February 2026

DevOps Container Security Linux