Podman Quadlet : gérer des conteneurs avec systemd sans Docker Compose
Déployez un conteneur Podman avec Quadlet et systemd : fichiers .container, démarrage automatique, logs, mises à jour et dépannage.
Utilisez Quadlet pour gérer avec systemd un petit nombre de conteneurs Podman autonomes, sans ajouter Docker Compose. Un fichier .container décrit le conteneur ; Quadlet génère l’unité systemd correspondante, que vous pilotez ensuite avec les commandes habituelles.
Cette approche convient notamment à une application web, un exporteur de métriques ou un outil interne sur un serveur Linux déjà administré avec systemd. Les directives disponibles dépendent de la version installée : consultez la documentation Podman sur les unités Quadlet avant d’employer une directive moins courante.
Créer un service rootless
Créez un compte de service, par exemple webapp, et connectez-vous avec ce compte. Le mode rootless sépare le conteneur de root, sans dispenser de contrôler les images, les volumes montés et les ports exposés.
mkdir -p ~/.config/containers/systemd
mkdir -p ~/webapp-data
nano ~/.config/containers/systemd/web.container
Le fichier suivant publie Nginx sur le port 8080. Remplacez l’image par celle documentée par votre application.
[Unit]
Description=Serveur web Nginx avec Podman
After=network-online.target
Wants=network-online.target
[Container]
Image=docker.io/library/nginx:alpine
ContainerName=web
PublishPort=8080:80
Volume=%h/webapp-data:/usr/share/nginx/html:Z
[Service]
Restart=always
RestartSec=5
[Install]
WantedBy=default.target
Le nom web.container produit web.service. La notation %h désigne le répertoire personnel de l’utilisateur systemd ; sur un système SELinux, le suffixe :Z relabellise le contenu pour le conteneur.
systemctl --user daemon-reload
systemctl --user enable --now web.service
systemctl --user status web.service
Testez avec curl http://127.0.0.1:8080. Si le port doit être accessible de l’extérieur, vérifiez aussi le pare-feu : publier un port Podman ne modifie pas forcément les règles de filtrage réseau.
Assurer le démarrage après reboot
Un service utilisateur peut s’arrêter à la déconnexion. Pour que le gestionnaire systemd de webapp démarre au boot et reste actif sans session ouverte, activez le linger depuis un compte autorisé à gérer les utilisateurs.
sudo loginctl enable-linger webapp
Contrôlez le résultat avec loginctl show-user webapp -p Linger. Pour un déploiement rootless qui doit redémarrer après un reboot, le linger est indispensable.
Configurer et relier les services
Ajoutez les variables, volumes et réseau dans [Container]. Ne placez pas un secret directement dans le fichier Quadlet : utilisez plutôt un fichier de variables lisible seulement par le compte de service, chargé avec EnvironmentFile=.
[Container]
Image=quay.io/example/application:stable
Environment=APP_ENV=production
EnvironmentFile=%h/.config/webapp/app.env
Volume=%h/webapp-data:/var/lib/application:Z
Network=appnet
Créez d’abord le réseau rootless avec podman network create appnet, puis n’exposez avec PublishPort= que les ports nécessaires. Pour dépendre d’un autre service Quadlet, utilisez son unité générée, par exemple database.service.
[Unit]
Requires=database.service
After=database.service
After= impose l’ordre de lancement, mais ne garantit pas que l’application soit prête à accepter des connexions. Prévoyez donc une nouvelle tentative côté application ou une vérification de disponibilité adaptée.
Exploiter, mettre à jour et dépanner
Consultez d’abord le journal de l’unité, puis son état et les conteneurs connus de Podman. Après toute modification d’un fichier .container, rechargez les générateurs et redémarrez l’unité.
journalctl --user -u web.service -f
systemctl --user status web.service
podman ps --all
systemctl --user daemon-reload
systemctl --user restart web.service
Pour une mise à jour contrôlée, téléchargez l’image puis redémarrez le service. Le conteneur est recréé à partir de l’image locale, tandis que les données du volume hôte sont conservées.
podman pull docker.io/library/nginx:alpine
systemctl --user restart web.service
Podman propose aussi les mises à jour automatiques avec le label io.containers.autoupdate=registry et le timer podman-auto-update.timer. Activez-les seulement avec une politique de versionnement, de supervision et de retour arrière ; une étiquette mutable comme latest rend le contenu déployé moins prévisible.
- Consultez journalctl --user -u web.service -b en cas d’échec au démarrage, notamment pour une image inaccessible, un port occupé ou un montage refusé.
- Vérifiez l’emplacement et le propriétaire du fichier : un Quadlet rootless doit être lisible par l’utilisateur qui exécute systemctl --user.
- Pour un volume bind mount, contrôlez les droits du répertoire hôte et, sur SELinux, le besoin de :Z ou d’un libellé approprié.
- Si le service ne revient pas après reboot, vérifiez le linger et WantedBy=default.target dans [Install].