Déployer une stack avec Docker Compose

2 min de lecture07 novembre 2026

Docker Compose décrit plusieurs conteneurs dans un seul fichier et les démarre ensemble. Pour une application web avec sa base de données, c'est plus lisible qu'une suite de commandes docker run. Cet exemple déploie une application Node.js et PostgreSQL, garde les données dans un volume et n'expose que l'application à Nginx.

Structure des fichiers

Travaillez dans /srv/app, avec un utilisateur de déploiement :

Bash
sudo mkdir -p /srv/app
sudo chown deploy:www-data /srv/app

Le dossier contient compose.yaml, le Dockerfile de l'application et un fichier .env en chmod 600. Le .env n'entre jamais dans Git. L'application écoute sur 0.0.0.0 et lit son port dans process.env.PORT.

Le fichier compose.yaml

YAML
services:
  app:
    build: .
    restart: unless-stopped
    env_file: .env
    ports:
      - "127.0.0.1:3000:3000"
    depends_on:
      db:
        condition: service_healthy

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

volumes:
  db-data:

La clé version n'est plus nécessaire. ports lie l'application à 127.0.0.1 uniquement : Nginx fera le proxy. La base n'a pas de ports, donc elle n'est joignable que par le réseau Compose. depends_on avec condition: service_healthy attend que PostgreSQL réponde. Le volume nommé db-data survit à docker compose down.

Variables et secrets

.env contient POSTGRES_PASSWORD et les variables applicatives. compose.yaml y fait référence avec ${POSTGRES_PASSWORD}. docker compose config affiche la configuration résolue et signale une variable manquante avant le démarrage.

Les variables restent visibles via docker inspect et dans l'environnement du conteneur. Pour un secret très sensible, utilisez les secrets Compose ou un gestionnaire externe. Ne commitez jamais .env, même dans un dépôt privé.

Démarrer et vérifier

Bash
docker compose config
docker compose up -d --build
docker compose ps
docker compose logs -f app
curl -I http://127.0.0.1:3000/

up -d construit l'image si nécessaire, crée le réseau et démarre les services. ps doit montrer l'application en running et la base en healthy. Un conteneur qui redémarre en boucle se diagnostique avec logs, pas en répétant restart. Testez ensuite le domaine à travers Nginx.

Mettre à jour et sauvegarder

Bash
docker compose pull
docker compose up -d
docker compose exec -T db pg_dump -U app app | gzip > /var/backups/app-$(date +%F).sql.gz

Épinglez postgres:17 plutôt que latest pour maîtriser les montées de version. docker compose down -v supprime les volumes et donc les données : ne l'utilisez jamais par réflexe. Avant une mise à jour majeure, sauvegardez le volume et testez la restauration dans un autre répertoire ou sur un VPS de test.

Publicité

Cet article vous a-t-il aidé ?

À lire aussi