Polarys
Docker & conteneurs/Docker Compose

Docker Compose

Docker Compose en pratique

Docker Compose en pratique

Au-delà des bases, Docker Compose offre des fonctionnalités pour les environnements de développement et de production.

Overrides et environnements multiples

# Fichiers par défaut chargés automatiquement
compose.yml              # configuration de base
compose.override.yml     # surcharges développement (chargé automatiquement)

# Fichiers explicites pour d'autres environnements
docker compose -f compose.yml -f compose.prod.yml up -d
# compose.yml (base commune)
services:
  web:
    image: mon-app:${APP_VERSION:-latest}
    environment:
      - LOG_LEVEL=info

# compose.override.yml (développement, chargé automatiquement)
services:
  web:
    build: .          # construire localement en dev
    volumes:
      - .:/app        # bind mount pour hot reload
    environment:
      - LOG_LEVEL=debug
    ports:
      - "8000:8000"

# compose.prod.yml (production)
services:
  web:
    restart: always
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M

Scaling et ressources

# Lancer plusieurs instances d'un service (sans ports fixes)
docker compose up -d --scale worker=3

# Voir l'état avec les replicas
docker compose ps

Inspecter et déboguer

# Voir la config effective (variables résolues)
docker compose config

# Valider le fichier compose.yml
docker compose config --quiet && echo "OK" || echo "Erreur"

# Voir les images utilisées
docker compose images

# Voir l'utilisation des ressources
docker stats $(docker compose ps -q)

Cas concret : environnement de développement complet

# compose.yml pour une app Node.js + PostgreSQL + Redis + maildev
services:
  app:
    build: .
    volumes:
      - .:/app
      - /app/node_modules        # exclure node_modules du bind mount
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgresql://dev:dev@db/devdb
      REDIS_URL: redis://redis:6379
      SMTP_HOST: maildev
      SMTP_PORT: 1025
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: dev
      POSTGRES_PASSWORD: dev
      POSTGRES_DB: devdb
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "dev"]
      interval: 3s
      retries: 10

  redis:
    image: redis:7-alpine

  maildev:
    image: maildev/maildev
    ports:
      - "1080:1080"    # Interface web pour voir les emails

volumes:
  pgdata:
docker compose up -d
# App : http://localhost:3000
# Emails interceptés : http://localhost:1080
# Pas d'email réel envoyé en développement

Erreurs fréquentes

  • node_modules dans le bind mount : monter .:/app écrase le node_modules installé dans l'image avec celui (vide) du dossier local. Solution : ajouter un volume anonyme sur /app/node_modules.
  • docker compose config affiche des erreurs de variable : vérifier que toutes les variables ${VAR} ont une valeur dans .env ou une valeur par défaut ${VAR:-defaut}.
  • Ordre de démarrage des services : sans depends_on + healthcheck, l'application peut démarrer avant que la base de données soit prête.

À retenir

  • compose.override.yml → surcharges développement automatiques.
  • -f compose.yml -f compose.prod.yml → config production explicite.
  • docker compose config → vérifier la config effective avant de lancer.
  • Volumes anonymes (- /app/node_modules) → protéger les dossiers gérés par l'image.

Quiz de validation

Quiz - 2 questions

1. Pourquoi ajouter un volume anonyme /app/node_modules quand on monte . en bind mount ?

2. Comment valider la syntaxe d'un fichier compose.yml avant de le lancer ?

Suis ta progression

Crée un compte gratuit pour suivre ta progression et accéder à toutes les leçons.