69 Units für Container und Pods

Der Betrieb von Containern im produktionsnahen Umfeld verlangt nach klaren Verträgen: Wie wird ein Container gestartet? Wer überwacht ihn? Welche Abhängigkeiten besitzt er? Wie verhält er sich bei Fehlern oder beim Systemstart? Die Antwort darauf lautet unter Linux seit vielen Jahren: systemd. Und sobald Container durch Podman verwaltet werden, liegt es nahe, daraus native Units zu erzeugen – entweder einzeln pro Container oder als aggregierte Einheit für komplette Pods.

69.1 Container und Pods als erstklassige systemd-Dienste

Während Docker mit einem zentralen Daemon arbeitet, der selbst als systemd-Service läuft, integriert Podman Containerprozesse direkt in die Prozesshierarchie des Linux-Systems. Genau an dieser Stelle entsteht der Bedarf, die Containerlaufzeit mit systemd zu verheiraten. Systemd wird dadurch nicht zum Orchestrator im Kubernetes-Sinn, sondern übernimmt seine klassische Rolle: Prozessmanagement, Boot-Reihenfolgen, Restart-Logik, Ressourcenkontrolle über cgroups und zentralisierte Logs.

Podman erzeugt diese Units nicht automatisch – aber deterministisch über podman generate systemd. Das Werkzeug kann entweder einzelne Container oder komplette Pods beschreiben. Der resultierende Dienst ist vollständig transparent: keine Sockets, keine „magische“ Hintergrundlogik, kein proprietärer Laufzeit-Hook. Nur systemd-Mechanik.

69.2 Container-Units: die atomare Form

Eine Unit, die einen einzelnen Container beschreibt, entspricht semantisch einem klassischen Linux-Dienst. Das Modell ist einfach: ein Prozess (der Container) wird gestartet und überwacht. Die Unit sorgt dafür, dass der Container immer wieder in genau derselben Konfiguration erzeugt wird.

Ein typisches Muster:

[Service]
ExecStartPre=/usr/bin/podman rm -f webapp
ExecStart=/usr/bin/podman run --name webapp ...
ExecStop=/usr/bin/podman stop -t 10 webapp
Restart=on-failure

Diese Struktur ist nicht nur deklarativ, sondern erzwingt klare Lifecycle-Grenzen. Der Container wird vorher entfernet, dann neu angelegt, schließlich geregelten gestoppt. Systemd übernimmt Monitoring, Neustarts, Logging und das gesamte Abhängigkeitssystem.

Ein abstrahiertes Bild:

Das Modell ist so robust, dass es für produktive Services völlig ausreicht – solange der Service nur einen Container benötigt.

69.3 Pod-Units: Containergruppen als orchestrierbare Einheit

Podman bietet Pods als logische Gruppierung mehrerer Container. Ein Pod ist keine Virtualisierungsschicht, sondern eine gemeinsame Netz- und IPC-Umgebung. Man kann sich einen Pod vorstellen wie eine Mini-Deployment-Gruppe: mehrere Container – oft Sidecars – bilden einen Verbund.

Eine Pod-Unit übernimmt die Rolle eines übergeordneten Services. Systemd startet und überwacht einen Pod wie eine einzige Einheit, obwohl intern mehrere Container beteiligt sind.

Beispiel:

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

Das erzeugt eine Unit etwa folgender Art:

[Service]
ExecStart=/usr/bin/podman pod start analytics-pod
ExecStop=/usr/bin/podman pod stop -t 10 analytics-pod

Die dahinterliegenden Container werden implizit mitverwaltet, denn die Pod-Laufzeit kapselt sie bereits. Für den Betreiber wirkt der Pod wie ein einziger Dienst.

Diagrammatisch:

Diese Struktur eignet sich hervorragend für:

Pods sind ideal für Szenarien, bei denen Container eng miteinander verbunden sind, aber der Einsatz eines Clusters (Kubernetes) zu schwergewichtig wäre.

