Eine Tutorialreihe zum Einsatz von Podman: Anwendung, Vorteile und Funktionsweise.
Inhaltsverzeichnis
- Teil: Einleitung und Installation
- Teil: Podman CLI
- Teil: Wie funktioniert die Restart-Policy? Oder: Podman hat keinen Daemon
- Teil: Quadlets
- Teil: Updates
- Teil: Healthchecks
- Teil: Ports publishing - rootful & rootless
- Teil: Volumes & Mounts
- Teil: Netzwerk: Kommunikation zwischen Containern
- Teil: Capabilities
Einleitung
In den ersten Artikeln möchte ich erklären, wie du Container mittels Podman laufen lassen kannst. Dabei werden wir beispielhaft IT Tools zum Laufen bringen. Es handelt sich dabei um eine kleine Applikation, die einige nützliche Tools für Sysadmins bietet. Neben seiner Nützlichkeit ist es auch ein guter Startpunkt für das Podman-Thema, gerade weil es so simpel ist.
Es gibt verschiedene Möglichkeiten Container mit Podman laufen zu lassen. In diesem Artikel beschäftigen wir uns mit dem CLI-Tool von Podman. In späteren Artikeln werden wir uns mit Compose und Quadlet beschäftigen.
Podman CLI
Werfen wir einen ersten Blick in die Installationsanleitung von IT-Tools. Diese zeigt als Erstes das docker run Kommando:
docker run --pull always --restart unless-stopped -p 8080:8080 sharevb/it-tools:latest
Podman wurde so erstellt, dass du nur den Alias alias docker='podman' zu erstellen brauchst, um die docker-Befehle direkt ausführen zu können. Mir hat das jedoch nie zugesagt. Es gibt nämlich immer wieder kleine Differenzen zwischen Docker und Podman, wo diese Idee ins Wanken gerät. So auch hier: Docker geht davon aus, dass immer die eigene Plattform docker.io gemeint ist, wenn keine URL vor dem Image steht. Das ist der Vorteil davon, zuerst zu sein. Podman macht das nicht, zumindest nicht out of the box. sharevb/it-tools:latest musst du also durch docker.io/sharevb/it-tools:latest ersetzen. Und wenn du das schon machst, weshalb nicht gerade docker durch podman ersetzen?
Das gäbe dann den folgenden Befehl:
podman run --pull always --restart unless-stopped -p 8080:8080 docker.io/sharevb/it-tools:latest
Betrachten wir den Befehl
Der Befehl podman run könnte als Kurzform von (podman pull, falls nötig) + podman create + podman start [+ podman attach] angesehen werden. Im Detail läuft podman run so ab:
- Falls das angegebene Image noch nicht lokal vorhanden ist, wird es automatisch heruntergeladen (das entspricht
podman pull). Ist das Image aber schon lokal, entfällt dieser Schritt komplett. - Es wird ein neuer Container aus dem Image angelegt, mit allen Optionen (das entspricht
podman create). - Der neu erstellte Container wird gestartet (das entspricht
podman start). - Ohne -d hängt sich podman run an den Container und zeigt dessen Ausgabe live an (ähnlich
podman attachbzw.podman logs -f).
--pull always sorgt dafür, dass das Image jedes Mal von Neuem heruntergeladen wird, unabhängig davon, ob es schon lokal vorhanden ist. So wird sichergestellt, dass du immer die neueste Version nutzt.
Die Restart-Richtlinie bestimmt, ob ein Container neu gestartet werden soll, wenn er beendet wurde. --restart unless-stopped-Container sollen beim Beenden neu gestartet werden, es sei denn, der Container wurde vom Benutzer explizit gestoppt. Mehr dazu im Teil 3: Wie funktioniert die Restart-Policy? Oder: Podman hat keinen Daemon.
-p HostPort:ContainerPort oder auch --publish=HostPort:ContainerPort verbindet einen Port auf dem Host mit einem Container-internen Port. Über diesen Host-Port ist der Container nun erreichbar. Hier ist der Host-Port 8080 mit dem internen Port 8080 verbunden.
Wenn du also den oben genannten Befehl ausführst, sollten zwei Dinge passieren:
- Der Start von IT-Tools sollte im Terminal sichtbar sein. Solange du nicht abbrichst (CTRL-C), wird dein Terminalfenster durch den Container blockiert sein.
- Du solltest IT-Tools über erreichen können.
Den Container im Hintergrund laufen lassen
Wenn du dein Terminal trotz laufenden IT-Tools nutzen möchtest, musst du dem Befehl die Option -d oder --detach hinzufügen.
podman run --pull always --restart unless-stopped -p 8080:8080 -d docker.io/sharevb/it-tools:latest
Statt der ganzen Log-Ausgaben kriegst du so lediglich die Container-ID angezeigt. In meinem Fall ist das 32518ad8d7d62ac3ea5349766c666c08c1ca8f26388e26ca2fe587dd8ca842ff. Mit dieser lässt sich jeder Container eindeutig bestimmen.
Container auflisten
Wenn du nun dein Terminal beendest, siehst du nicht mehr, welche Container eigentlich laufen. Dafür gibt es den Befehl podman ps. Er lehnt sich an das Standard-Tool ps an und zeigt dir an, welche Podman Container gerade laufen.
podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
32518ad8d7d6 docker.io/sharevb/it-tools:latest nginx -g daemon o... 3 seconds ago Up 3 seconds 0.0.0.0:8080->8080/tcp vibrant_ellis
Hier siehst du nochmals die Kurzfassung der Container-ID. In meinem Fall lautet sie 32518ad8d7d6. Mit dieser kannst du deinen Container direkt ansprechen, doch angenehm ist das nicht. Besser (menschlicher) ist es, mit dem Container-Namen zu arbeiten. In meinem Fall vibrant_ellis. Dieser Name ist halb zufällig und hat daher keinen Zusammenhang zu deinem Container. Er lässt sich aber auch selbst festlegen. So kann etwas gewählt werden, das für dich mehr Sinn macht, wenn du mit dem Container zu tun hast. Das machen wir mit der Option --name gefolgt vom Namen, den wir setzen wollen.
Container stoppen, starten, neu starten, löschen
Um Container wieder zu beenden, nutzt du den Befehl podman stop, gefolgt von der Container-ID oder dem Container-Namen: podman stop ittools.
Der Container ist dann zwar gestoppt, existiert aber noch. Alle Container – auch die gestoppten – kannst du dir mittels podman ps -a anzeigen lassen.
podman stop vibrant_ellis
podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
32518ad8d7d6 docker.io/sharevb/it-tools:latest nginx -g daemon o... 10 minutes ago Exited (0) 13 seconds ago 0.0.0.0:8080->8080/tcp vibrant_ellis
Einen gestoppten Container kannst du wieder mittels podman start gefolgt von der Container-ID oder dem Container-Namen starten: podman start vibrant_ellis.
Um einen laufenden Container neu zu starten, nutzt du den Befehl podman restart gefolgt von der Container-ID oder dem Container-Namen: podman restart vibrant_ellis.
Um einen gestoppten Container zu löschen, nutzt du den Befehl podman rm gefolgt von der Container-ID oder dem Container-Namen, also podman rm vibrant_ellis.
Ich nehme an, du erkennst das Muster. Hier nochmals zusammengefasst:
podman start vibrant_ellis
podman restart vibrant_ellis
podman stop vibrant_ellis
podman rm vibrant_ellis
Gelöschte Container neu erstellen
Wenn du einen Container gelöscht hast, kannst du ihn nicht mehr starten. Dann musst du erst wieder einen Container erstellen. Nutze dafür podman create mit den gleichen angehängten Optionen wie zuvor beim podman run-Befehl:
podman create --pull always --restart unless-stopped -p 8080:8080 docker.io/sharevb/it-tools:latest
Wiederum kriegst du die ID, mit der du den Container starten kannst:
podman start 539ec26c5
Oder du nutzt einfach wieder podman run, der beides in einem macht.
Container-Logs anzeigen
Bei Problemen möchtest du die Logs des Containers checken. Mit dem Befehl podman logs, gefolgt von der Container-ID oder dem Container-Namen, kriegst du Logs bis zum jetzigen Zeitpunkt. In unserem Fall also podman logs ittools. Wenn du außerdem möchtest, dass sich die Logs aktualisieren, brauchst du noch die Option -f oder --follow: podman logs -f ittools.
podman logs 539ec26c5
podman logs -f 539ec26c5
Container-ID und Container-Name
Noch ein Wort zur Container-ID und dem Container-Namen. Oft wird davon abgeraten, einen Namen zu setzen, da dieser einzigartig sein muss. Wenn du mehrere Container eines Images erzeugen willst, funktioniert die Namensgebung natürlich nicht. Wenn du die --name-Option weglässt, setzt Podman einen halbzufälligen Namen. Wie oben kannst du dir mittels podman ps den Namen anzeigen lassen. Dann kannst du den Namen auch wieder in den Befehlen einsetzen.
Du kannst aber auch immer die Container-ID nutzen. Dabei brauchst du nicht die ganze ID, sondern nur so viel, dass Podman eindeutig weiß, welchen Container du meinst.
Weshalb also würdest du vielleicht trotz Best Practice einen Container-Namen setzen? Weil du evtl. nur ein IT Tools bei dir laufen hast. Dann kannst du problemlos einen Namen setzen. Das hat dann den Vorteil, dass du deine Container sofort anhand ihrer Namen erkennst und auch managen kannst.
Rootless Container
Vielleicht ist dir schon aufgefallen, dass ich kein sudo vor die Podman-Befehle gesetzt habe. Das liegt daran, dass der Container mit deinen eigenen Nutzerrechten läuft, also rootless.
Wir werden uns laufend mit den Konsequenzen davon beschäftigen. Im Moment musst du nur wissen, dass der Container unter deinem Nutzer läuft.
Wenn du den Container rootful laufen lassen möchtest, musst du die Befehle mit Root-Rechten ausführen:
# Im Vordergrund:
sudo podman run --pull always --restart unless-stopped -p 8080:8080 docker.io/sharevb/it-tools:latest
# Im Hintergrund:
sudo podman run --pull always --restart unless-stopped -p 8080:8080 -d docker.io/sharevb/it-tools:latest
Auch alle anderen Podman-Befehle, die sich um die rootful Container drehen, musst du mit Root-Rechten ausführen. Beispielsweise um die rootful Container aufzulisten:
sudo podman ps
Experimentieren
Ich lade dich ein, zu experimentieren. So lernst du schnell, wie Podman funktioniert. Überlege dir auch, weshalb das so ist.
Was passiert, wenn du...
--pull alwaysweglässt?-p 8080:8080weglässt?- den Host-Port änderst, zum Beispiel
-p 9999:8080? - den Container-Port änderst, zum Beispiel
-p 8080:9999?
Fazit und Ausblick
Du kennst jetzt die wichtigsten Podman-CLI-Befehle, um Container zu erstellen, zu starten, aufzulisten, zu stoppen, neu zu starten, zu löschen und ihre Logs anzuschauen – egal ob rootless oder rootful. Damit hast du das Handwerkszeug, um im Alltag mit einzelnen Containern zu arbeiten.
Ein Detail haben wir bewusst ausgeklammert: die Restart-Policy (--restart unless-stopped). Weil Podman im Gegensatz zu Docker keinen Daemon hat, funktioniert automatisches Neustarten anders – genau darum geht es im nächsten Teil.
TL;DR
Starte IT-Tools:
# ROOTLESS:
# Im Vordergrund:
podman run --pull always --restart unless-stopped -p 8080:8080 docker.io/sharevb/it-tools:latest
# Im Hintergrund:
podman run --pull always --restart unless-stopped -p 8080:8080 -d docker.io/sharevb/it-tools:latest
# ROOTFUL:
# Im Vordergrund:
sudo podman run --pull always --restart unless-stopped -p 8080:8080 docker.io/sharevb/it-tools:latest
# Im Hintergrund:
sudo podman run --pull always --restart unless-stopped -p 8080:8080 -d docker.io/sharevb/it-tools:latest
Liste laufende Container auf:
# ROOTLESS:
podman ps
# ROOTFUL:
sudo podman ps
Container-Logs anzeigen:
podman logs
podman logs -f
Container starten, neu starten, stoppen und löschen:
podman start
podman restart
podman stop
podman rm
Quellen und Dokumentation
- «podman-create — Podman documentation». Zugriff am 6. August 2026. https://docs.podman.io/en/stable/markdown/podman-create.1.html.
- «podman-logs — Podman documentation». Zugriff am 6. August 2026. https://docs.podman.io/en/stable/markdown/podman-logs.1.html.
- «podman-restart — Podman documentation». Zugriff am 6. August 2026. https://docs.podman.io/en/stable/markdown/podman-restart.1.html.
- «podman-run — Podman documentation». Zugriff am 4. August 2026. https://docs.podman.io/en/latest/markdown/podman-run.1.html.
- «podman-start — Podman documentation». Zugriff am 6. August 2026. https://docs.podman.io/en/stable/markdown/podman-start.1.html.
- «podman-stop — Podman documentation». Zugriff am 6. August 2026. https://docs.podman.io/en/stable/markdown/podman-stop.1.html.
Quellen:
- «podman-create — Podman documentation». Zugriff am 6. August 2026. https://docs.podman.io/en/stable/markdown/podman-create.1.html.
- «podman-logs — Podman documentation». Zugriff am 6. August 2026. https://docs.podman.io/en/stable/markdown/podman-logs.1.html.
- «podman-restart — Podman documentation». Zugriff am 6. August 2026. https://docs.podman.io/en/stable/markdown/podman-restart.1.html.
- «podman-run — Podman documentation». Zugriff am 4. August 2026. https://docs.podman.io/en/latest/markdown/podman-run.1.html.
- «podman-start — Podman documentation». Zugriff am 6. August 2026. https://docs.podman.io/en/stable/markdown/podman-start.1.html.
- «podman-stop — Podman documentation». Zugriff am 6. August 2026. https://docs.podman.io/en/stable/markdown/podman-stop.1.html.
