Featured image of post Einführung in Podman

Einführung in Podman

Allgemeine Einführung in Podman als Containerumgebung und Ersteinrichtung

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:

1
2
3
4
5
6
7
podman version
Client:       Podman Engine
Version:      5.2.2
API Version:  5.2.2
Go Version:   go1.22.7 (Red Hat 1.22.7-2.el9_5)
Built:        Tue Nov 12 16:49:57 2024
OS/Arch:      linux/arm64

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:

1
sudo dnf install podman systemd-container

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:

1
sudo su - Beispiel1

Dies kann aber zu Problemen bei der Verwendung von systemctl im Usermode (--user) führen, deswegen ist folgendes empfehlenswerter:

1
sudo machinectl shell --uid Beispiel1

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:

1
sudo loginctl enable-linger $(id -u viertelwissen)

Mit

1
sudo ls -l /run/user

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:

1
sudo podman ps -a

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

1
sudo podman auto-update

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:

1
sudo systemctl enable podman-auto-update.timer --now

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:

1
systemctl --user enable podman-auto-update.timer --now

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:

1
podman run -d --rm -p 10000:80 docker.io/nginx

Mit folgendem Befehl können wir uns vergewissern, dass der Container läuft:

1
podman ps

Ausgabe:

1
d40b9283f4d8  docker.io/library/nginx:latest               nginx -g daemon o...  35 seconds ago  Up 36 seconds         0.0.0.0:10000->80/tcp     nervous_thompson

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:

1
podman logs -f nervous_thompson

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:

1
curl -v http://localhost:10000

Wir sollten jetzt die komplette Ausgabe der Webseite sehen, also unter anderem das “Welcome to nginx”:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
curl -v http://localhost:10000                                                                                  iceflom@podmanvm
[...]]
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[...]

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:

1
2
sudo firewall-cmd --permanent --add-port=10000/tcp
sudo firewall-cmd --reload

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.

Erstellt mit Hugo
Theme Stack gestaltet von Jimmy