| name | podman |
| description | Manage containers using Podman, the daemonless container engine. Run rootless containers, create pods, manage images, and use Docker-compatible commands. Use when working with Podman or requiring rootless container operations. |
| license | MIT |
| metadata | {"author":"devops-skills","version":"1.0"} |
Podman
Run and manage containers without a daemon using Podman's rootless container engine.
When to Use This Skill
Use this skill when:
- Running containers without root privileges
- Managing containers on systems without Docker
- Creating pod-based container groups
- Using systemd for container management
- Working in security-conscious environments
Prerequisites
- Podman installed (4.x+)
- For rootless: user namespaces enabled
- Basic container concepts understanding
Key Differences from Docker
| Feature | Docker | Podman |
|---|
| Architecture | Client-daemon | Daemonless |
| Root required | Default | Optional (rootless) |
| Pod support | No | Yes (Kubernetes-style) |
| Systemd integration | Limited | Native |
| Socket | docker.sock | podman.sock (optional) |
Basic Commands
Container Operations
podman run -d --name webserver -p 8080:80 nginx
podman ps -a
podman stop webserver
podman rm webserver
podman exec -it webserver /bin/sh
podman logs -f webserver
Image Management
podman pull docker.io/library/nginx:latest
podman images
podman build -t myapp:latest .
podman push myapp:latest registry.example.com/myapp:latest
podman rmi nginx:latest
Rootless Containers
Setup
cat /proc/sys/user/max_user_namespaces
echo "user.max_user_namespaces=28633" | sudo tee /etc/sysctl.d/userns.conf
sudo sysctl -p /etc/sysctl.d/userns.conf
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER
podman unshare cat /proc/self/uid_map
Running Rootless
podman run -d --name myapp -p 8080:80 nginx
podman unshare id
podman top myapp user
Port Considerations
podman run -d -p 8080:80 nginx
echo "net.ipv4.ip_unprivileged_port_start=80" | sudo tee /etc/sysctl.d/ports.conf
sudo sysctl -p /etc/sysctl.d/ports.conf
Pods
Creating Pods
podman pod create --name mypod -p 8080:80 -p 5432:5432
podman run -d --pod mypod --name web nginx
podman run -d --pod mypod --name db postgres:15
podman pod ps
podman exec web curl localhost:5432
Pod Management
podman pod start mypod
podman pod stop mypod
podman pod rm -f mypod
podman pod inspect mypod
podman generate kube mypod > mypod.yaml
Systemd Integration
Generate Systemd Unit
podman generate systemd --new --name myapp > ~/.config/systemd/user/container-myapp.service
podman generate systemd --new --name mypod --files
systemctl --user daemon-reload
systemctl --user enable --now container-myapp.service
Quadlet (Podman 4.4+)
[Container]
Image=docker.io/library/nginx:latest
PublishPort=8080:80
Volume=webapp-data:/usr/share/nginx/html
[Service]
Restart=always
[Install]
WantedBy=default.target
systemctl --user daemon-reload
systemctl --user start webapp
Compose Compatibility
Using Podman Compose
pip install podman-compose
podman-compose up -d
systemctl --user enable --now podman.socket
export DOCKER_HOST=unix:///run/user/$UID/podman/podman.sock
docker-compose up -d
Native Podman Kube
podman kube play deployment.yaml
podman kube down deployment.yaml
Networking
Network Management
podman network create mynetwork
podman run -d --network mynetwork --name app myapp
podman network connect mynetwork existing-container
podman network ls
podman network inspect mynetwork
DNS Resolution
podman run -d --network mynetwork --name db postgres:15
podman run -d --network mynetwork --name app \
-e DATABASE_HOST=db myapp
Storage
Volume Management
podman volume create mydata
podman run -d -v mydata:/data myapp
podman volume ls
podman volume inspect mydata
ls ~/.local/share/containers/storage/volumes/
Bind Mounts
podman run -v ./data:/app/data:Z myapp
Registry Configuration
Configure Registries
unqualified-search-registries = ["docker.io", "quay.io"]
[[registry]]
prefix = "docker.io"
location = "docker.io"
[[registry.mirror]]
location = "mirror.gcr.io"
Authentication
podman login docker.io
podman login registry.example.com
Building Images
Buildah Integration
podman build -t myapp:latest .
podman build --format docker -t myapp .
podman build --target production -t myapp:prod .
Buildah Commands
buildah from scratch
buildah copy working-container ./app /app
buildah config --entrypoint '["/app/main"]' working-container
buildah commit working-container myapp:minimal
Common Issues
Issue: Permission Denied
Problem: Cannot access files in mounted volumes
Solution: Use :Z or :z suffix for SELinux, or check ownership
Issue: Cannot Connect to Container
Problem: Port not accessible in rootless mode
Solution: Use ports >= 1024 or configure unprivileged port start
Issue: Slow Image Pulls
Problem: Images download slowly
Solution: Configure registry mirrors in registries.conf
Issue: Systemd Service Fails
Problem: Container doesn't start via systemd
Solution: Enable lingering: loginctl enable-linger $USER
Best Practices
- Use rootless mode for enhanced security
- Leverage pods for related containers
- Generate systemd units for production
- Use Quadlet for declarative container services
- Configure SELinux labels for bind mounts
- Enable user lingering for persistent services
- Use podman auto-update for automatic updates
- Alias
docker to podman for compatibility
Related Skills