Podman
Podman rootless containers, pod management, and systemd integration.
Rootless Container Basics
Run containers without root
podman run -d --name webserver -p 8080:80 nginx:1.25-alpine
podman run --rm -it alpine:3.19 sh
podman run -v "$(pwd)":/app:Z -w /app node:20 npm test # :Z for SELinux relabel
| Podman is daemonless. Each container runs as a direct child process. No daemon means no single point of failure. |
Container lifecycle
podman ps -a # list all containers
podman stop webserver
podman rm webserver
podman rm -af # remove all containers (force)
Image Management
Pull, build, list images
podman pull docker.io/library/nginx:1.25-alpine # explicit registry
podman build -t myapp:v1.0 .
podman images
podman rmi myapp:v1.0
Inspect image layers
podman inspect nginx:1.25-alpine --format '{{.Config.Cmd}}'
podman image tree nginx:1.25-alpine # show layer hierarchy
podman history nginx:1.25-alpine # layer-by-layer build history
Exec and Logs
Debug running containers
podman exec -it webserver sh
podman logs -f --tail 100 webserver
podman logs --since 5m webserver
Pods
Multi-container pods (like Kubernetes)
podman pod create --name mypod -p 8080:80
podman run -d --pod mypod --name web nginx:1.25-alpine
podman run -d --pod mypod --name sidecar busybox sleep 3600
podman pod ps # list pods
podman pod stop mypod
podman pod rm mypod
| Podman pods share network namespace, just like Kubernetes pods. Containers in the same pod communicate over localhost. |
Systemd Integration
Generate systemd unit files from running containers
podman generate systemd --new --name webserver > ~/.config/systemd/user/webserver.service
systemctl --user daemon-reload
systemctl --user enable --now webserver.service
systemctl --user status webserver.service
Quadlet files (Podman 4.4+, preferred over generate systemd)
# Place .container files in ~/.config/containers/systemd/
# Podman auto-generates systemd units from these
systemctl --user daemon-reload
systemctl --user start webserver # name from .container filename
Volumes and Networking
Named volumes
podman volume create appdata
podman run -d -v appdata:/data myapp
podman volume ls
podman volume inspect appdata
Networking
podman network create app-net
podman network ls
podman run -d --network app-net --name svc myapp
podman network inspect app-net
Cleanup
Prune unused resources
podman system prune -af # remove all unused containers + images
podman system df # show disk usage
podman volume prune # remove unused volumes
Docker Compatibility
Podman as Docker drop-in
alias docker=podman # most Docker commands work as-is
podman-compose up -d # compose support via podman-compose
podman system service --time=0 & # start API socket for Docker-compatible tools