1. Qu'est-ce que Docker Compose ?

Docker Compose permet de définir et gérer des applications multi-conteneurs avec un seul fichier YAML. Au lieu de lancer chaque conteneur manuellement avec docker run, vous déclarez toute votre stack dans docker-compose.yml.

# Sans Compose — 4 commandes manuelles
docker network create app-net
docker run -d --name db --network app-net -e POSTGRES_PASSWORD=secret postgres
docker run -d --name redis --network app-net redis:alpine
docker run -d --name api  --network app-net -p 3000:3000 monapi

# Avec Compose — 1 commande
docker compose up -d

2. Structure du fichier docker-compose.yml

# docker-compose.yml
services:
  api:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DB_HOST=db
    depends_on:
      - db
    networks:
      - app-net

  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: myapp
    volumes:
      - pgdata:/var/lib/postgresql/data
    networks:
      - app-net

volumes:
  pgdata:

networks:
  app-net:
    driver: bridge

3. Configuration des services

services:
  webapp:
    # Build depuis un Dockerfile
    build:
      context: ./app
      dockerfile: Dockerfile.prod
      args:
        BUILD_ENV: production

    # Ou utiliser une image existante
    image: nginx:alpine

    container_name: my-webapp
    restart: unless-stopped

    ports:
      - "80:80"
      - "443:443"

    volumes:
      - ./config/nginx.conf:/etc/nginx/nginx.conf:ro
      - static-files:/usr/share/nginx/html

    environment:
      NODE_ENV: production
    env_file:
      - .env

    deploy:
      resources:
        limits:
          memory: 512M
          cpus: '1.0'

4. depends_on & healthcheck

services:
  api:
    depends_on:
      db:
        condition: service_healthy  # attend que db soit healthy
    image: monapi

  db:
    image: postgres:15
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

5. Commandes Docker Compose

docker compose up              # Démarrer (foreground)
docker compose up    -d         # Démarrer en arrière-plan
docker compose up    --build    # Rebuilder les images
docker compose down             # Arrêter et supprimer
docker compose down  -v         # + supprimer les volumes
docker compose ps               # Statut des services
docker compose logs             # Logs de tous les services
docker compose logs  -f api   # Logs du service api
docker compose exec  api bash  # Shell dans le service
docker compose build            # Construire les images
docker compose pull             # Télécharger les images
docker compose restart api    # Redémarrer un service
docker compose scale  api=3   # Scaler à 3 instances

6. Profiles & Override

# Profiles — services optionnels
services:
  app:
    image: monapp

  debug-tools:
    image: busybox
    profiles:
      - debug

# Démarrer avec le profile debug
docker compose --profile debug up

# Override — docker-compose.override.yml (auto-merge)
# docker-compose.yml (base)
services:
  api:
    image: monapi:prod

# docker-compose.override.yml (dev, appliqué en plus)
services:
  api:
    image: monapi:dev
    volumes:
      - ./src:/app/src  # hot reload