69.4 Unterschiede in der Laufzeit- und Neustartlogik

Eine Container-Unit ist ein isolierter Dienst. Systemd betrachtet ihn als einzelnes Prozessbündel. Ein Neustart der Unit bedeutet: der Container wird neu erzeugt.

Eine Pod-Unit dagegen behandelt den gesamten Verbund. Das Restart-Verhalten greift über alle Container hinweg:

Die Verantwortung verschiebt sich also:

Man kann dieses Zusammenspiel als zweistufige Kontrollarchitektur betrachten.

Diese zweistufige Architektur ist nicht kompliziert, sondern logisch: systemd verwaltet die äußere Hülle, Podman das Innenleben des Pods.

69.5 Boot-Reihenfolgen und Abhängigkeiten

Container-Units lassen sich granular in systemd-Targets einbetten:

After=network-online.target
Wants=network-online.target

Bei Pods funktioniert das genauso, nur auf der höheren Ebene. Der Pod startet erst, sobald seine Abhängigkeiten erfüllt sind – und erst danach seine Container.

Das ist ein gravierender Unterschied zu Docker Compose: Dort müssen Abhängigkeiten modelliert werden; systemd dagegen besitzt bereits ein etabliertes, kernelnahes Framework dafür. Die Integration von Containern und Pods wird dadurch nicht nur konsistenter, sondern strukturell eleganter.

69.6 Rootless-Betrieb und User-Units

Im Rootless-Betrieb werden sowohl Container-Units als auch Pod-Units als User-Services ausgeführt:

systemctl --user enable webapp.service

Ein wichtiger Punkt ist das „Linger“:

loginctl enable-linger username

Ohne Linger laufen Rootless-Units nur bei aktiver Login-Session. Dies gilt sowohl für Container- als auch Pod-Services.

Die User-Scopes erlauben eine Art Multi-Tenant-Architektur: Jede Person kann eigene Dienste betreiben, ohne das System zu berühren.

69.7 Situative Entscheidung: Container-Unit oder Pod-Unit?

Eine häufige Architektenfrage lautet: „Wann benutze ich Container-Units, wann Pod-Units?“

Praktische Heuristik:

Entscheidend ist die Kopplung: Pods kapseln Container enger, Units sind lose gekoppelt. Im Orchestrator-Kontext entspricht dies dem Unterschied zwischen Deployment und Pod in Kubernetes.

69.8 Modifikation und Feintuning

Sobald eine Unit generiert wurde, sollte sie als explizites Betriebsartefakt betrachtet werden. Typische Ergänzungen:

Restart=always
EnvironmentFile=/etc/myapp/env
TimeoutStartSec=0
RequiresMountsFor=/var/storage

Bei Pod-Units ist oft weniger Anpassung nötig – die Containerparameter werden bereits durch die Pod-Konfiguration gesteuert.

Ein Beispiel für eine strukturell saubere Abhängigkeit:

[Unit]
Requires=redis.service
After=redis.service

Dadurch startet das Backend erst dann, wenn der externe Redis-Dienst verfügbar ist. Bei Pods wäre dies nicht ratsam, wenn Redis selbst im Pod läuft.

69.9 Diagnose und Betrieb

Monitoring erfolgt bei beiden Unit-Typen über dieselben Mechanismen:

journalctl -u webapp.service -f

Für rootless:

journalctl --user -u webapp.service -f

Pod-Units liefern Logs der Pod-Laufzeit, Container-Units Logs des Containerprozesses. Wer detaillierte Containerlogs benötigt, kann zusätzlich Podman-eigene Logstrukturen nutzen, aber systemweit betrachtet ist journalctl die zentrale Anlaufstelle.


Units für Container und Pods sind keine Nebensache, sondern ein vollwertiges Betriebsmodell. Sie ermöglichen stabile, nachvollziehbare und systemnahe Containerlaufzeiten – und bilden einen wichtigen Baustein moderner Linux-Deployments mit Podman.