25 Container Lifecycle in Podman

25.1 Warum der Containerlebenszyklus bei Podman anders gedacht ist

Podman ist daemonlos. Es gibt keinen zentralen Hintergrundprozess, der Zustände speichert, Events orchestriert oder Lebenszyklen überwacht. Das wirkt sich auf jeden Schritt des Containerlebenszyklus aus – vom Erstellen über das Starten bis zum Aufräumen. Die Zustandsmaschine verteilt sich auf:

Der Lebenszyklus ist damit transparenter und unmittelbarer: Container sind Prozesse – keine Objekte eines Daemons. Dieses Modell erleichtert Debugging und erlaubt eine klare Sicht darauf, was zur Laufzeit tatsächlich passiert.


25.2 Lebenszyklusphasen im Überblick

Der Containerlebenszyklus besteht in Podman aus klar getrennten Phasen:

  1. Erzeugung (podman create)
  2. Start (podman start)
  3. Ausführung (laufender Prozess)
  4. Stop oder Kill (podman stop / podman kill)
  5. Entfernung (podman rm)
  6. Persistenz von Artefakten (Logs, Exit-Codes, Storage)

Docker fasst viele dieser Schritte stillschweigend zusammen. Podman trennt sie, um die Kontrolle explizit dem Nutzer zu überlassen.


25.3 Phase 1: Erzeugen – ein definierter, aber noch nicht laufender Container

podman create --name myapp python:3.11

Dieser Befehl erzeugt:

Der Container ist in diesem Zustand vergleichbar mit einem vollständigen, aber noch nicht gestarteten Dienst. So lassen sich Konfiguration, Volumes, Netzwerke und Umgebungsvariablen prüfen, bevor etwas ausgeführt wird.


25.4 Phase 2: Start – conmon übernimmt

podman start myapp

Beim Start geschieht Folgendes:

  1. Podman ruft conmon auf.

  2. conmon ruft die Runtime (crun oder runc) auf.

  3. Die Runtime erzeugt die isolierenden Namespaces:

  4. Der definierte Prozess wird gestartet.

  5. conmon bleibt bestehen und überwacht den Containerprozess.

Ein Überblick:

Ohne Daemon ist conmon das Bindeglied zwischen CLI und laufendem Prozess. Fällt die CLI aus, läuft der Container weiter.


25.5 Phase 3: Ausführung – der Container als isolierter Prozessbaum

Ein laufender Container ist technisch gesehen ein normaler Linux-Prozess in einem eigenen Namespace-Set.

Das bedeutet:

Die Containerlaufzeit ist damit kein verborgenes Subsystem eines Daemons, sondern eine isolierte Prozessinstanz mit klaren Schnittstellen zur Außenwelt.


25.6 Phase 4: Stop oder Kill – kontrolliert oder unmittelbar

25.6.1 podman stop

Stop sendet:

  1. SIGTERM (für einen geordneten Shutdown)
  2. nach einem Timeout SIGKILL

Nützlich für alle Prozesse, die noch aufräumen oder geordnet beenden sollen.

25.6.2 podman kill

Sendet standardmäßig sofort SIGKILL.

Nützlich bei:

Beide Befehle sind reine Signaloperationen – Podman vermittelt lediglich die Signale.


25.7 Phase 5: Entfernen – Bereinigung des Containerzustands

Ein gestoppter Container kann inspiziert werden:

podman inspect myapp
podman logs myapp
podman mount myapp

Diese Werkzeuge eignen sich für Post-Mortem-Analysen, Debugging oder Zustandsprüfungen.

Entfernen:

podman rm myapp

löscht:

Das Image bleibt erhalten.


25.8 Phase 6: Reproduzierbarkeit und statische Konfiguration

Container können jederzeit neu instanziiert werden, solange das zugrunde liegende Image verfügbar ist. Dieser Mechanismus ermöglicht reproduzierbare Deployments: Der Container ist flüchtig, das Image persistent.

Daten, die über Container hinweg bestehen sollen, gehören in Volumes – nicht in den Containerlayer.


25.9 Startmodi: Interaktiv, detached, systemd

25.9.1 Interaktiv

podman run -it ...

für Shell-Sessions, Debugging und experimentelle Ausführung.

25.9.2 Detached

podman run -d ...

für Dienste und Hintergrundprozesse.

25.9.3 systemd-Integration

Podman generiert native Units:

podman generate systemd --new --files --name myapp

Systemd übernimmt anschließend Restart-Verhalten und Prozessüberwachung – ohne dass ein Podman-Daemon benötigt wird.


25.10 Container-Events ohne Daemon

Podman ist daemonlos, aber conmon stellt Ereignisse bereit:

podman events

Auflistbare Events sind u. a.:

Die Events spiegeln reale Prozesszustände wider, nicht den Zustand eines Daemons.


25.11 Explizite Steuerung für komplexe Anwendungsfälle

Das explizite Modell – create → start → run → stop → rm – bietet präzise Kontrolle. Seitenkanalzustände wie bei daemonbasierten Engines existieren hier nicht.

Mehrstufige Anwendungen, Debugging, reproduzierbare Workflows und getrennte Build-/Run-Phasen profitieren davon.