Podman Quadlet vs Docker Compose pour les services Linux

Choisissez le bon workflow de conteneur.

Sommaire

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.

configuration docker compose

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.yaml familier 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 :

  1. Sauvegarder.
  2. Tirer l’image (pull).
  3. Recréer ou redémarrer.
  4. Vérifier l’état.
  5. 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 :

  • systemctl natif
  • journalctl natif
  • 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 docker comme 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
  • .env non chargé comme prévu
  • Ancien binaire docker-compose utilisé 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-linger pour 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

S'abonner

Recevez de nouveaux articles sur les systèmes, l'infrastructure et l'ingénierie IA.