Podman - Conteneurs en tant que service

Vérifier la santé des disques, les commandes diffères en fontion d’un SSD et d’un NVME

Conteneurs en tant que service

Création de fichiers utilisateur systemd pour les conteneurs

Il est possible de définir manuellement les services systemd dans le répertoire ~/.config/ systemd/user/.

La commande podman generate systemd permet de configurer le service systemd afin de créer le conteneur lorsque le service démarre :

$ podman generate systemd --name mywebserver
[...]
ExecStart=/usr/bin/podman start mywebserver
ExecStop=/usr/bin/podman stop -t 10 mywebserver
ExecStopPost=/usr/bin/podman stop -t 10 mywebserver
[...]
  • ExecStart : systemd exécute la commande podman start pour démarrer le conteneur existant
  • ExecStop : systemd exécute la commande podman stop pour arrêter le conteneur (le conteneur ne sera PAS supprimé)
  • ExecStopPost : systemd rappelle la commande si le service n’a pas démarré correctement ou est arrété

La commande podman generate systemd permet de configurer le service systemd afin de créer le conteneur lorsque le service démarre, et de supprimer le conteneur lorsque le service s’arrête avec l’option --new :

$ podman generate systemd --name mywebserver --new
[...]
ExecStartPre=/bin/rm -f %t/%n.ctr-id
ExecStart=/usr/bin/podman run --cidfile=%t/%n.ctr-id --cgroups=no-conmon --rm --
sdnotify=conmon --replace -d --name mywebserver -p 8080:8080 -v /home/john-adm/
app-artifacts:/var/www/html:Z registry.access.redhat.com/ubi8/httpd-24
ExecStop=/usr/bin/podman stop --ignore --cidfile=%t/%n.ctr-id
ExecStopPost=/usr/bin/podman rm -f --ignore --cidfile=%t/%n.ctr-id
[...]
  • ExecStart : systemd exécute la commande podman run pour créer et démarrer le nouveau conteneur puis lance un podman run --rm
  • ExecStop : systemd exécute la commande podman stop pour arrêter le conteneur
  • ExecStopPost : systemd appelle la commande podman rm -f quand le service est arrété

La commande podman generate systemd avec l’option --files permet de créer le fichier utilisateur systemd dans le répertoire actuel et comme le stockage est persistant ici, il faut également préciser --new :

$ podman generate systemd --name mywebserver --new --files
/home/john-adm/container-mywebserver.service

Création du répertoire ~/.config/systemd/user/ :

$ mkdir -p ~/.config/systemd/user/

Déplacement vers un nouvel emplacement :

$ mv container-mywebserver.service ~/.config/systemd/user/

Gestion des fichiers utilisateur systemd pour les conteneurs

L’option --user de la commande systemctl permet de gérer le conteneur mywebserver avec un nouvel utilisateur :

$ systemctl --user daemon-reload
$ systemctl --user start container-mywebserver.service
$ systemctl --user status container-mywebserver.service
● container-mywebserver.service - Podman container-mywebserver.service
Loaded: loaded (/home/john-adm/.config/systemd/user/container-mywebserver.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2022-04-28 21:22:26 EDT; 18s ago
Docs: man:podman-generate-systemd(1)
Process: 31560 ExecStartPre=/bin/rm -f /run/user/1003/containermywebserver.service.ctr-id (code=exited, status=0/SUCCESS)
Main PID: 31600 (conmon)
[...]
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
18eb00f42324 registry.access.redhat.com/ubi8/httpd-24:latest /usr/bin/runhttp... 28 sec ago Up 29 sec 0.0.0.0:8080->8080/tcp mywebserver

Created symlink /home/john-adm/.config/systemd/user/default.target.wants/container-mywebserver.service → /home/john-adm/.config/systemd/user/containermywebserver.service.

Note : Si un conteneur est configuré avec systemd, ce dernier surveille l’état du conteneur et le redémarre en cas de défaillance. Il ne faut PAS utiliser la commande podman pour démarrer ou arrêter ce conteneurs (conflit)

Gestion des conteneurs en root avec systemd

Les fichiers de service pfonctionnent comme des fichiers d’unité systemd courants (ps comme un utilisateur particulier).

Exceptions :

  • Ne pas faire un utilisateur dédié pour la gestion des conteneurs
  • Le fichier de service doit se placer dans /etc/systemd/system et pas dans ~/.config/systemd/user
  • Commande systemctl sans l’option --user
  • Ne pas exécuter loginctl enable-linger en tant que root

Comparaison entre les services système et utilisateur

Résumé des répertoires et commandes utiliseés entre les services système et utilisateur systemd :

x Services système Services d’utilisateurs
Stockage des fichiers d’unité personnalisés /etc/systemd/system/unit.service ~/.config/systemd/user/unit.service
Rechargement des fichiers d’unité # systemctl daemon-reload $ systemctl --user daemon-reload
Démarrage et arrêt d’un service # systemctl start UNIT
# systemctl stop UNIT
$ systemctl --user start UNIT
$ systemctl --user stop UNIT
Démarrage d’un service lors du démarrage de la machine # systemctl enable UNIT $ loginctl enable-linger
$ systemctl --user enable UNIT

Conteneurs lancés au démarrage

La commande loginctl enable-linger permet au service de démarrer en même temps que le système et de rester persistant lorsque l’utilisateur se déconnecte :

$ loginctl show-user john-adm
[...]
Linger=no
$ loginctl enable-linger
$ loginctl show-user john-adm
[...]
Linger=yes

Pour annuler l’opération : loginctl disable-linger.

EMOJI resume cmd

Documentation

MAN loginctl(1)
MAN systemd.unit(5)
MAN systemd.service(5)
MAN subuid(5)
MAN podman-generate-systemd(1)

https://www.youtube.com/watch?v=AGkM2jGT61Y

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/htmlsingle/building_running_and_managing_containers/index

> Partager <