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 nginx

podman run -d <image> — Startet einen Container im Hintergrund (detached).

podman run -d nginx

podman run -it <image> <command> — Startet einen Container interaktiv mit TTY.

podman run -it ubuntu bash

podman run --name <name> <image> — Startet einen Container mit eigenem Namen.

podman run --name my-web -d nginx

podman 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-web

podman stop <container> — Stoppt einen laufenden Container kontrolliert.

podman stop my-web

podman stop -a — Stoppt alle laufenden Container auf einmal.

podman stop -a

podman restart <container> — Stoppt einen Container und startet ihn anschließend neu.

podman restart my-web

podman rm <container> — Entfernt einen gestoppten Container.

podman rm my-web

podman rm -f <container> — Entfernt einen laufenden Container erzwungen.

podman rm -f my-web

podman rm -a — Entfernt alle gestoppten Container.

podman rm -a

Ports, 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 nginx

podman run -e <KEY>=<value> <image> — Setzt eine Umgebungsvariable im Container.

podman run -d -e MYSQL_ROOT_PASSWORD=secret mysql:8

podman run --env-file <file> <image> — Lädt Umgebungsvariablen aus einer Datei.

podman run -d --env-file .env my-app

podman run -m <memory> <image> — Setzt ein Speicherlimit für den Container.

podman run -d -m 512m nginx

podman run --cpus=<number> <image> — Begrenzt die Anzahl der CPU-Kerne, die der Container nutzen darf.

podman run -d --cpus=1.5 my-app

podman run --restart=<policy> <image> — Setzt die Restart-Policy: no, on-failure, always, unless-stopped.

podman run -d --restart=always nginx

Volumes & 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 nginx

podman 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-app

podman 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-app

podman 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:8

podman volume create <name> — Erstellt ein benanntes Volume für persistente Daten.

podman volume create db-data

podman volume ls — Listet alle Podman-Volumes auf.

podman volume ls

podman volume inspect <name> — Zeigt detaillierte Informationen zu einem Volume.

podman volume inspect db-data

podman volume rm <name> — Entfernt ein Volume.

podman volume rm db-data

podman volume prune — Entfernt alle ungenutzten Volumes.

podman volume prune

Auflisten & Inspizieren

podman ps — Listet alle laufenden Container auf.

podman ps

podman ps -a — Listet alle Container auf, auch gestoppte.

podman ps -a

podman 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-web

podman port <container> — Zeigt die Port-Zuordnungen eines Containers.

podman port my-web

podman stats — Zeigt die Ressourcennutzung aller laufenden Container in Echtzeit.

podman stats

podman top <container> — Zeigt die im Container laufenden Prozesse.

podman top my-web

podman top <container> hpid user args — Zeigt Prozesse mit eigenen ps-Format-Deskriptoren (Podman-spezifisch).

podman top my-web hpid user args

Logs & Exec

podman logs <container> — Zeigt die Logs eines Containers.

podman logs my-web

podman logs -f <container> — Folgt der Log-Ausgabe in Echtzeit.

podman logs -f my-web

podman logs --tail <n> <container> — Zeigt nur die letzten N Zeilen der Logs.

podman logs --tail 50 my-web

podman logs --since <time> <container> — Zeigt Logs ab einem Zeitstempel oder einer relativen Zeit.

podman logs --since 30m my-web

podman exec -it <container> <command> — Führt einen Befehl interaktiv in einem laufenden Container aus.

podman exec -it my-web bash

podman exec <container> <command> — Führt einen Befehl in einem laufenden Container aus (nicht interaktiv).

podman exec my-web cat /etc/nginx/nginx.conf

podman cp <container>:<path> <host_path> — Kopiert Dateien aus einem Container auf den Host.

podman cp my-web:/etc/nginx/nginx.conf ./nginx.conf

podman 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 images

podman pull <image> — Lädt ein Image aus einer Registry herunter.

podman pull docker.io/library/nginx:alpine

podman push <image> — Lädt ein Image in eine Registry hoch.

podman push quay.io/myuser/my-app:latest

podman 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.0

podman rmi <image> — Entfernt ein lokales Image.

podman rmi nginx:alpine

podman image prune — Entfernt alle ungetaggten (dangling) Images.

podman image prune

podman image prune -a — Entfernt alle Images, die von keinem Container genutzt werden.

podman image prune -a

podman history <image> — Zeigt die Layer-Historie eines Images.

podman history nginx:alpine

podman save -o <file> <image> — Exportiert ein Image in ein tar-Archiv.

podman save -o my-app.tar my-app:latest

podman load -i <file> — Importiert ein Image aus einem tar-Archiv.

podman load -i my-app.tar

podman search <term> — Durchsucht Registries nach passenden Images.

podman search nginx

Images 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-pod

podman 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:3306

podman run --pod <pod> <image> — Startet einen Container in einem bestehenden Pod.

podman run -d --pod my-pod --name web nginx

podman pod ls — Listet alle Pods mit Status und Container-Anzahl auf.

podman pod ls

podman pod inspect <pod> — Zeigt detaillierte JSON-Informationen zu einem Pod.

podman pod inspect my-pod

podman pod start <pod> — Startet alle Container in einem Pod.

podman pod start my-pod

podman pod stop <pod> — Stoppt alle Container in einem Pod.

