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 (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 :
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 :
$ 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) [...]
Listing des conteneurs :
$ 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 fonctionnent comme des fichiers d’unité systemd courants (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 utilisées 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.
/!\ Résumé des commandes
Commandes :
$ podman generate systemd --name mywebserver // Configurer le service systemd qui créera le conteneur à son démarrage $ podman generate systemd --name mywebserver --new // Configurer le service systemd qui créera le conteneur à son démarrage et le supprimera à son arrêt $ podman generate systemd --name mywebserver --files // Créer le fichier utilisateur systemd dans le répertoire actuel $ podman generate systemd --name mywebserver --new --files // Créer le fichier utilisateur systemd dans le répertoire actuel persistant
// 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
// Rechargement des fichiers d’unité # systemctl daemon-reload // Système $ systemctl --user daemon-reload // Utilisateur
// Démarrage et arrêt d’un service # systemctl start UNIT // Système # systemctl stop UNIT // Système $ systemctl --user start UNIT // Utilisateur $ systemctl --user stop UNIT // Utilisateur
// Démarrage d’un service lors du démarrage de la machine # systemctl enable UNIT // Système $ loginctl enable-linger // Utilisateur $ systemctl --user enable UNIT // Utilisateur
// Démarrer le service en même temps que le système et de rester persistant lorsque l’utilisateur se déconnecte $ loginctl enable-linger $ loginctl disable-linger // Annuler
Fichiers :
// Stockage des fichiers d’unité personnalisés /etc/systemd/system/unit.service // Système ~/.config/systemd/user/unit.service // Utilisateur
Cas pratique
Gestion des conteneurs en tant que services système
But :
Configurer un conteneur pour le gérer en tant que service systemd
Le faire démarrer automatiquement lors du démarrage de la machine hôte
Création d’un compte d’utilisateur appelé cpteservice avec pour mdp P123+ pour exécuter les conteneurs en tant que services systemd.
[aline@SERVER01 ~]$ sudo useradd cpteservice
[aline@SERVER01 ~]$ sudo passwd cpteservice
Pour la gestion des services d’utilisateurs systemd avec le compte cpteservice, il faut se connecter directement en tant qu’utilisateur cpteservice.
Vérification de l’accès au registre registry.localhost.org. Si tout est ok, la commande doit lister certaines images :
[cpteservice@SERVER01 ~]$ podman search ubi NAME DESCRIPTION registry.localhost.org/ubi7/ubi registry.localhost.org/ubi8/ubi registry.localhost.org/ubi9-beta/ubi
Utilisation de l’image registry.localhost.org/rhel8/httpd-24:1-163 pour exécuter un conteneur appelé webapp en mode détaché et Rediriction du port 8080 sur l’hôte local vers le port de conteneur 8080 et montage du répertoire ~/webcontent sur SERVER01 au répertoire /var/www dans le conteneur :
[cpteservice@SERVER01 ~]$ cd ~/.config/systemd/user
Création du fichier d’unité pour le conteneur webapp (l’option --new pour que systemd crée un conteneur lors du démarrage du service et supprime le conteneur lors de l’arrêt du service) :
[cpteservice@SERVER01 user]$ curl http://localhost:8080 Hello World
Vérification que le conteneur est en cours d’exécution :
[cpteservice@SERVER01 user]$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3e996db98071 registry.access.redhat.com/ubi8/httpd-24:1-163 /usr/bin/run-http 3 minutes Up 0.0.0.0:8080->8080/tcp webapp
Utilisation des informations d’ID du conteneur pour vérifier que le daemon systemd crée un conteneur lorsque le service demmare. Arrêt du service container-webapp et le conteneur devrait se supprimer automatiquement :
[cpteservice@SERVER01 user]$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4584b4df514c registry.access.redhat.com/ubi8/httpd-24:1-163 /usr/bin/run-http... 6 seconds ago Up 7 seconds ago 0.0.0.0:8080->8080/tcp webapp
Vérification que les services de l’utilisateur cpteservice démarrent au démarrage du système
Lors du reboot de la machine, le conteneur doit être en cours d’exécution :
[cpteservice@SERVER01 ~]$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6c325bf49f84 registry.access.redhat.com/ubi8/httpd-24:1-163 /usr/bin/run-http... 6 seconds ago Up 9 minutes ago 0.0.0.0:8080->8080/tcp webapp
Accès au contenu Web :
[cpteservice@SERVER01 ~]$ curl http://localhost:8080 Hello World
Exécution des conteneurs
But :
Configurer un conteneur avec un service de BDD MariaDB
Stocke la base de données sur un stockage persistant
Created symlink /home/pod-service/.config/systemd/user/default.target.wants/container-inventorydb.service → /home/pod-service/.config/systemd/user/containerinventorydb.service.
Vérification que le conteneur est en cours d’exécution :
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3ab24e7f000d registry.localhost.org/mariadb-perso:1-86 run-mysqld 7 min Up 0.0.0.0:13306->3306/tcp inventorydb
La commande loginctl enable-linger permet aux services utilisateur de démarrer automatiquement au reboot :
[pod-service@SERVER02 ~]$ loginctl enable-linger
Documentation
MAN loginctl(1) MAN systemd.unit(5) MAN systemd.service(5) MAN subuid(5) MAN podman-generate-systemd(1)