Skip to content
VDS · Docker et conteneurs

Docker Compose : plusieurs services en une seule commande

Comment décrire un ensemble d'application, de base de données et de serveur web dans un seul fichier, le démarrer avec une seule commande et le mettre à jour sans reconstruction manuelle.

Mis à jour le 23 août 2026

Vous pouvez lancer un seul service avec une longue commande docker run. Deux services qui doivent se voir — cela ne fonctionne plus : vous oublierez les paramètres le lendemain. Compose déplace toute la description dans un fichier que vous pouvez lire, modifier et conserver dans un dépôt.

Exemple minimal

Le répertoire /opt/myapp, avec compose.yaml à l'intérieur :

services:
  db:
    image: postgres:17
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: app
    volumes:
      - db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      retries: 5

  app:
    image: ghcr.io/example/app:1.4.2
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    environment:
      DATABASE_URL: postgres://postgres:${DB_PASSWORD}@db:5432/app
    ports:
      - "127.0.0.1:8080:8080"

volumes:
  db-data:

À côté, le fichier .env :

DB_PASSWORD=long-random-password
chmod 600 .env
docker compose up -d
docker compose ps
docker compose logs -f app

Ce qui compte ici

  • Des noms au lieu d'adresses. L'application joint la base de données par le nom db — Compose crée un réseau partagé où les noms de services se résolvent automatiquement. Vous n'avez pas besoin de publier le port de la base de données vers l'extérieur, et vous ne devez pas le faire.
  • restart: unless-stopped. Sans cela, rien ne redémarrera après le redémarrage de la machine.
  • depends_on avec un health check. Un depends_on classique attend seulement que le conteneur démarre, pas que la base de données soit prête à accepter des connexions. L'application démarre trop tôt et plante.
  • Des versions d'images exactes. postgres:17, pas postgres:latest. Avec latest, le prochain pull apportera un jour une version majeure qui n'ouvrira pas les anciennes données.
  • Publication sur 127.0.0.1. N'exposez un port vers l'extérieur qu'à travers un serveur web avec un certificat.

Commandes du quotidien

docker compose up -d          # bring up or apply changes
docker compose down           # stop and remove containers (volumes intact)
docker compose down -v        # ...and remove volumes too
docker compose restart app    # restart one service
docker compose exec app sh    # go inside
docker compose pull && docker compose up -d   # update images
docker compose config         # show final file with substitutions

docker compose config est le meilleur moyen de vérifier le fichier avant de démarrer : il montrera ce à quoi les variables ont été développées et si une indentation a été perdue.

docker compose down -v supprime les volumes ainsi que la base de données. C'est irréversible. Avant toute opération avec -v, assurez-vous d'avoir une copie — voir sauvegardes.

Fichiers d'environnement

Il est pratique de séparer une même stack pour les tests et la production avec des overlays :

docker compose -f compose.yaml -f compose.prod.yaml up -d

Le second fichier ne remplace que les différences : limites de mémoire, ports publiés et niveau de journalisation.

Erreurs courantes

  • Des secrets dans compose.yaml conservé dans un dépôt. Gardez-les dans .env avec des permissions 600 et ne le committez pas.
  • Mélanger docker-compose et docker compose. L'ancienne version v1 ne comprend pas certaines syntaxes et stocke les projets sous des noms différents. Installez le plugin — voir installation de Docker.
  • Des données dans le conteneur au lieu d'un volume. Après docker compose down, elles disparaîtront. Voir volumes.
  • Aucune limite de mémoire. Un service consomme toute la mémoire de la machine, et le noyau tue ses voisins. Voir limites de ressources.