Einleitung
Wenn es um Container geht, denken die meisten Leute sofort an Docker. Docker gibt es schon seit vielen Jahren, es ist sehr populär geworden und wirklich einfach zu bedienen. Doch es ist nur ein System von vielen anderen, die einfach den OCI (Open Container Initiative) Standard verwenden. Die OCI Spezifikation definiert allgemein, wie Container erstellt, gestartet und ausgeführt werden oder wie das Format der dazugehörigen Images aussieht. Da sich neben Docker auch Podman oder Kubernetes an diesen Standard halten, können in allen Systemen die bekannten Images aus Docker Hub genutzt werden.
Podman, erstmalig 2018 erschienen, ist eine neuere Alternative zu Docker, das es bereits seit 2013 gibt. Podman wurde von Red Hat entwickelt, um einige Schwachstellen von Docker zu beheben und ein besseres und sichereres System zu schaffen. Zusätzlich wurde es so entwickelt, dass es mit den gleichen Befehlen bedient werden kann wie Docker. Jemand der Docker bereits kennt kann somit auch mit Podman direkt durchstarten.
Vorteile von Podman gegenüber Docker
- Sicherheit: Podman arbeitet daemonless, was bedeutet dass kein zentraler Prozess dauerhaft laufen muss. Bei Docker muss dauerhaft ein Daemon mit root-Berechtigungen laufen, Podman dagegen startet jeden Container als eigenständigen Prozess. Somit können auch normale Benutzer ohne root-Berechtigungen Container nutzen.
- Kompatibel zu Docker: Wenn man schon mit Docker gearbeitet hat, kann man direkt Podman einsetzen ohne komplett neue Befehle lernen zu müssen.
- Lizenz: Podman ist vollständig Open Source und kann kostenlos verwendet werden.
- Integration: Podman integriert sich gut ins Linux System mit systemd ein. Durch Quadlets lassen sich die Container wie alle anderen Services über systemctl kontrollieren.
- Update: Podman hat eine Funktion für automatische Updates der Container bereits integriert.
Quadlets
Quadlets sind eine Möglichkeit, Konfigurationen von Containern zu beschreiben. Mit Docker würde man dafür eine docker-compose.yml verwenden. Quadlets sind vom Aufbau wie eine systemd Service Datei und enthalten auch Elemente von ihnen. Dementsprechend generiert systemd aus diesen Dateien dann auch automatisch entsprechende Services, die man dann einfach benutzen kann.
Damit wird der Container wie jeder andere Service von systemd überwacht und ggf. neu gestartet, sollte er mal abstürzen. Ebenso sorgt systemd dafür, dass der Container zusammen mit dem System wieder gestartet wird. Bei einem Neustart über systemctl wird der Container immer gelöscht und neu erstellt.
Das Thema Quadlets wird in einem eigenen Beitrag behandelt.
Voraussetzungen
Generell läuft Podman auf jedem System. Unter Linux nativ, unter macOS und Windows über eine emulierte Linux-Umgebung (wie bei Docker). Die Paketmanager der Linux-Distributionen kennen podman bereits, unter macOS und Windows installiert man am einfachsten Podman Desktop, siehe Podman Webseite.
Für die Wahl des Betriebsystems ist es wichtig zu recherchieren, welche Version von Podman eingesetzt wird. Debian 12 zum Beispiel liefert nach wie vor die Version 4.3.1 aus dem Jahr 2022 aus. In dieser Version unterstützt Podman “Quadlets” noch nicht. Unsere Versuche Podman in einer aktuelleren Version unter Debian zu installieren führten zu Problemen bei anderen Programmen.
Deswegen nutze ich für meine Systeme auf denen ich Podman einsetzen möchte bevorzugt Alma Linux, dort ist eine weitaus aktuellere Version vorhanden. Die aktuelle Ausgabe von podman version
:
|
|
Auf RHEL-basierten Systemen (wie Alma Linux) und unter openSuse ist Podman die Standard Containerumgebung, das dürfte auch der Grund sein wieso hier die neueren Versionen schneller ankommen.
In dieser Beschreibung wird Alma Linux genutzt, zur Installation und Ersteinrichtung des Systems haben wir eine eigene Anleitung: Linux Server Grundeinrichtung mit Alma Linux
Installation
Die Installation ist unter Alma Linux denkbar einfach. Es empfiehlt sich, zusätzlich zu Podman auch systemd-container zu installieren:
|
|
systemd-container bringt den Befehl machinectl
mit. Dieser wird genutzt, um in einen anderen Benutzer zu wechseln.
Beispiel: Du bist mit dem Benutzer “User1” eingeloggt, der auch sudo-Berechtigungen hat. Du möchtest jetzt in den Benutzer “Beispiel1” wechseln. Häufig sieht man dann folgendes Vorgehen:
|
|
Dies kann aber zu Problemen bei der Verwendung von systemctl im Usermode (--user) führen, deswegen ist folgendes empfehlenswerter:
|
|
Verlassen kann man die Session entweder mit dem Befehl exit
oder wenn man 3x schnell die Kombination STRG + 5 ausführt (Mac: control + 5).
Einrichtung Autostart
Per Quadlet definierte Container lassen sich über systemctl starten und würden nach einem Systemneustart auch von selbst wieder hochfahren. Dies gilt aber nur für Container, die als root erstellt worden sind.
Für unprivilegierte Benutzer gibt es systemctl im Usermode systemctl --user, der automatische Start erfolgt dort standardmäßig aber erst nach einer Anmeldung des jeweiligen Benutzers. Sollen auch diese Container unabhängig von einer Benutzeranmeldung wieder starten, muss für den Benutzer der Lingering-Service aktiviert werden.
Beispiel: Der Benutzer viertelwissen soll zukünftig Container enthalten, die zusammen mit dem System starten. Dann folgenden Befehl ausführen:
|
|
Mit
|
|
sollte jetzt ein Verzeichnis mit der ID des Benutzers zu sehen sein, der Lingering-Service ist somit für den Benutzer aktiv.
Wer sieht welche Container?
Wie schon erwähnt gibt es bei Podman keinen zentralen dauerhaft laufenden Dienst. Somit kann jeder Benutzer Container nutzen, ohne root- oder anderweitige zusätzliche Berechtigungen zu benötigen.
Unter Docker kann man sich alle vorhandenen Container im System mit sudo docker ps -a
anzeigen lassen. Dieser Befehl funktioniert unter Podman genauso:
|
|
Der Unterschied ist, dass nicht alle Container im System angezeigt werden, sondern nur die die vom User root erstellt worden sind, da der Befehl mit sudo ausgeführt wurde. Führt man den Befehl ohne sudo aus, sieht man die Container des Benutzers, mit dem man gerade angemeldet ist.
Jeder Benutzer verwaltet somit nur die eigenen Container über die Podman-Befehle.
Einrichtung Auto-Update
Während man unter Docker für Auto-Updates mit Hilfscontainern wie “Watchtower” arbeiten muss, enthält Podman eine integrierte Methode, um Container automatisch zu aktualisieren. Dabei wird in einem regelmäßigen Intervall geprüft, ob es ein neues Image in der Container-Registry, wie zum Beispiel Docker Hub, gibt. Wenn ja, wird dieses geladen und der Container auf Basis des neuen Image neu erstellt. Damit ein Container automatisch aktualisiert wird, muss dieser ein bestimmtes Label haben, dies wird im Beitrag zu den Quadlets näher erläutert werden.
Standardmäßig ist diese Funktion nicht aktiv und kann nur manuell mit dem Befehl
|
|
ausgeführt werden. Dies würde jetzt das Auto-Uodate nur für die Container des Benutzers root durchführen. Damit das ganze automatisch jeden Tag einmal ausgeführt wird, wird ein systemd-Timer mitgliefert der einfach nur aktiviert werden muss:
|
|
Wenn auch bei einem Benutzer die Container automatisch aktualisiert werden sollen, muss der Timer dort entsprechend ebenfalls aktiviert werden, indem nachfolgender Befehl mit dem entsprechenden Benutzer ausgeführt wird:
|
|
Einfachen Container starten
Die Nutzung auf der Kommandozeile unterscheidet sich wie schon erwähnt nicht von Docker, im Endeffekt muss nur das “docker” durch “podman” ersetzt werden. Außerdem muss bei der Angabe des Images auch immer die Registry angegeben werden, von der das Image geladen werden soll. Unter Docker wird standardmäßig von “docker.io” ausgegangen, deswegen entfällt die Angabe dort.
Um also einen einfachen Nginx-Container auf Port 10000 zu starten, der nach dem Beenden wieder von selbst gelöscht wird, kann folgender Befehl genutzt werden:
|
|
Mit folgendem Befehl können wir uns vergewissern, dass der Container läuft:
|
|
Ausgabe:
|
|
Der Container hat in diesem Fall den Namen “nervous_thompson” erhalten, weil wir nicht explizit einen anderen Namen definiert haben. Den kann man nun nutzen, um sich zum Beispiel das Log fortlaufend anzeigen zu lassen:
|
|
Mit STRG+C (Mac: control+C) kann man das Log wieder verlassen.
Um zu prüfen, dass eine Verbindung zu dem Nginx-Container möglich ist, können wir curl
einsetzen. Dazu:
|
|
Wir sollten jetzt die komplette Ausgabe der Webseite sehen, also unter anderem das “Welcome to nginx”:
|
|
Hinweis zu den Ports
Im Gegensatz zu Docker pfuscht Podman nicht an der Firewall herum. Wenn ihr also einen Port zuweist der von außen erreichbar sein soll, wie hier mit -p 10000:80
, muss man sich selbst darum kümmern dass der Port in der Firewall freigegeben wird.
Wenn du ebenfalls Alma Linux einsetzt und damit die Firewall firewalld im Einsatz hast, kann der Port folgendermaßen dauerhaft geöffnet werden:
|
|
Genauere Erklärungen zu firewalld findest du in unserem Artikel: firewalld verstehen und benutzen (firewall-cmd)
Abschluss
Podman ist grundsätzlich einsatzbereit und kann mit den von Docker bekannten Befehlen genutzt werden. Im nächsten Artikel wird es um die Quadlets gehen, mit denen die Container dann sinnvoll beschrieben und ins System integriert werden können.