Passer au contenu principal

Compose (Docker)

Introduction à Docker Compose

Docker Compose est l'outil standard pour définir et gérer des applications multi-containers. Depuis Docker 23, Compose v2 est intégré directement comme plugin Docker (docker compose sans tiret). Le format v2 du fichier Compose est la norme actuelle.

Structure d'un fichier Compose

# compose.yml (ou docker-compose.yml, les deux sont reconnus)
services:
  web:
    image: nginx:1.27-alpine
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro
    depends_on:
      api:
        condition: service_healthy

  api:
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      DB_HOST: db
      DB_PORT: 5432
    env_file:
      - .env
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 10s
      timeout: 5s
      retries: 3
    restart: unless-stopped

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: app
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:

Commandes essentielles

# Démarrer tous les services (en arrière-plan)
docker compose up -d

# Reconstruire les images avant de démarrer
docker compose up -d --build

# Voir l'état des services
docker compose ps

# Logs de tous les services
docker compose logs -f

# Logs d'un service spécifique
docker compose logs -f api

# Exécuter une commande dans un service
docker compose exec api bash

# Arrêter sans supprimer
docker compose stop

# Arrêter et supprimer containers + réseaux
docker compose down

# Arrêter et supprimer volumes aussi
docker compose down -v

# Scaler un service (sans Swarm)
docker compose up -d --scale api=3

Variables et .env

# .env (automatiquement chargé par Compose)
POSTGRES_VERSION=16-alpine
APP_PORT=8080
DOMAIN=exemple.fr
services:
  db:
    image: postgres:${POSTGRES_VERSION}
  web:
    ports:
      - "${APP_PORT}:80"
# Vérifier l'interpolation
docker compose config

# Utiliser un fichier .env différent
docker compose --env-file .env.staging up -d

Build depuis Compose

# Construire toutes les images
docker compose build

# Construire un service spécifique avec no-cache
docker compose build --no-cache api

# Build + push vers le registry
docker compose build
docker compose push