Podman Compose vs. Docker Compose
Docker Compose ist der De-facto-Standard für Multi-Container-Setups – Podman rückt mit „daemonless“ und „rootless“ an und verspricht dieselbe Datei, denselben Befehl, weniger Privilegien. Wie groß der Unterschied in der Praxis wirklich ist, welche Werkzeuge sich hinter „Podman Compose“ verstecken und ab wann sich der Wechsel lohnt, klärt dieser Vergleich.
Warum überhaupt vergleichen?
Docker hat die Container-Welt geprägt – und Podman hat sich in wenigen Jahren von einer Red-Hat-Nische zum ernsthaften Kandidaten entwickelt. Wer heute ein neues Self-Hosted-Setup aufsetzt, steht vor der Frage: Docker Compose, wie es in den meisten Tutorials steht – oder Podman mit seinen Versprechen „daemonless“, „rootless“ und „voll kompatibel“? Die Antwort hängt weniger von der Datei ab als von der Umgebung, in der du läufst.
Konzept: Daemon vs. daemonless
- Docker arbeitet klassisch mit einem zentralen Daemon (
dockerd), der als Root läuft; alle Clients sprechen mit ihm über den Docker-Socket. - Podman kommt ohne Daemon aus: Jede Operation startet einen eigenen Prozess („fork-exec“), Container laufen standardmäßig rootless in User-Namespaces.
- Sicherheitsmodell: Rootless heißt nicht automatisch sicherer, reduziert aber die Angriffsfläche – ein kompromittierter Container hat nur die Rechte deines Users.
- Systemd-Integration: Podman ist für systemd-Linuxe gedacht (Quadlet); Docker setzt eher auf eigene Restart-Policies und Compose.
- Lizenz-Ebene: Docker Engine ist Open Source (Apache-2.0); Docker Desktop ist für größere Unternehmen kostenpflichtig. Podman ist durchgehend Open Source.
Verwirrung um „Podman Compose“
„Podman Compose“ ist leider kein einzelnes Werkzeug – dahinter stecken zwei verschiedene Ansätze, die man leicht verwechselt:
| Werkzeug | Was es ist | Kompatibilität |
|---|---|---|
docker compose (Plugin) | Das offizielle Compose v2 (Go) – läuft direkt gegen den originalen Docker-Daemon. | Referenz – vollständige und echte Compose-Spec. |
podman compose | Ein von Podman mitgelieferter Wrapper-Befehl, der im Hintergrund das originale Docker-Compose-Plugin aufruft und auf den Podman-Socket umleitet. | Sehr hoch – verhält sich in 99 % der Fälle identisch zur Docker-Variante. |
podman-compose | Eine eigenständige Python-Implementierung der Podman-Community – arbeitet ohne Socket und übersetzt Compose-Dateien direkt in Podman-CLI-Befehle. | Teilmenge – unterstützt manche modernen Spec-Features (wie komplexe Secrets oder Profiles) nicht zuverlässig. |
| Quadlet | Podman-nativ: Compose-Dateien oder Container als systemd-Units (.container). | Kein Compose – dafür echte Systemd-Integration. |
podman compose up
nutzen – so bleiben deine Tutorials und Dateien nahezu unverändert lauffähig.
Die Kernunterschiede in der Tabelle
| Kriterium | Docker Compose | Podman (+ Compose) |
|---|---|---|
| Architektur | Zentraler Daemon (dockerd) | Daemonless, Fork-Exec-Modell |
| Rootless | Möglich, aber nicht Standard | Standard seit Version 1 |
| Systemd-Integration | Umweg über Compose-Wrapper | Quadlet direkt (User-Units!) |
| Netzwerk | Bridge/iptables, ausgereift | Netavark + pasta/slirp4netns (rootless) |
| SELinux-Hosts (Fedora/RHEL) | Labels ggf. via :z | :Z/:z nötig, sonst Block |
| Ports < 1024 (rootless) | Nur mit Root-Daemon/rootless-Docker | Nur via rootful Podman oder Proxy |
| Compose-Spec | Vollständig (deploy, secrets, profiles …) | Über docker-compose v2 fast vollständig; podman-compose nur teilweise |
| Ökosystem-Tools | Portainer, Watchtower, Uptime Kuma nativ | Häufig über Podman-Agent/Socket kompatibel, teils mit Einschränkungen |
Funktioniert dieselbe Compose-Datei?
In den allermeisten Fällen: ja. Eine compose.yaml ohne Docker-spezifische
Extras läuft mit docker compose up -d und podman compose up -d identisch –
vorausgesetzt, der docker-compose-Binary ist installiert und der Podman-Socket aktiv:
services:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html:ro
# Docker:
docker compose up -d
# Podman (gleiche Datei):
podman compose up -d
:z bzw. :Z ergänzen. ② Rootless keine Ports unter 1024 –
also nicht 80:80, sondern 8080:80 + Proxy. ③ Das veraltete
version:-Schlüsselwort aus alten Dateien entfernen – beide Werkzeuge ignorieren es heute.
Migration von Docker zu Podman
- Aliase:
alias docker=podmandeckt den Alltag ab – die meisten CLI-Befehle sind kompatibel. - Socket aktivieren:
systemctl --user enable --now podman.socket– danach funktioniertdocker compose(und Tools wie Portainer-Agent) gegen Podman. - Bestand übernehmen: Volumes und Images weiterverwenden – die Ordner liegen nur woanders (
~/.local/share/containers); einpodman pulllädt dieselben OCI-Images. - Mac/Windows:
podman machinestartet eine VM – Docker Desktop-Nutzer finden sich schnell zurecht. - Nicht alles ist 1:1: Container-Attach, Logs und Stats funktionieren, aber Host-Integrationen (z. B. Docker-Socket-Mounts in Compose) musst du einzeln prüfen.
Quadlet: die Podman-native Alternative
Wer unter systemd lebt, braucht womöglich gar kein Compose: Quadlet wandelt
Container-Definitionen in echte Systemd-Units um – mit Autostart, Abhängigkeiten und Journal-Logs.
Einzelne Container schreibst du als myapp.container:
[Unit]
Description=Meine kleine Website
[Container]
Image=docker.io/library/nginx:alpine
PublishPort=8080:80
Volume=%h/html:/usr/share/nginx/html:ro
[Service]
Restart=always
[Install]
WantedBy=default.target
systemctl --user daemon-reload
systemctl --user enable --now myapp
Fallstricke aus der Praxis
- Netzwerk-DNS: Rootless-Netzwerke nutzen teils andere DNS-Wege – Service-Namen aus Compose funktionieren, aber manche Host-Netzwerkkonfigurationen nicht wie unter Docker.
deploy.resources.limits: docker compose v2 setzt diese um; podman-compose (Python) ignoriert sie oft – Limits dann lieber als--memory/Quadlet setzen.- Watchtower & Co.: Tools, die den Docker-Socket brauchen, laufen gegen den Podman-Socket meist, aber nicht immer – bei Problemen den Podman-Agent-Ansatz prüfen.
- SELinux: Ohne
:z/:Zerscheinen Mounts leer oder die Container starten nicht – der Klassiker auf Fedora-Servern. - Builds:
build:-Blöcke funktionieren in beiden, aber Podman nutzt seinen eigenen Builder (Buildah) – manche Dockerfile-Spezialitäten unterscheiden sich minimal.
Häufige Fragen (FAQ)
| Frage | Antwort |
|---|---|
| Kann ich meine Compose-Dateien behalten? | Ja – im Normalfall unverändert. SELinux-Labels und Rootless-Ports sind die einzigen Klassiker. |
| Ist Podman wirklich sicherer? | Rootless reduziert die Angriffsfläche deutlich; „sicherer“ hängt aber immer vom Setup ab (Seccomp, Capabilities, Updates). |
| Was ist mit Portainer/Watchtower? | Funktioniert teils über den Podman-Socket bzw. Podman-Agent – nicht jede Funktion ist identisch, vor dem Umzug testen. |
| Lohnt sich der Wechsel fürs Homelab? | Wenn du auf Debian/Ubuntu mit Docker zufrieden bist: nein, kein Zwang. Auf Fedora/RHEL oder bei Rootless-/Systemd-Fokus: Podman ist die natürlichere Wahl. |
| Docker Desktop vs. Podman? | Für Firmen mit Lizenzpflicht ist Podman (auch mit podman machine) eine kostenfreie Alternative – für Privatnutzer bleibt Docker Desktop ebenfalls kostenlos. |
| podman-compose oder docker-compose gegen Podman? | Für maximale Kompatibilität: docker-compose v2 + podman compose. podman-compose nur, wenn du bewusst auf seine Einfachheit setzt. |
Fazit
Datei-technisch sind sich beide Seiten heute so ähnlich, dass die Entscheidung fast nie an der
compose.yaml hängt, sondern am Betriebssystem und am Sicherheitsmodell: Auf Fedora,
RHEL & Co. oder mit Rootless-/Systemd-Fokus ist Podman die runde Lösung – auf klassischen
Debian-Servern mit etablierten Tools bleibt Docker Compose die pragmatische Wahl. Wer beides kann,
ist für jedes Projekt gerüstet.