Podman vs Docker¶
Kategorie: Container & Virtualisierung
Stand: Mai 2026
Übersicht¶
Podman und Docker sind beides Container-Runtimes, die OCI-kompatible Container bauen und ausführen können. Trotz kompatibler CLI unterscheiden sie sich grundlegend in Architektur, Sicherheitsmodell und Einsatzschwerpunkten.
Architektur¶
Docker¶
Docker basiert auf einem zentralen Daemon (dockerd), der als Root-Prozess im Hintergrund läuft. Alle Docker-Befehle (CLI, Compose, etc.) kommunizieren über eine Unix-Socket-Verbindung mit diesem Daemon.
Podman¶
Podman ist daemonlos. Jeder Befehl startet den Container direkt als Kindprozess des aufrufenden Nutzers – ohne zentralen Dienst.
Vergleichsübersicht¶
| Merkmal | Docker | Podman |
|---|---|---|
| Architektur | Daemon-basiert | Daemonlos |
| Standard-Rechte | Root (via docker-Gruppe) | Rootless out-of-the-box |
| Pods (wie K8s) | ❌ | ✅ |
| CLI-Kompatibilität | De-facto Standard | Docker-kompatibel |
| Compose-Support | Docker Compose (nativ) | Podman Compose / podman play kube |
| Systemd-Integration | Umständlich | Nativ (podman generate systemd) |
| Desktop GUI | Docker Desktop | Podman Desktop |
| Plattform | Linux, macOS, Windows | Linux (nativ), macOS/Windows (VM) |
| Lizenz | Docker Desktop kostenpflichtig (Enterprise) | Open Source (Apache 2.0) |
Sicherheit¶
Docker – Risiken¶
- Der Docker-Daemon läuft als root
- Nutzer in der
docker-Gruppe haben de facto Root-Zugriff auf das System - Ein kompromittierter Container kann leichter aus der Isolation ausbrechen
- Angriffsfläche durch den permanent laufenden Daemon
Podman – Vorteile¶
- Rootless Container standardmäßig: Container laufen mit den Rechten des aufrufenden Nutzers
- Kein persistenter Daemon = keine permanente Root-Angriffsfläche
- Bessere Isolation zwischen Nutzern auf einem System
- SELinux-Integration auf RHEL/Fedora-Systemen
Pods¶
Podman unterstützt nativ das Konzept von Pods (wie in Kubernetes): mehrere Container teilen sich einen Netzwerk-Namespace.
# Pod erstellen
podman pod create --name mein-pod -p 8080:80
# Container zum Pod hinzufügen
podman run -d --pod mein-pod nginx
podman run -d --pod mein-pod my-sidecar
Docker kennt dieses Konzept nicht – dort wird es über Docker Compose/Networks abgebildet.
Systemd-Integration¶
Podman kann systemd-Unit-Files direkt generieren:
# Systemd-Service für einen Container generieren
podman generate systemd --name mein-container > ~/.config/systemd/user/mein-container.service
# Service aktivieren (ohne root)
systemctl --user enable --now mein-container
Kubernetes-Workflow¶
Podman bietet direkte Kubernetes-Kompatibilität:
# Kubernetes YAML aus laufenden Pods generieren
podman generate kube mein-pod > pod.yaml
# Kubernetes YAML direkt mit Podman ausführen
podman play kube pod.yaml
Migration von Docker zu Podman¶
Die CLIs sind weitgehend kompatibel. In vielen Fällen reicht ein Alias:
Bekannte Unterschiede¶
- Docker Compose →
podman-composeoderpodman play kube(nicht 100% kompatibel) - Build-Context kann bei komplexen Dockerfiles leicht abweichen
- Netzwerk-Standard ist bei rootless Podman
slirp4netnsstatt Bridge
Entscheidungshilfe¶
Docker wählen, wenn…¶
- eine bestehende CI/CD-Pipeline auf Docker aufbaut
- Docker Desktop auf macOS/Windows benötigt wird
- das Team ausschließlich Docker-Erfahrung hat
- spezifische Docker-Plugins oder BuildKit-Features gebraucht werden
- schnelle Onboarding-Zeit wichtiger ist als Sicherheitsoptimierung
Podman wählen, wenn…¶
- Sicherheit oberste Priorität hat (rootless, kein Daemon)
- auf Linux-Servern gearbeitet wird (RHEL, Fedora, CentOS Stream)
- systemd-Services aus Containern generiert werden sollen
- Richtung Kubernetes migriert wird
- eine regulierte Umgebung (Compliance, Enterprise) vorliegt
- kein persistenter Hintergrunddienst erwünscht ist
Nützliche Befehle¶
# Images
podman pull nginx
podman images
podman rmi nginx
# Container
podman run -d -p 8080:80 --name web nginx
podman ps
podman ps -a
podman stop web
podman rm web
# Logs & Inspect
podman logs web
podman inspect web
# Build
podman build -t mein-image:1.0 .
# Systemd
podman generate systemd --name web --files --new