Polarys
Docker & conteneurs/Docker Compose

Docker Compose

Orchestrer avec Docker Compose

Orchestrer avec Docker Compose

docker run fonctionne pour un seul conteneur. Dès que l'on a plusieurs services (web + base de données + cache), Docker Compose simplifie la gestion de l'ensemble.

Le fichier compose.yml

# compose.yml (anciennement docker-compose.yml)
services:
  web:
    build: .                    # construire l'image depuis le Dockerfile local
    ports:
      - "8000:8000"
    environment:
      - DATABASE_URL=postgresql://user:pass@db/myapp
      - REDIS_URL=redis://cache:6379
    depends_on:
      db:
        condition: service_healthy
    networks:
      - app-net

  db:
    image: postgres:16
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: myapp
    volumes:
      - postgres-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d myapp"]
      interval: 5s
      timeout: 5s
      retries: 5
    networks:
      - app-net

  cache:
    image: redis:7-alpine
    networks:
      - app-net

volumes:
  postgres-data:

networks:
  app-net:
    driver: bridge

Commandes essentielles

# Démarrer tous les services (rebuild si nécessaire)
docker compose up -d

# Forcer le rebuild des images
docker compose up -d --build

# Voir les logs de tous les services
docker compose logs -f

# Voir les logs d'un service spécifique
docker compose logs -f web

# Voir l'état des services
docker compose ps

# Arrêter les services (conteneurs conservés)
docker compose stop

# Arrêter et supprimer les conteneurs
docker compose down

# Arrêter, supprimer conteneurs ET volumes
docker compose down -v   # ⚠️ supprime les données !

# Exécuter une commande dans un service
docker compose exec web bash
docker compose exec db psql -U user -d myapp
graph LR
    U[Utilisateur
:8000]
    W[web
FastAPI/Django]
    D[db
PostgreSQL :5432]
    C[cache
Redis :6379]

    U -->|HTTP| W
    W -->|SQL| D
    W -->|cache| C

Variables d'environnement avec .env

# Fichier .env (ne pas commiter !)
POSTGRES_PASSWORD=supersecret
POSTGRES_USER=myapp
APP_SECRET_KEY=changeme

# compose.yml référence les variables
environment:
  POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}

Cas concret : stack WordPress complète

services:
  wordpress:
    image: wordpress:latest
    ports:
      - "80:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wp
      WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp-content:/var/www/html/wp-content
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
    volumes:
      - db-data:/var/lib/mysql

volumes:
  wp-content:
  db-data:
# Lancer WordPress en 30 secondes
echo "DB_PASSWORD=secret123
DB_ROOT_PASSWORD=root123" > .env
docker compose up -d

Erreurs fréquentes

  • depends_on sans healthcheck : depends_on: db attend que le conteneur db démarre, pas que PostgreSQL soit prêt à accepter des connexions. Utiliser condition: service_healthy avec un healthcheck.
  • Commiter .env : le fichier .env contient des secrets. Toujours l'ajouter à .gitignore.
  • docker compose down -v en production : ce flag supprime les volumes → perte des données de base de données.

À retenir

  • compose.yml → déclare services, volumes, réseaux en YAML.
  • docker compose up -d → démarrer. docker compose down → arrêter.
  • depends_on + healthcheck → attendre que le service soit vraiment prêt.
  • .env → secrets hors du compose.yml, dans .gitignore.

Quiz de validation

Quiz - 2 questions

1. Quelle est la limitation de depends_on sans condition: service_healthy ?

2. Quelle commande Compose supprime les conteneurs ET les volumes nommés ?

Suis ta progression

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