02. April 2025

Container mit Quadlet in systemd integrieren

Mit Podman lassen sich Container nicht nur gleich wie mit Docker betreiben, sondern auch sehr einfach in systemd integrieren. So verwaltest, startest und stoppst du Container wie reguläre systemd-Dienste – sowohl als unprivilegierte:r Benutzer:in als auch als root-User. Die Software Quadlet macht dies möglich, seit Podman 4.4 ist sie Bestandteil von Podman.

Infrastructure & Cloud Services
Linux System Engineering
Beitragsbild Podman

Voraussetzung ist ein systemd-basiertes Linux Betriebssystem mit Podman ab der Version 4.4. Die untenstehenden Tests wurden mit Rocky Linux 9 und Arch Linux durchgeführt.

Die vollständigen Beispieldateien sind in diesem Git Repository zu finden.

Einfaches Beispiel: Nginx

Im ersten Beispiel wollen wir einen Nginx Server, der mit einem Passwort abgesichert ist, mit Podman und Quadlet betreiben:

Benutzername: hello
Passwort: helloworld

Vorbereitung / Installation

sudo dnf install -y podman
sudo adduser testuser
enable-linger macht, das Prozesse der Benutzenden auch weiter laufen wenn sich diese ausgeloggt oder noch gar nicht eingeloggt haben.
sudo loginctl enable-linger testuser
sudo su - testuser
mkdir ~/podman_example/
cd ~/podman_example/

Download und Konfiguration

Kubernetes Pod definition YAML File herunterladen (entspricht einer Docker Compose Datei):

curl -O https://gitlab.puzzle.ch/public-blog-examples/sys/podman_example/-/raw/main/nginx_webserver.yml

Htpassword-Datei mit Benutzernamen und Passwort herunterladen:

curl -O https://gitlab.puzzle.ch/public-blog-examples/sys/podman_example/-/raw/main/.htpasswd

Nginx Konfigurationsdatei herunterladen:

curl -O https://gitlab.puzzle.ch/public-blog-examples/sys/podman_example/-/raw/main/nginx.conf

Verzeichnis erstellen, wo Quadlet nach .container Unitfiles des Users sucht und in dieses Verzeichnis wechseln. Anschliessend Kubernetes Pod YAML Definition herunterladen:

mkdir -p /home/testuser/.config/containers/systemd/
cd /home/testuser/.config/containers/systemd/
curl -O https://gitlab.puzzle.ch/public-blog-examples/sys/podman_example/-/raw/main/nginx_webserver.kube

Die nginx_webserver.kube Datei ist der eigentliche Schnittpunkt zwischen systemd und Podman.
Entscheidend ist hier der Pfad wo die .kube-Datei spezifiziert wird, also: /home/testuser/podman_example/nginx_webserver.yml

Verwendete das System SELinux muss noch der SELinux Kontext angepasst werden:

sudo dnf install -y policycoreutils-python-utils
sudo semanage fcontext -a -t container_file_t /home/testuser/podman_example/.htpasswd
sudo semanage fcontext -a -t container_file_t /home/testuser/podman_example/nginx.conf
sudo semanage fcontext -a -t container_file_t /home/testuser/podman_example/nginx_webserver.yml
sudo restorecon -Rv /home/testuser/podman_example/

Start des Containers

Damit du user-level systemd Service verwenden kannst, muss die Umgebungsvariable XDG_RUNTIME_DIR gesetzt sein. Anschliessend kannst du den Service als unprivilegierter User starten:

sudo su - testuser
XDG_RUNTIME_DIR muss gesetzt sein das man systemctl --user verwenden kann.
`echo "export XDG_RUNTIME_DIR=/run/user/$UID" >> /home/testuser/.bashrc`
source /home/testuser/.bashrc
systemctl --user daemon-reload
systemctl --user start nginx_webserver.service
systemctl --user status nginx_webserver.service

Ob der Container nun wie gewünscht funktioniert, kann man im Browser oder mittels Curl überprüfen. Folgende Anfrage sollte nicht funktionieren, respektive in einer Eingabeaufforderung für Benutzernamen und Passwort münden: http://localhost:8080

Geben wir in der URL den Basicauth-Username sowie Passwort an, sollte die Nginx Startseite anzeigen werden: http://hello:helloworld@localhost:8080

Debugging

Sollten Probleme auftauchen, kann man mit Podman nach journald loggen. Dann kann man Container Fehler mit journalctl debuggen.

#~/.config/containers/containers.conf
[containers]
log_driver = "journald"

Fazit

In diesem Blogpost wurde erklärt, wie man einfach mit systemd und Podman Container laufen lassen kann. In einem weiteren mini Blog wird dann noch erläutert wie man mit podman-compose und podman generate kube Docker-Compose Dateien automatisiert auf Podman migieren kann.