podman pod stop my-pod

podman pod restart <pod> — Startet alle Container in einem Pod neu.

podman pod restart my-pod

podman pod rm <pod> — Entfernt einen gestoppten Pod und alle seine Container.

podman pod rm my-pod

podman pod rm -f <pod> — Entfernt einen Pod erzwungen, inklusive laufender Container.

podman pod rm -f my-pod

podman pod top <pod> — Zeigt die laufenden Prozesse aller Container in einem Pod.

podman pod top my-pod

podman pod logs <pod> — Zeigt die kombinierten Logs aller Container in einem Pod.

podman pod logs my-pod

Netzwerke

podman network ls — Listet alle Podman-Netzwerke auf.

podman network ls

podman network create <name> — Erstellt ein neues Netzwerk.

podman network create my-network

podman network inspect <name> — Zeigt detaillierte Informationen zu einem Netzwerk.

podman network inspect my-network

podman network connect <network> <container> — Verbindet einen laufenden Container mit einem Netzwerk.

podman network connect my-network my-web

podman network disconnect <network> <container> — Trennt einen Container von einem Netzwerk.

podman network disconnect my-network my-web

podman run --network <name> <image> — Startet einen Container in einem bestimmten Netzwerk.

podman run -d --network my-network --name api my-api

podman network rm <name> — Entfernt ein Netzwerk.

podman network rm my-network

podman network prune — Entfernt alle ungenutzten Netzwerke.

podman network prune

Rootless & 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/data

podman 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-app

podman run --user <uid>:<gid> <image> — Lässt den Container-Prozess als bestimmten Benutzer und Gruppe laufen.

podman run --user 1000:1000 my-app

podman 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-app

podman run --cap-add <capability> <image> — Fügt dem Container eine Linux-Capability hinzu.

podman run --cap-add NET_ADMIN my-app

podman run --cap-drop ALL <image> — Entzieht alle Linux-Capabilities für maximale Sicherheit.

podman run --cap-drop ALL --cap-add NET_BIND_SERVICE my-app

podman run --read-only <image> — Bindet das Root-Dateisystem des Containers schreibgeschützt ein.

podman run --read-only --tmpfs /tmp my-app

systemd-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-web

podman generate systemd --new --name <container> --files — Erzeugt die systemd-Unit und schreibt sie auf die Festplatte.

podman generate systemd --new --name my-web --files

podman generate systemd --new --name <pod> --files — Erzeugt systemd-Units für einen ganzen Pod und seine Container.

podman generate systemd --new --name my-pod --files

podman auto-update — Aktualisiert Container mit dem Label io.containers.autoupdate automatisch.

podman auto-update

podman auto-update --dry-run — Prüft, welche Container aktualisiert würden, ohne Änderungen anzuwenden.

podman auto-update --dry-run

podman generate kube <pod> — Erzeugt eine Kubernetes-YAML-Definition aus einem Pod oder Container.

podman generate kube my-pod > my-pod.yaml

podman play kube <file> — Erstellt Pods und Container aus einer Kubernetes-YAML-Datei.

podman play kube my-pod.yaml

podman play kube --down <file> — Baut Pods und Container ab, die aus einer Kubernetes-YAML-Datei erstellt wurden.

podman play kube --down my-pod.yaml

Podman Compose

podman compose up -d — Startet alle in docker-compose.yml definierten Services im Hintergrund.

podman compose up -d

podman compose down — Stoppt und entfernt alle Container und Netzwerke des Compose-Projekts.

podman compose down

podman compose ps — Listet die vom Compose-Projekt verwalteten Container auf.

podman compose ps

podman compose logs -f — Folgt den Logs aller Services in Echtzeit.

podman compose logs -f

podman compose exec <service> <command> — Führt einen Befehl in einem laufenden Compose-Service-Container aus.

podman compose exec web bash

podman compose build — Baut oder erneuert alle Service-Images.

podman compose build

Aufräumen & System

podman system df — Zeigt den Speicherverbrauch: Images, Container, Volumes.

podman system df

podman system prune — Entfernt alle gestoppten Container, ungenutzten Images und Netzwerke.

podman system prune

podman system prune -a --volumes — Vollständige Bereinigung inklusive aller ungenutzten Images und Volumes.

podman system prune -a --volumes

podman system reset — Setzt den Podman-Speicher auf den Ausgangszustand zurück. Entfernt alle Container, Images und Volumes.

podman system reset

podman system migrate — Migriert Container nach einem Podman-Upgrade auf das neueste Format.

podman system migrate

podman info — Zeigt systemweite Podman-Informationen (Version, Storage, Registries usw.).

podman info

podman version — Zeigt Details zur Podman-Version.

podman version

podman login <registry> — Meldet sich an einer Container-Registry an.

podman login quay.io

podman logout <registry> — Meldet sich von einer Container-Registry ab.

podman logout quay.io

Docker-Kompatibilität

alias docker=podman — Erstellt einen Shell-Alias, sodass docker-Befehle automatisch Podman nutzen.

alias docker=podman

podman 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.sock

export 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.

Verwandte Kommandos

  • ddev – container-basierte lokale Entwicklungsumgebungen
  • docker – die klassische Container-Engine mit Daemon
  • docker-compose – Multi-Container-Anwendungen deklarativ definieren