| name | podman |
| description | Run, build, and manage OCI containers rootlessly on Bluefin — including Quadlets for persistent systemd-managed services. |
| domain | cloud-native |
Podman
Podman is the default container engine on Bluefin. It is daemonless and rootless by default — containers run as your user with no background service and no root required.
When to Use
- Running containers without a daemon (rootless by default)
- Building container images with a Containerfile or Dockerfile
- Running persistent services as systemd units (Quadlets)
- Replacing Docker workflows on Bluefin DX
When NOT to Use
- GUI applications — use Flatpak instead
- Mutable development environments needing apt/dnf — use Distrobox instead
- One-off package installation — use Homebrew or Distrobox
Key Concepts
Podman is rootless by default on Bluefin. No daemon, no root — containers run as your own user inside a user namespace. This improves security and means you do not need sudo for the vast majority of container operations.
- Container images are stored per-user in
~/.local/share/containers/
- Networking uses
slirp4netns or pasta (no host network access by default)
- Volumes and bind mounts live in user space
- Rootful mode (
sudo podman) is available for edge cases (see below)
Core Commands
podman pull docker.io/library/nginx:latest
podman run -d --name mynginx -p 8080:80 docker.io/library/nginx:latest
podman ps
podman ps -a
podman stop mynginx && podman rm mynginx
podman images
podman build -t myapp:latest .
podman exec -it mynginx bash
podman logs mynginx
podman logs -f mynginx
podman volume create mydata
podman volume ls
podman volume inspect mydata
podman volume rm mydata
podman system prune
podman system prune --all --volumes
Podman Desktop
Podman Desktop provides a GUI for managing containers, images, volumes, and Kubernetes workloads.
flatpak install flathub io.podman_desktop.PodmanDesktop
Features:
- Container lifecycle management (start, stop, restart, delete)
- Image building and registry push/pull
- Volume and network management
- Kubernetes YAML generation from running containers
- Extension ecosystem (OpenShift, Kind, Compose, etc.)
Launch from your application menu or run flatpak run io.podman_desktop.PodmanDesktop.
Quadlets — Persistent Services as systemd Units
Quadlets are the recommended way to run persistent containers on Bluefin. They define containers as systemd unit files, giving you automatic startup on login, restart policies, and systemctl management — without Docker Compose or a daemon.
Quadlet files live in ~/.config/containers/systemd/ for user (rootless) services, or /etc/containers/systemd/ for system-wide (rootful) services.
systemd reads these files when you run systemctl --user daemon-reload and generates transient .service units automatically.
Container Unit (most common)
~/.config/containers/systemd/myservice.container
[Unit]
Description=My nginx service
After=network-online.target
[Container]
Image=docker.io/library/nginx:latest
PublishPort=8080:80
Volume=%h/mydata:/usr/share/nginx/html:z
Environment=NGINX_PORT=8080
[Service]
Restart=always
[Install]
WantedBy=default.target
%h expands to your home directory. The :z label on volumes sets the correct SELinux context for shared access.
Activate and manage:
systemctl --user daemon-reload
systemctl --user start myservice
systemctl --user enable myservice
systemctl --user status myservice
systemctl --user stop myservice
systemctl --user disable myservice
Volume Unit
Declare a named volume as a Quadlet so it is created before the container starts.
~/.config/containers/systemd/mydata.volume
[Volume]
Label=app=myservice
Reference it from a .container file:
[Container]
Volume=mydata.volume:/data:z
Network Unit
Define a custom network for container isolation.
~/.config/containers/systemd/mynet.network
[Network]
Subnet=10.89.1.0/24
Label=app=myservice
Reference it from a .container file:
[Container]
Network=mynet.network
Auto-Update with Quadlets
Add AutoUpdate=registry to the [Container] section to enable automatic image updates:
[Container]
Image=docker.io/library/nginx:latest
AutoUpdate=registry
Then either run updates manually or enable the built-in timer:
podman auto-update
systemctl --user enable --now podman-auto-update.timer
systemctl --user status podman-auto-update.timer
Podman will pull new image digests and restart affected Quadlet services automatically.
Rootful Containers (Rare)
The vast majority of use cases work rootless. Use rootful (sudo podman) only when:
- Binding to ports < 1024 on the host (preferred alternative: use a high port + reverse proxy)
- Manipulating host network namespaces directly
- Certain advanced storage or device operations
sudo podman run -d --name privileged-svc -p 443:443 myimage:latest
Rootful Quadlets go in /etc/containers/systemd/ and are managed with systemctl (no --user flag).
Docker Compatibility
Podman is a drop-in replacement for Docker in almost all cases. Most docker CLI commands work identically with podman.
echo 'alias docker=podman' >> ~/.bashrc
source ~/.bashrc
Docker Compose
Use podman compose (built-in Compose V2 support) or podman-compose:
podman compose up -d
podman compose down
podman compose logs -f
brew install podman-compose
podman-compose up -d
Most docker-compose.yml files work unmodified with podman compose. Notable differences:
| docker-compose | podman compose |
|---|
version: field required | version: field optional |
Docker socket (/var/run/docker.sock) | Podman socket (/run/user/$UID/podman/podman.sock) |
| Root by default | Rootless by default |
Troubleshooting
Container can't reach the internet (rootless networking)
Rootless containers use userspace networking. Check that slirp4netns or pasta is working:
podman network ls
podman info | grep -i network
podman run --network=host myimage:latest
Port conflict — rootless can't bind to ports < 1024
podman run -p 8080:80 nginx:latest
To allow rootless binding to low ports (system-wide, use with care):
sudo sysctl -w net.ipv4.ip_unprivileged_port_start=80
Image pull fails / rate limited
podman login docker.io
podman pull nginx:latest
SELinux volume mount errors
podman run -v /host/path:/container/path:z myimage
Quadlet service not starting
systemctl --user daemon-reload
systemctl --user cat myservice
journalctl --user -u myservice -n 50
Reset everything
podman system prune --all
podman system reset
Decision Guide
| Need | Tool |
|---|
| Run a container image | Podman |
| Persistent service (auto-start on login) | Podman + Quadlet |
| GUI container management | Podman Desktop (Flatpak) |
| Mutable Linux environment (dnf/apt) | Distrobox |
| GUI application | Flatpak |
| Self-hosted homelab services | Podman Quadlets (see homelab skill) |
| Docker Compose workloads | podman compose |
References