Podman — Container daemonless und rootless verwalten
Praxis-Guide zu Podman: daemonless und rootless Container und Pods verwalten — Lebenszyklus, Images, Volumes, Netzwerke und Docker-Kompatibilität.
Podman ist eine Container-Engine, die ohne Hintergrund-Daemon auskommt: Jeder Container läuft als regulärer Kindprozess deines Benutzers und nicht unter einem zentralen Dienst. Das macht den rootless-Betrieb zum Normalfall – du startest Container ohne Root-Rechte und reduzierst so die Angriffsfläche deutlich. Die Kommandozeile ist weitgehend Docker-kompatibel, sodass die meisten docker-Befehle unverändert funktionieren, wenn du docker durch podman ersetzt. Zusätzlich kennt Podman Pods, gruppiert also mehrere Container wie in Kubernetes, und kann passende YAML-Manifeste erzeugen. Dieser Guide führt dich vom Container-Lebenszyklus über Images, Volumes und Netzwerke bis zu Rootless-Sicherheit und systemd-Integration.
Container-Lebenszyklus
podman run <image> — Erstellt und startet einen neuen Container aus einem Image.
podman run nginxpodman run -d <image> — Startet einen Container im Hintergrund (detached).
podman run -d nginxpodman run -it <image> <command> — Startet einen Container interaktiv mit TTY.
podman run -it ubuntu bashpodman run --name <name> <image> — Startet einen Container mit eigenem Namen.
podman run --name my-web -d nginxpodman run --rm <image> — Entfernt den Container automatisch, sobald er beendet wird.
podman run --rm alpine echo "Hello"podman start <container> — Startet einen gestoppten Container.
podman start my-webpodman stop <container> — Stoppt einen laufenden Container kontrolliert.
podman stop my-webpodman stop -a — Stoppt alle laufenden Container auf einmal.
podman stop -apodman restart <container> — Stoppt einen Container und startet ihn anschließend neu.
podman restart my-webpodman rm <container> — Entfernt einen gestoppten Container.
podman rm my-webpodman rm -f <container> — Entfernt einen laufenden Container erzwungen.
podman rm -f my-webpodman rm -a — Entfernt alle gestoppten Container.
podman rm -aPorts, Umgebung & Ressourcen
podman run -p <host_port>:<container_port> <image> — Bildet einen Host-Port auf einen Container-Port ab.
podman run -d -p 8080:80 nginxpodman run -e <KEY>=<value> <image> — Setzt eine Umgebungsvariable im Container.
podman run -d -e MYSQL_ROOT_PASSWORD=secret mysql:8podman run --env-file <file> <image> — Lädt Umgebungsvariablen aus einer Datei.
podman run -d --env-file .env my-apppodman run -m <memory> <image> — Setzt ein Speicherlimit für den Container.
podman run -d -m 512m nginxpodman run --cpus=<number> <image> — Begrenzt die Anzahl der CPU-Kerne, die der Container nutzen darf.
podman run -d --cpus=1.5 my-apppodman run --restart=<policy> <image> — Setzt die Restart-Policy: no, on-failure, always, unless-stopped.
podman run -d --restart=always nginxVolumes & Mounts
podman run -v <host_path>:<container_path> <image> — Bindet ein Host-Verzeichnis als Bind-Mount in den Container ein.
podman run -d -v ./html:/usr/share/nginx/html nginxpodman run -v <host_path>:<container_path>:Z <image> — Bind-Mount mit privatem SELinux-Label (Zugriff für einen einzelnen Container).
podman run -d -v ./data:/data:Z my-apppodman run -v <host_path>:<container_path>:z <image> — Bind-Mount mit geteiltem SELinux-Label (mehrere Container dürfen zugreifen).
podman run -d -v ./shared:/shared:z my-apppodman run -v <volume_name>:<container_path> <image> — Bindet ein benanntes Podman-Volume in den Container ein.
podman run -d -v db-data:/var/lib/mysql mysql:8podman volume create <name> — Erstellt ein benanntes Volume für persistente Daten.
podman volume create db-datapodman volume ls — Listet alle Podman-Volumes auf.
podman volume lspodman volume inspect <name> — Zeigt detaillierte Informationen zu einem Volume.
podman volume inspect db-datapodman volume rm <name> — Entfernt ein Volume.
podman volume rm db-datapodman volume prune — Entfernt alle ungenutzten Volumes.
podman volume pruneAuflisten & Inspizieren
podman ps — Listet alle laufenden Container auf.
podman pspodman ps -a — Listet alle Container auf, auch gestoppte.
podman ps -apodman ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" — Listet Container mit eigenem Ausgabeformat.
podman ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"podman inspect <container> — Zeigt detaillierte JSON-Informationen zu einem Container.
podman inspect my-webpodman port <container> — Zeigt die Port-Zuordnungen eines Containers.
podman port my-webpodman stats — Zeigt die Ressourcennutzung aller laufenden Container in Echtzeit.
podman statspodman top <container> — Zeigt die im Container laufenden Prozesse.
podman top my-webpodman top <container> hpid user args — Zeigt Prozesse mit eigenen ps-Format-Deskriptoren (Podman-spezifisch).
podman top my-web hpid user argsLogs & Exec
podman logs <container> — Zeigt die Logs eines Containers.
podman logs my-webpodman logs -f <container> — Folgt der Log-Ausgabe in Echtzeit.
podman logs -f my-webpodman logs --tail <n> <container> — Zeigt nur die letzten N Zeilen der Logs.
podman logs --tail 50 my-webpodman logs --since <time> <container> — Zeigt Logs ab einem Zeitstempel oder einer relativen Zeit.
podman logs --since 30m my-webpodman exec -it <container> <command> — Führt einen Befehl interaktiv in einem laufenden Container aus.
podman exec -it my-web bashpodman exec <container> <command> — Führt einen Befehl in einem laufenden Container aus (nicht interaktiv).
podman exec my-web cat /etc/nginx/nginx.confpodman cp <container>:<path> <host_path> — Kopiert Dateien aus einem Container auf den Host.
podman cp my-web:/etc/nginx/nginx.conf ./nginx.confpodman cp <host_path> <container>:<path> — Kopiert Dateien vom Host in einen Container.
podman cp ./index.html my-web:/usr/share/nginx/html/Images
podman images — Listet alle lokal verfügbaren Images auf.
podman imagespodman pull <image> — Lädt ein Image aus einer Registry herunter.
podman pull docker.io/library/nginx:alpinepodman push <image> — Lädt ein Image in eine Registry hoch.
podman push quay.io/myuser/my-app:latestpodman tag <source_image> <target_image> — Vergibt einen neuen Tag für ein bestehendes Image.
podman tag my-app:latest quay.io/myuser/my-app:v1.0podman rmi <image> — Entfernt ein lokales Image.
podman rmi nginx:alpinepodman image prune — Entfernt alle ungetaggten (dangling) Images.
podman image prunepodman image prune -a — Entfernt alle Images, die von keinem Container genutzt werden.
podman image prune -apodman history <image> — Zeigt die Layer-Historie eines Images.
podman history nginx:alpinepodman save -o <file> <image> — Exportiert ein Image in ein tar-Archiv.
podman save -o my-app.tar my-app:latestpodman load -i <file> — Importiert ein Image aus einem tar-Archiv.
podman load -i my-app.tarpodman search <term> — Durchsucht Registries nach passenden Images.
podman search nginxImages bauen
podman build -t <name>:<tag> . — Baut ein Image aus einem Dockerfile/Containerfile im aktuellen Verzeichnis.
podman build -t my-app:latest .podman build -t <name> -f <file> . — Baut mit einem bestimmten Dockerfile oder Containerfile.
podman build -t my-app -f Containerfile.prod .podman build --no-cache -t <name> . — Baut, ohne den Layer-Cache zu verwenden.
podman build --no-cache -t my-app:latest .podman build --build-arg <KEY>=<value> -t <name> . — Übergibt eine Build-Variable an den Build.
podman build --build-arg NODE_ENV=production -t my-app .podman build --target <stage> -t <name> . — Baut nur bis zu einer bestimmten Stage in einem Multi-Stage-Build.
podman build --target builder -t my-app:build .podman build --platform <platform> -t <name> . — Baut für eine bestimmte Plattform-Architektur.
podman build --platform linux/arm64 -t my-app .podman build --layers=false -t <name> . — Baut ohne Zwischen-Layer (kleineres Image, keine Cache-Wiederverwendung).
podman build --layers=false -t my-app .Pods
podman pod create --name <name> — Erstellt einen neuen Pod. Pods gruppieren Container, die sich Netzwerk- und IPC-Namespaces teilen.
podman pod create --name my-podpodman pod create --name <name> -p <host_port>:<container_port> — Erstellt einen Pod mit veröffentlichten Ports. Ports werden auf Pod-Ebene gesetzt, nicht pro Container.
podman pod create --name web-pod -p 8080:80 -p 3306:3306podman run --pod <pod> <image> — Startet einen Container in einem bestehenden Pod.
podman run -d --pod my-pod --name web nginxpodman pod ls — Listet alle Pods mit Status und Container-Anzahl auf.
podman pod lspodman pod inspect <pod> — Zeigt detaillierte JSON-Informationen zu einem Pod.
podman pod inspect my-podpodman pod start <pod> — Startet alle Container in einem Pod.
podman pod start my-podpodman pod stop <pod> — Stoppt alle Container in einem Pod.
podman pod stop my-podpodman pod restart <pod> — Startet alle Container in einem Pod neu.
podman pod restart my-podpodman pod rm <pod> — Entfernt einen gestoppten Pod und alle seine Container.
podman pod rm my-podpodman pod rm -f <pod> — Entfernt einen Pod erzwungen, inklusive laufender Container.
podman pod rm -f my-podpodman pod top <pod> — Zeigt die laufenden Prozesse aller Container in einem Pod.
podman pod top my-podpodman pod logs <pod> — Zeigt die kombinierten Logs aller Container in einem Pod.
podman pod logs my-podNetzwerke
podman network ls — Listet alle Podman-Netzwerke auf.
podman network lspodman network create <name> — Erstellt ein neues Netzwerk.
podman network create my-networkpodman network inspect <name> — Zeigt detaillierte Informationen zu einem Netzwerk.
podman network inspect my-networkpodman network connect <network> <container> — Verbindet einen laufenden Container mit einem Netzwerk.
podman network connect my-network my-webpodman network disconnect <network> <container> — Trennt einen Container von einem Netzwerk.
podman network disconnect my-network my-webpodman run --network <name> <image> — Startet einen Container in einem bestimmten Netzwerk.
podman run -d --network my-network --name api my-apipodman network rm <name> — Entfernt ein Netzwerk.
podman network rm my-networkpodman network prune — Entfernt alle ungenutzten Netzwerke.
podman network pruneRootless & Sicherheit
podman unshare <command> — Führt einen Befehl im User-Namespace des rootless Podman aus. Nützlich, um Volume-Berechtigungen zu korrigieren.
podman unshare chown 1000:1000 /home/user/datapodman run --userns=keep-id <image> — Bildet die aktuelle UID/GID in den Container ab. Erstellte Dateien erhalten die korrekte Host-Eigentümerschaft.
podman run --userns=keep-id -v ./data:/data my-apppodman run --user <uid>:<gid> <image> — Lässt den Container-Prozess als bestimmten Benutzer und Gruppe laufen.
podman run --user 1000:1000 my-apppodman run --security-opt label=disable <image> — Deaktiviert die SELinux-Label-Einschränkung für den Container. Schwächt die Isolation – nur gezielt einsetzen, etwa um ein konkretes Volume-Mount-Problem zu umgehen.
podman run --security-opt label=disable -v ./data:/data my-apppodman run --cap-add <capability> <image> — Fügt dem Container eine Linux-Capability hinzu.
podman run --cap-add NET_ADMIN my-apppodman run --cap-drop ALL <image> — Entzieht alle Linux-Capabilities für maximale Sicherheit.
podman run --cap-drop ALL --cap-add NET_BIND_SERVICE my-apppodman run --read-only <image> — Bindet das Root-Dateisystem des Containers schreibgeschützt ein.
podman run --read-only --tmpfs /tmp my-appsystemd-Integration
Für neue Setups empfiehlt Podman seit Version 4.4 Quadlet (deklarative .container-Dateien) statt generate systemd; die folgenden generate systemd-Befehle funktionieren weiterhin und sind für bestehende Units nützlich.
podman generate systemd --new --name <container> — Erzeugt eine systemd-Unit, die beim Start einen frischen Container erstellt.
podman generate systemd --new --name my-webpodman generate systemd --new --name <container> --files — Erzeugt die systemd-Unit und schreibt sie auf die Festplatte.
podman generate systemd --new --name my-web --filespodman generate systemd --new --name <pod> --files — Erzeugt systemd-Units für einen ganzen Pod und seine Container.
podman generate systemd --new --name my-pod --filespodman auto-update — Aktualisiert Container mit dem Label io.containers.autoupdate automatisch.
podman auto-updatepodman auto-update --dry-run — Prüft, welche Container aktualisiert würden, ohne Änderungen anzuwenden.
podman auto-update --dry-runpodman generate kube <pod> — Erzeugt eine Kubernetes-YAML-Definition aus einem Pod oder Container.
podman generate kube my-pod > my-pod.yamlpodman play kube <file> — Erstellt Pods und Container aus einer Kubernetes-YAML-Datei.
podman play kube my-pod.yamlpodman play kube --down <file> — Baut Pods und Container ab, die aus einer Kubernetes-YAML-Datei erstellt wurden.
podman play kube --down my-pod.yamlPodman Compose
podman compose up -d — Startet alle in docker-compose.yml definierten Services im Hintergrund.
podman compose up -dpodman compose down — Stoppt und entfernt alle Container und Netzwerke des Compose-Projekts.
podman compose downpodman compose ps — Listet die vom Compose-Projekt verwalteten Container auf.
podman compose pspodman compose logs -f — Folgt den Logs aller Services in Echtzeit.
podman compose logs -fpodman compose exec <service> <command> — Führt einen Befehl in einem laufenden Compose-Service-Container aus.
podman compose exec web bashpodman compose build — Baut oder erneuert alle Service-Images.
podman compose buildAufräumen & System
podman system df — Zeigt den Speicherverbrauch: Images, Container, Volumes.
podman system dfpodman system prune — Entfernt alle gestoppten Container, ungenutzten Images und Netzwerke.
podman system prunepodman system prune -a --volumes — Vollständige Bereinigung inklusive aller ungenutzten Images und Volumes.
podman system prune -a --volumespodman system reset — Setzt den Podman-Speicher auf den Ausgangszustand zurück. Entfernt alle Container, Images und Volumes.
podman system resetpodman system migrate — Migriert Container nach einem Podman-Upgrade auf das neueste Format.
podman system migratepodman info — Zeigt systemweite Podman-Informationen (Version, Storage, Registries usw.).
podman infopodman version — Zeigt Details zur Podman-Version.
podman versionpodman login <registry> — Meldet sich an einer Container-Registry an.
podman login quay.iopodman logout <registry> — Meldet sich von einer Container-Registry ab.
podman logout quay.ioDocker-Kompatibilität
alias docker=podman — Erstellt einen Shell-Alias, sodass docker-Befehle automatisch Podman nutzen.
alias docker=podmanpodman system service --time=0 — Startet den Podman-API-Service. Ermöglicht Kompatibilität mit Docker-API-Clients.
podman system service --time=0 unix:///tmp/podman.sockexport DOCKER_HOST=unix://<socket_path> — Verweist Docker-CLI oder docker-compose auf den Podman-Socket.
export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/podman/podman.sock Fazit
Podman ist mehr als ein Drop-in-Ersatz für Docker: Das daemonless-Modell und der rootless-Betrieb passen besser zu modernen Sicherheitsanforderungen, und die native Pod- und Kubernetes-Unterstützung schlägt eine Brücke zur Orchestrierung. Wenn du von Docker kommst, setzt du am schnellsten alias docker=podman und arbeitest wie gewohnt weiter; auf Servern lohnt sich die systemd-Integration via Quadlet oder generate systemd, um Container sauber als Dienste zu betreiben.
Weiterführende Links
- Podman – offizielle Dokumentation – Referenz und Handbuch (englisch)
- Podman – Projektseite – Downloads, Installation und News (englisch)
- Podman – Wikipedia – Hintergrund und Architektur
Verwandte Kommandos
- ddev – container-basierte lokale Entwicklungsumgebungen
- docker – die klassische Container-Engine mit Daemon
- docker-compose – Multi-Container-Anwendungen deklarativ definieren