Podman Quadlet vs Docker Compose pour les services Linux
Choisissez le bon workflow de conteneur.
Docker Compose et Podman Quadlet résolvent des problèmes qui se chevauchent, mais ils proviennent de philosophies de conception différentes. Le choix entre les deux dépend de votre façon de penser : en piles d’applications ou en services Linux.
Cette distinction est importante pour quiconque exécute des conteneurs sur un hôte Linux au-delà d’une simple après-midi d’expérimentation. Compose décrit les services, réseaux et volumes dans un fichier YAML et les démarre avec docker compose up. Quadlet décrit les conteneurs dans des fichiers unitaires de style systemd et laisse le gestionnaire de services du système gérer le cycle de vie.

Les deux approches fonctionnent pour les services auto-hébergés, les outils internes et les petits serveurs. Le bon choix dépend de votre modèle opérationnel, de la familiarité de votre équipe, et de votre préférence pour un format de pile convivial aux développeurs ou pour un modèle de service natif à systemd. Cette comparaison couvre les différences pratiques : formats de fichiers, propriété du cycle de vie, conteneurs sans privilèges root (rootless), journalisation, mises à jour, réseau, sécurité et chemins de migration. Elle fait partie de Outils de développement : Le guide complet des flux de travail modernes.
Recommandation rapide
Utilisez Docker Compose lorsque :
- Vous voulez le flux de travail multi-conteneurs le plus rapide.
- Vous utilisez déjà le Docker Engine.
- Vous partagez des piles avec des développeurs.
- Vous avez besoin d’un
compose.yamlfamilier pour le développement local. - Vous déployez de petits services avec Docker sur un seul hôte.
- Vous utilisez des exemples Compose existants provenant de projets.
Utilisez Podman Quadlet lorsque :
- Vous voulez des services de conteneurs natifs à systemd.
- Vous préférez les conteneurs rootless (sans privilèges root).
- Vous ne voulez pas de démon Docker central.
- Vous exécutez des services de longue durée sur un hôte Linux.
- Vous voulez utiliser
systemctl,journalctl, des minuteries, des dépendances et le démarrage automatique. - Vous construisez un serveur auto-hébergé ou homelab autour de systemd.
- Vous voulez que les conteneurs s’intègrent au modèle de service Linux standard.
La règle pratique :
Docker Compose est meilleur pour les piles d'applications.
Podman Quadlet est meilleur pour les services Linux.
Ce n’est pas une loi. C’est une valeur par défaut utile.
Tableau comparatif
| Domaine | Docker Compose | Podman Quadlet |
|---|---|---|
| Modèle principal | Application multi-conteneurs | Service conteneur géré par systemd |
| Format de fichier | YAML | Fichiers unitaires de type systemd |
| Runtime | Docker Engine | Podman |
| Démon | Utilise le démon Docker | Modèle Podman sans démon |
| Gestionnaire de services | Compose gère le cycle de vie de la pile | systemd gère le cycle de vie |
| Meilleur usage | Piles de dev, bundles d’app, déploiements simples | Services Linux de longue durée |
| Support rootless | Possible, mais ce n’est pas le modèle mental par défaut | Très adapté |
| Journaux | docker compose logs |
journalctl et podman logs |
| Démarrage au boot | Généralement via un wrapper systemd ou une politique de redémarrage | Unité systemd native |
| Mises à jour | docker compose pull && docker compose up -d |
Mise à jour automatique Podman ou workflows systemd |
| Portabilité | Très élevée dans les environnements Docker | Meilleure sur Linux avec systemd |
| Courbe d’apprentissage | Plus facile pour la plupart des développeurs | Plus facile pour les utilisateurs de systemd |
| Exemples d’écosystème | Énorme | Plus petit, mais en croissance |
L’un comme l’autre n’est pas Kubernetes. La plupart des petits services n’ont pas besoin d’un cluster. Ils ont besoin d’une méthode simple et compréhensible pour démarrer, arrêter, mettre à jour, journaliser et récupérer.
Ce que Docker Compose fait bien
Docker Compose est un outil pour définir et exécuter des applications multi-conteneurs. Un fichier Compose typique décrit les services, images, contextes de construction, ports, volumes, réseaux, variables d’environnement, vérifications d’état (health checks), dépendances et profils.
services:
web:
image: nginx:stable
ports:
- "8080:80"
restart: unless-stopped
volumes:
- ./html:/usr/share/nginx/html:ro
redis:
image: redis:7
restart: unless-stopped
L’exécuter :
docker compose up -d
Vérifier l’état :
docker compose ps
Lire les journaux :
docker compose logs -f
L’arrêter :
docker compose down
Compose est direct et productif. Il est particulièrement bon lorsque l’unité de pensée est « cette application possède plusieurs conteneurs ». Pour une référence complète des commandes et motifs Compose, voir la Cheatsheet Docker Compose. Pour les commandes Docker au-delà de Compose — images, volumes, réseaux et nettoyage — voir la Cheatsheet Docker.
Ce que Podman Quadlet fait bien
Podman Quadlet est un moyen de définir des conteneurs Podman en utilisant des fichiers de style systemd. Au lieu d’écrire un service systemd généré à la main, vous écrivez un fichier déclaratif :
[Unit]
Description=Example web container
After=network-online.target
Wants=network-online.target
[Container]
Image=docker.io/library/nginx:stable
PublishPort=8080:80
Volume=/opt/example/html:/usr/share/nginx/html:ro
[Service]
Restart=always
[Install]
WantedBy=multi-user.target
Sauvegardez-le sous /etc/containers/systemd/example.container, puis rechargez systemd :
sudo systemctl daemon-reload
Le démarrer :
sudo systemctl enable --now example.service
Le vérifier :
systemctl status example.service
journalctl -u example.service -f
L’intérêt principal de Quadlet : le conteneur devient un service Linux normal.
La différence philosophique
Docker Compose pense en piles
Compose se demande : Quels services composent cette application ?
Un projet Compose réside généralement près du code de l’application :
myapp/
compose.yaml
.env
app/
db/
Vous démarrez le projet en tant qu’unité :
docker compose up -d
Vous mettez à jour le projet en tant qu’unité :
docker compose pull
docker compose up -d
C’est simple, visible et portable.
Podman Quadlet pense en services
Quadlet se demande : Quels conteneurs cet hôte Linux doit-il exécuter en tant que services ?
Les fichiers Quadlet résident dans des chemins de conteneurs liés à systemd :
/etc/containers/systemd/
~/.config/containers/systemd/
Vous gérez les services générés avec systemd :
systemctl status myapp.service
systemctl restart myapp.service
journalctl -u myapp.service -f
Cela semble plus natif sur un serveur Linux. Pour des motifs de service systemd généraux, voir Exécuter n’importe quel exécutable comme un service sous Linux.
La différence importante : Qui possède le cycle de vie ?
Avec Docker Compose, Compose possède le cycle de vie de l’application. Avec Quadlet, systemd possède le cycle de vie du service.
Cela affecte le comportement au démarrage, l’arrêt, la politique de redémarrage, l’ordonnancement des dépendances, les journaux, la visibilité de l’état, les services utilisateur, les mises à jour, l’intégration avec les minuteries et l’intégration avec d’autres services de l’hôte.
Si vous utilisez déjà systemd pour gérer tout le reste sur l’hôte, Quadlet s’adapte parfaitement. Si vous pensez principalement en termes de piles d’applications, Compose est généralement plus confortable.
Docker Compose sous systemd vs Quadlet
Vous pouvez exécuter Docker Compose en tant que service systemd. C’est souvent un bon motif. Exemple d’unité systemd :
[Unit]
Description=MyApp Docker Compose stack
Requires=docker.service
After=docker.service network-online.target
Wants=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/docker compose up -d --remove-orphans
ExecReload=/usr/bin/docker compose up -d --remove-orphans
ExecStop=/usr/bin/docker compose down
TimeoutStartSec=0
TimeoutStopSec=120
[Install]
WantedBy=multi-user.target
Cela fonctionne bien. Mais c’est toujours un wrapper autour de Compose. systemd démarre la commande Compose, tandis que Docker et Compose gèrent les conteneurs derrière.
Avec Quadlet, la génération d’unités est conçue pour Podman et systemd directement. Vous écrivez des fichiers unitaires orientés conteneurs, et systemd gère les services générés.
La distinction est subtile mais importante :
Docker Compose sous systemd :
systemd gère une commande Compose.
Podman Quadlet :
systemd gère les services conteneurs générés.
Pour un tour détaillé de ce motif, voir Exécuter Docker Compose comme un service Linux avec systemd.
Comparaison des formats de fichiers
YAML Docker Compose
Compose utilise YAML. C’est compact, populaire et facile à partager. C’est aussi sensible à l’indentation et peut devenir désordonné lorsque la pile devient grande.
services:
app:
image: ghcr.io/example/app:1.0.0
restart: unless-stopped
ports:
- "8080:8080"
environment:
APP_ENV: production
volumes:
- app-data:/data
volumes:
app-data:
Fichiers unitaires Quadlet
Quadlet utilise des fichiers de type systemd. Ils sont plus verbeux lorsque vous avez beaucoup de services, mais lisibles si vous comprenez déjà systemd.
[Unit]
Description=Example app container
After=network-online.target
Wants=network-online.target
[Container]
Image=ghcr.io/example/app:1.0.0
PublishPort=8080:8080
Environment=APP_ENV=production
Volume=app-data.volume:/data
[Service]
Restart=always
[Install]
WantedBy=multi-user.target
Et un fichier de volume :
[Volume]
VolumeName=app-data
Sauvegardés en tant que app.container et app-data.volume dans le répertoire système de conteneurs systemd approprié.
Mappage des concepts Docker Compose vers Quadlet
| Concept Compose | Équivalent Quadlet |
|---|---|
services |
Fichiers .container ou .pod plus .container |
volumes |
Fichiers .volume ou montages bind |
networks |
Fichiers .network |
ports |
PublishPort= |
environment |
Environment= ou EnvironmentFile= |
restart |
[Service] Restart= |
depends_on |
systemd After=, Wants=, Requires= |
healthcheck |
Options de vérification d’état Podman |
profiles |
Activation systemd et unités séparées |
docker compose logs |
journalctl -u service et podman logs |
docker compose up -d |
systemctl start service |
docker compose down |
systemctl stop service |
| répertoire du projet | Répertoire d’unités de conteneurs systemd |
La migration est conceptuellement simple mais pas mécanique. Compose décrit une pile. Quadlet décrit des services.
Conteneurs Rootless (Sans privilèges root)
Les conteneurs rootless sont l’une des raisons les plus fortes de regarder Podman et Quadlet.
Avec Docker, de nombreux utilisateurs s’ajoutent au groupe docker. C’est pratique, mais l’accès au démon Docker est un accès hôte puissant. Sur une station de travail personnelle, cela peut être acceptable. Sur des serveurs partagés, cela mérite plus de prudence.
Podman a été conçu avec l’utilisation rootless comme workflow de première classe. Un Quadlet rootless réside sous le répertoire de configuration de l’utilisateur :
~/.config/containers/systemd/whoami.container
Puis gérez-le avec systemd utilisateur :
systemctl --user daemon-reload
systemctl --user enable --now whoami.service
systemctl --user status whoami.service
journalctl --user -u whoami.service -f
Pour permettre au service utilisateur de continuer à tourner après la déconnexion :
sudo loginctl enable-linger "$USER"
C’est un modèle propre pour les services appartenant à l’utilisateur.
Comparaison Rootless
| Domaine | Docker Compose | Podman Quadlet |
|---|---|---|
| Configuration courante par défaut | Démon Docker rootful | Podman amical rootless |
| Modèle de service utilisateur | Possible, mais moins natif | Natif avec systemctl --user |
| Risque d’accès au démon | Le socket Docker est puissant | Pas de démon root central par défaut |
| Liaison de ports bas | Simple en tant que Docker rootful | Nécessite une configuration supplémentaire en mode rootless |
| Intégration à l’hôte | Très courant | Plus natif à Linux |
| Adaptation aux serveurs partagés | Nécessite de la prudence | Très adapté |
Rootless n’est pas magique. Il a des compromis liés au réseau, au comportement privilégié et aux ports bas. Mais pour les services de longue durée appartenant à l’utilisateur, Quadlet est un modèle très élégant.
Démarrage et comportement au boot
Docker Compose
Compose seul ne crée pas de service de boot. Vous vous fiez généralement aux politiques de redémarrage Docker, à un wrapper systemd autour de docker compose up -d, à un script de déploiement ou à un outil de niveau supérieur.
Exemple de politique de redémarrage Compose :
services:
app:
image: example/app:stable
restart: unless-stopped
Un wrapper systemd vous donne un service au niveau de l’hôte. C’est bien, mais c’est toujours un wrapper supplémentaire. Voir Exécuter Docker Compose comme un service Linux avec systemd pour le motif complet.
Podman Quadlet
Quadlet est déjà orienté systemd. Activer au boot :
sudo systemctl enable myapp.service
Pour rootless :
systemctl --user enable myapp.service
sudo loginctl enable-linger "$USER"
Le comportement au boot n’est pas un add-on. C’est le modèle.
Comportement de redémarrage
Compose utilise couramment restart: unless-stopped dans le YAML. Quadlet utilise couramment le comportement de redémarrage systemd :
[Service]
Restart=always
Ou :
[Service]
Restart=on-failure
Cela déplace la logique de redémarrage dans le gestionnaire de services. La préférence : utilisez les politiques de redémarrage Compose/Docker pour les piles Compose, utilisez les politiques de redémarrage systemd pour Quadlet, et ne superposez pas trop de superviseurs. Gardez un propriétaire clair du comportement de redémarrage.
Comparaison de la journalisation
Journaux Docker Compose
docker compose logs -f
docker compose logs -f app
C’est excellent pour les développeurs.
Journaux Quadlet
Les services Quadlet utilisent les journaux systemd :
journalctl -u app.service -f
Pour les unités rootless :
journalctl --user -u app.service -f
Vous pouvez toujours utiliser les journaux Podman :
podman logs -f container-name
Pour les opérations serveur, l’intégration journalctl est un avantage majeur. Vos conteneurs s’insèrent dans le même flux de travail de journalisation que les autres services Linux.
Mises à jour
Mise à jour Docker Compose
Un flux de mise à jour courant :
cd /opt/myapp
docker compose pull
docker compose up -d --remove-orphans
docker image prune -f
Facile à envelopper dans un script :
#!/usr/bin/env bash
set -euo pipefail
cd /opt/myapp
docker compose config --quiet
docker compose pull
docker compose up -d --remove-orphans
docker image prune -f
docker compose ps
Mise à jour Podman Quadlet
Un flux manuel simplifié :
sudo podman pull ghcr.io/example/app:1.0.1
sudo systemctl restart app.service
Ou pour rootless :
podman pull ghcr.io/example/app:1.0.1
systemctl --user restart app.service
Podman peut supporter des workflows de mise à jour automatique lorsque les conteneurs sont configurés avec les bonnes étiquettes et la politique d’image. L’avantage de Quadlet n’est pas que les mises à jour sont toujours plus simples. L’avantage est que les mises à jour sont natives au gestionnaire de services.
Philosophie des mises à jour automatiques
Les mises à jour automatiques sont pratiques. Elles sont aussi un risque. Pour les services homelab à faible risque, les mises à jour automatiques de conteneurs peuvent être acceptables. Pour les bases de données, applications étatiques ou services commerciaux, le flux préféré est :
- Sauvegarder.
- Tirer l’image (pull).
- Recréer ou redémarrer.
- Vérifier l’état.
- Nettoyer plus tard.
Compose rend cela explicite. Quadlet et Podman peuvent le rendre natif à systemd. Aucun des deux outils ne supprime le besoin d’un plan de retour arrière.
Volumes et données persistantes
Volumes Compose
Compose prend en charge les volumes nommés :
services:
db:
image: postgres:16
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
Et les montages bind :
services:
app:
image: example/app
volumes:
- ./config:/config:ro
- ./data:/data
Volumes Quadlet
Quadlet peut utiliser des montages bind :
[Container]
Volume=/opt/app/config:/config:ro
Volume=/opt/app/data:/data
Ou un fichier .volume :
[Volume]
VolumeName=app-data
Puis y faire référence :
[Container]
Volume=app-data.volume:/data
Compose est plus compact pour le stockage au niveau de la pile. Quadlet est plus aligné avec les unités de service gérées indépendamment.
Secrets et fichiers d’environnement
Compose
Compose utilise souvent env_file ou environment dans le YAML. Pour un petit service privé, .env est courant. Pour les systèmes sérieux, traitez .env comme sensible et gardez-le hors de Git.
Quadlet
Quadlet peut utiliser :
[Container]
Environment=APP_ENV=production
EnvironmentFile=/opt/app/app.env
Restreindre les permissions :
chmod 600 /opt/app/app.env
Ni Compose ni Quadlet n’est un système de gestion des secrets complet par lui-même. Ne confondez pas « pas en ligne de commande » avec « sécurisé ».
Réseau
Réseau Compose
Compose crée un réseau de projet par défaut et donne aux services des noms DNS basés sur les noms des services :
services:
app:
image: example/app
depends_on:
- db
db:
image: postgres:16
L’application peut généralement atteindre la base de données à db. Le réseau d’application multi-conteneurs semble naturel. C’est l’un des points forts de Compose.
Réseau Quadlet
Quadlet peut définir des réseaux séparément avec des fichiers .network ou utiliser les options de réseau Podman :
[Network]
NetworkName=appnet
Fichier conteneur :
[Container]
Image=example/app:stable
Network=appnet.network
C’est plus explicite et de type systemd. Pour un ou deux conteneurs, c’est acceptable. Pour une grande pile d’application, Compose est souvent plus facile à lire.
Pods
Podman a un concept de pod natif. Cela importe si vous aimez le modèle mental Kubernetes où plusieurs conteneurs partagent un espace de noms réseau et une limite de cycle de vie. Quadlet prend en charge les fichiers .pod :
[Pod]
PodName=myapp
PublishPort=8080:8080
Un conteneur peut rejoindre ce pod :
[Container]
Image=ghcr.io/example/app:stable
Pod=myapp.pod
Compose n’a pas le même modèle de pod. Il a des services sur des réseaux. Pour la plupart des applications web simples, les réseaux Compose suffisent. Pour les utilisateurs Podman qui aiment le regroupement de type pod, Quadlet est un meilleur match.
Workflows de construction
Compose est généralement meilleur lorsque vous construisez des images dans le cadre du workflow d’application local :
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8080"
Puis :
docker compose up --build
C’est extrêmement pratique pour le développement. Quadlet est généralement meilleur lorsque vous exécutez des images déjà construites en tant que services. Construisez les images avec Podman séparément :
podman build -t localhost/myapp:latest .
Puis référencez l’image :
[Container]
Image=localhost/myapp:latest
Si votre workflow est « modifier le code, reconstruire, redémarrer la pile », Compose gagne. Si votre workflow est « déployer une image connue en tant que service Linux », Quadlet gagne.
Portabilité
Les fichiers Compose sont largement partagés. De nombreux projets open-source fournissent un compose.yaml ou docker-compose.yml. Si un projet dit « lancez ceci avec Docker Compose », vous pouvez généralement démarrer rapidement avec docker compose up -d. C’est un avantage pratique majeur.
Quadlet est portable sur les systèmes qui ont Podman, systemd et une prise en charge Quadlet compatible. C’est une cible plus étroite, mais très bonne pour les serveurs Linux modernes. Quadlet n’est pas le meilleur format pour partager une application avec tous les développeurs possibles. C’est un bon format pour décrire comment un hôte Linux spécifique doit exécuter un service conteneurisé.
Expérience développeur
Docker Compose gagne généralement sur l’expérience développeur. Plus d’exemples, plus de tutoriels, plus de modèles de projet, constructions locales plus faciles, pile en un seul fichier facile, docker compose up familier et forte adéquation pour les dépendances de dev. Un développeur peut lire ceci rapidement :
services:
db:
image: postgres:16
redis:
image: redis:7
app:
build: .
Quadlet peut faire des choses similaires, mais il est plus orienté opérations. Pour le développement local, je commencerais rarement avec Quadlet sauf si l’application elle-même est spécifiquement sur Podman ou systemd.
Expérience opérations
Quadlet gagne souvent sur l’expérience opérations sur un hôte Linux. Raisons :
systemctlnatifjournalctlnatif- Services utilisateur rootless
- Dépendances systemd
- Minuteries systemd
- Comportement de redémarrage systemd
- Pas de démon Docker central
- Meilleure adéquation avec la gestion des services de l’hôte
Un administrateur serveur peut raisonner sur :
systemctl status app.service
journalctl -u app.service -f
systemctl restart app.service
C’est le flux de travail de service Linux normal.
Modèle de sécurité
Notes de sécurité Docker Compose
Docker Compose communique généralement avec le démon Docker. Sur une installation Docker Linux normale, l’accès au socket Docker est puissant. Un utilisateur qui peut contrôler Docker peut souvent monter des chemins d’hôte, exécuter des conteneurs privilégiés ou autrement obtenir un contrôle large de l’hôte. Pour les options d’installation incluant Docker rootless sur Ubuntu, voir Installer Docker sur Ubuntu.
Conseils pratiques :
- N’exposez pas
/var/run/docker.sockà la légère. - Traitez le groupe
dockercomme privilégié. - Évitez les conteneurs privilégiés.
- Évitez les montages d’hôte sauf si nécessaires.
- Gardez les secrets hors de Git.
- Utilisez des tags d’image explicites pour les services importants.
- Révisez les ports publiés.
Notes de sécurité Quadlet
Podman Quadlet s’accorde bien avec les conteneurs rootless et les services systemd utilisateur. Cela peut réduire les risques, surtout sur les hôtes partagés ou les serveurs personnels où les services ne devraient pas nécessiter de démon root.
Conseils pratiques :
- Préférez les services rootless lorsqu’ils conviennent.
- Utilisez des unités utilisateur pour les services appartenant à l’utilisateur.
- Utilisez des unités système uniquement lorsque des privilèges au niveau de l’hôte sont nécessaires.
- Évitez les conteneurs privilégiés inutiles.
- Verrouillez les fichiers d’environnement.
- Réfléchissez attentivement aux montages bind.
Rootless ne signifie pas sans risque. Cela signifie que le rayon d’explosion par défaut peut être plus petit.
Performance
Pour la plupart des services web, outils internes et applications auto-hébergées, la performance n’est pas le facteur décisif. Les différences principales sont opérationnelles, pas la vitesse brute. Choisissez en fonction du modèle de cycle de vie, du modèle de sécurité, de l’intégration à l’hôte, de la familiarité de l’équipe, du processus de mise à jour, des besoins réseau et du flux de travail de débogage.
Si vous choisissez entre Compose et Quadlet uniquement pour la performance, vous optimisez probablement la mauvaise couche.
Modes de défaillance
Modes de défaillance Docker Compose
Problèmes courants :
- Démon Docker ne tournant pas
- Plugin Compose manquant
- Mauvais répertoire de projet
.envnon chargé comme prévu- Ancien binaire
docker-composeutilisé par erreur - Conteneurs non recréés après les changements de configuration
- Conteneurs orphelins laissés après le renommage du service
- Volumes supprimés avec
down -v - Journaux Docker remplissant le disque
- Erreurs de permission du socket Docker
Meilleures corrections :
docker compose config
docker compose ps
docker compose logs -f
docker compose up -d --remove-orphans
Modes de défaillance Podman Quadlet
Problèmes courants :
- Fichier unitaire dans le mauvais répertoire
- Oubli de
systemctl daemon-reload - Utilisation d’unités système lorsque des unités utilisateur étaient intended
- Oubli de
loginctl enable-lingerpour les services rootless - Le tir d’image prend plus de temps que le délai de démarrage systemd
- cgroup v2 non disponible
- Étiquettes SELinux ou permissions de volume
- Le nom du service diffère des attentes du fichier
- Unité réseau ou volume non activée ou référencée correctement
Meilleures corrections :
systemctl status app.service
journalctl -u app.service -f
systemctl daemon-reload
podman ps -a
podman logs container-name
Pour rootless :
systemctl --user status app.service
journalctl --user -u app.service -f
Exemple de migration : Compose vers Quadlet
Commencez avec ce service Compose :
services:
whoami:
image: traefik/whoami:v1.10
restart: unless-stopped
ports:
- "8080:80"
environment:
WHOAMI_NAME: compose-demo
Exécuter avec Compose :
docker compose up -d
Un équivalent Quadlet approximatif :
[Unit]
Description=Whoami demo container
After=network-online.target
Wants=network-online.target
[Container]
Image=docker.io/traefik/whoami:v1.10
PublishPort=8080:80
Environment=WHOAMI_NAME=quadlet-demo
[Service]
Restart=always
[Install]
WantedBy=multi-user.target
Sauvegarder sous /etc/containers/systemd/whoami.container, puis :
sudo systemctl daemon-reload
sudo systemctl enable --now whoami.service
sudo systemctl status whoami.service
L’exemple est facile car c’est un seul conteneur. Une pile Compose plus grande avec des bases de données, réseaux, volumes et étapes de construction nécessite une traduction plus soigneuse.
Liste de contrôle de migration
Avant de passer de Compose à Quadlet, demandez-vous :
[ ] Cette pile est-elle vraiment un ensemble de services d'hôte de longue durée ?
[ ] Les images sont-elles déjà construites et publiées ?
[ ] Ai-je besoin de services rootless ?
[ ] Veux-je des dépendances et minuteries systemd ?
[ ] Les volumes et montages bind sont-ils clairement compris ?
[ ] Les ports sont-ils documentés ?
[ ] Les secrets sont-ils gérés en dehors de Git ?
[ ] Y a-t-il un processus de sauvegarde et de restauration ?
[ ] Puis-je surveiller les journaux via journalctl ?
[ ] Ai-je un chemin de retour arrière ?
Si la plupart des réponses sont oui, Quadlet peut être un bon match. Si la pile est principalement pour le développement local, Compose est probablement encore meilleur.
Quand rester avec Docker Compose
Restez avec Compose lorsque :
- Le projet fournit déjà un bon fichier Compose.
- Vous avez besoin du chemin d’intégration le plus facile.
- Les développeurs exécutent la même pile localement.
- Vous construisez des images pendant le développement.
- Vous voulez un fichier YAML pour les services, volumes et réseaux.
- Vous voulez la compatibilité maximale avec les tutoriels et la communauté.
- Votre wrapper systemd actuel fonctionne bien.
Il n’y a pas de prix pour migrer une pile Compose fonctionnelle vers Quadlet juste parce que Quadlet est plus propre en théorie. Si Compose est ennuyeux et fiable pour votre cas d’utilisation, gardez-le.
Quand passer à Podman Quadlet
Passez à Quadlet lorsque :
- La pile est vraiment un service d’hôte.
- Vous voulez la gestion de services rootless.
- Vous préférez Podman à Docker.
- Vous voulez que systemd possède le cycle de vie.
- Vous voulez des journaux
journalctl. - Vous voulez des dépendances de service.
- Vous voulez des services utilisateur qui survivent à la déconnexion.
- Vous voulez moins d’exposition au démon Docker.
- Vous construisez un hôte d’auto-hébergement autour de systemd.
Quadlet n’est pas « Compose mais meilleur ». C’est un centre de conception différent.
Motifs recommandés
Motif 1 : Développement local
Utilisez Docker Compose. Rapide, familier, portable, facile à reconstruire, facile pour les équipes.
Motif 2 : Auto-hébergement sur un seul hôte
Utilisez l’un ou l’autre. Choisissez Compose si le projet fournit déjà un fichier Compose. Choisissez Quadlet si vous voulez une gestion de service native à systemd. Compose donne un meilleur bundle d’application ; Quadlet donne un meilleur service Linux.
Motif 3 : Service rootless appartenant à l’utilisateur
Utilisez Podman Quadlet. Workflow rootless, gestion de service au niveau utilisateur, pas de démon Docker central.
~/.config/containers/systemd/app.container
systemctl --user enable --now app.service
loginctl enable-linger
Motif 4 : Serveur unique de type production
Utilisez Docker Compose avec un wrapper systemd discipliné, ou utilisez Quadlet si votre équipe est à l’aise avec Podman. Ne choisissez pas par mode. Choisissez en fonction de qui le opérera à 2 heures du matin.
Motif 5 : Plateforme multi-nœuds
N’utilisez ni l’un ni l’autre comme couche d’orchestration finale. Considérez Kubernetes, Nomad, Swarm ou une plateforme gérée. Compose et Quadlet sont d’excellents outils pour un seul hôte. Ce ne sont pas des planificateurs de cluster.
Arbre de décision pratique
Est-ce principalement pour le développement local ?
oui :
utilisez Docker Compose
non :
continuer
Le projet fournit-il déjà un compose.yaml maintenu ?
oui :
utilisez Docker Compose sauf si vous avez une raison forte de migrer
non :
continuer
Voulez-vous des services rootless de longue durée gérés par systemd ?
oui :
utilisez Podman Quadlet
non :
continuer
Voulez-vous la définition d'application multi-conteneurs la plus facile ?
oui :
utilisez Docker Compose
non :
continuer
Voulez-vous que les conteneurs se comportent comme des services Linux normaux ?
oui :
utilisez Podman Quadlet
non :
utilisez Docker Compose
Commandes côte à côte
| Tâche | Docker Compose | Podman Quadlet |
|---|---|---|
| Démarrer | docker compose up -d |
systemctl start app.service |
| Arrêter | docker compose down |
systemctl stop app.service |
| Redémarrer | docker compose restart |
systemctl restart app.service |
| Appliquer les changements | docker compose up -d |
systemctl daemon-reload && systemctl restart app.service |
| Journaux | docker compose logs -f |
journalctl -u app.service -f |
| Statut | docker compose ps |
systemctl status app.service |
| Activer au boot | Wrapper systemd ou politique de redémarrage | systemctl enable app.service |
| Tirer la mise à jour | docker compose pull |
podman pull image |
| Service rootless | possible | naturel avec systemctl --user |
Mécompréhensions courantes
« Quadlet remplace Docker Compose »
Pas exactement. Quadlet remplace certains cas d’utilisation de Compose, surtout les services Linux de longue durée. Il ne remplace pas Compose en tant que format de pile d’application le plus facile pour les développeurs.
« Docker Compose n’est pas prêt pour la production »
Trop large. Compose peut être parfaitement raisonnable pour de petits systèmes de production si vous comprenez les sauvegardes, mises à jour, journalisation, comportement de redémarrage et sécurité de l’hôte. Le problème n’est pas Compose. Le problème est de prétendre qu’un déploiement Compose sur un seul hôte a les mêmes propriétés qu’un orchestrateur de cluster.
« Podman est juste Docker sans le démon »
Trop simple. Podman a des commandes compatibles Docker, mais son centre de conception est différent : opération sans démon, workflows rootless, pods et intégration Linux.
« Rootless signifie sécurisé »
Non. Rootless réduit certains risques. Il ne rend pas les mauvaises images, les secrets exposés, les montages bind non sécurisés ou les applications vulnérables sûrs.
« systemd est trop lourd pour les conteneurs »
systemd est déjà le gestionnaire de services sur la plupart des serveurs Linux grand public. L’utiliser pour gérer des conteneurs de longue durée n’est pas étrange. C’est souvent la chose ennuyeuse et correcte à faire.
Recommandation finale
Utilisez Docker Compose lorsque la pile d’application est la chose principale. Utilisez Podman Quadlet lorsque le service Linux est la chose principale.
Cette distinction est plus utile que de discuter de quel outil est meilleur. Pour les workflows développeurs, Compose est difficile à battre. Il est populaire, lisible, portable et soutenu par d’innombrables projets. Pour les services Linux de longue durée, Quadlet est silencieusement excellent. Il fait sentir les conteneurs comme des services systemd natifs, fonctionne naturellement avec Podman rootless et s’adapte au modèle opérationnel d’un hôte Linux sérieux.
La répartition préférée :
Développement local : Docker Compose
Exemples d'applications portables : Docker Compose
Petites piles auto-hébergées : Docker Compose ou Quadlet
Services utilisateur rootless : Podman Quadlet
Services d'hôte de longue durée : Podman Quadlet
Orchestration multi-nœuds : ni l'un ni l'autre ; utilisez un vrai orchestrateur
Ne migrez pas juste pour être moderne. Migrez lorsque le modèle de cycle de vie est meilleur. Compose est un excellent outil de pile. Quadlet est un excellent outil de service. Le choix intelligent est d’utiliser chacun là où son modèle mental correspond au travail.
Références
- Documentation Podman Quadlet — référence officielle Podman Quadlet
- Documentation Docker Compose — référence officielle Docker Compose
- Exécuter Docker Compose comme un service Linux avec systemd — tour détaillé Compose-comme-systemd sur ce site
- Cheatsheet Docker Compose — référence des commandes et motifs Compose
- Cheatsheet Docker — référence des commandes Docker
- Installer Docker sur Ubuntu — guide d’installation Docker avec alternatives rootless
- Exécuter n’importe quel exécutable comme un service sous Linux — motifs de service systemd généraux
- Outils de développement : Le guide complet des flux de travail modernes — page d’accueil du cluster