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.
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.