Zurück zum Blog
Container22. Januar 2025Michael Hettwer10 min read

Podman als Docker-Alternative: Eine produktionsreife Anleitung

Podmans rootless, daemonless Architektur macht es zu einer überzeugenden Alternative zu Docker für sicherheitsbewusste Teams. Hier erfahren Sie, wie Sie nahtlos migrieren.

Docker hat verändert, wie wir Software bereitstellen. Podman möchte verändern, wie wir Container ausführen — ohne einen privilegierten Daemon, der zwischen Ihrer Anwendung und dem Kernel sitzt. Wenn Sie Container in Produktion auf Linux ausführen, lohnt es sich, Podman zu verstehen.

Warum Podman?

  • Kein Daemon: jeder Container ist ein direkter Kindprozess des Benutzers, der ihn gestartet hat
  • Standardmäßig rootless: Container laufen ohne Root-Privilegien auf dem Host
  • OCI-konform: führt die gleichen Images wie Docker aus (von Docker Hub, GHCR oder jeder OCI-Registry)
  • Drop-in-Docker-CLI-Kompatibilität: alias docker=podman und die meisten Skripte funktionieren einfach
  • Native systemd-Integration: generieren Sie Unit-Dateien direkt aus Container-Definitionen
  • Pod-Unterstützung: gruppieren Sie Container wie Kubernetes-Pods, ohne Kubernetes-Overhead

Installation

bash
# Debian / Ubuntu
apt update && apt install -y podman

# RHEL / AlmaLinux / Rocky (bereits in den meisten RHEL-8+-Images enthalten)
dnf install -y podman

# Prüfen
podman version
podman info

Erster Rootless-Container

bash
# nginx ziehen und starten (rootless — kein sudo nötig)
podman run -d --name web -p 8080:80 docker.io/library/nginx:alpine

# Laufende Container anzeigen
podman ps

# Logs prüfen
podman logs web

# Stoppen und entfernen
podman stop web && podman rm web
Hinweis:

Rootless-Container können nicht an Ports unter 1024 binden ohne Kernel-Capability-Anpassungen. Verwenden Sie Ports >= 1024 in der Entwicklung und einen nginx/HAProxy Reverse-Proxy in Produktion.

Migration von Docker Compose

Podman unterstützt Docker Compose-Dateien über podman-compose (Community-Projekt) oder das eingebaute Quadlet-System. Für Produktion ist Quadlet — das systemd Unit-Dateien aus Container-Definitionen generiert — der zuverlässigere Weg.

bash
# podman-compose installieren (für Parität in der Entwicklung)
pip3 install podman-compose

# Vorhandene docker-compose.yml ausführen
podman-compose up -d

# Für Produktion: systemd-Units per Quadlet erzeugen
# Eine .container-Datei in ~/.config/containers/systemd/ ablegen
mkdir -p ~/.config/containers/systemd
ini
# ~/.config/containers/systemd/web.container
[Unit]
Description=Nginx web server
After=network-online.target

[Container]
Image=docker.io/library/nginx:alpine
PublishPort=8080:80
Volume=/srv/www:/usr/share/nginx/html:ro,Z

[Service]
Restart=always

[Install]
WantedBy=default.target
bash
# systemd neu laden und Container-Unit starten
systemctl --user daemon-reload
systemctl --user enable --now web.service
systemctl --user status web.service

Sicherheitsaspekte

  • Verwenden Sie :Z oder :z Volume-Mount-Labels, damit SELinux Container-Zugang zu Host-Pfaden erlaubt
  • Führen Sie mit --security-opt no-new-privileges aus, um Privilegien-Eskalation innerhalb von Containern zu verhindern
  • Setzen Sie --read-only auf dem Container-Dateisystem, wo möglich
  • Geben Sie --user innerhalb des Containers an, um zu vermeiden, als UID 0 zu laufen, sogar innerhalb des Container-Namespaces
  • Auditen Sie Images regelmäßig mit podman image scan oder trivy

Podman ist produktionsbereit und weit verbreitet, einschließlich in Red Hat OpenShift unter der Haube. Die Migration von Docker ist typischerweise ein halber Tag Aufwand für die meisten Stacks. Die Sicherheits- und operativen Vorteile — kein privilegierter Daemon, native systemd-Integration, rootless-Operation — machen es die Investition wert.