1. Définition déclarative d’applications complexes

Une application moderne se compose rarement d’un conteneur unique. Docker Compose permet de définir, démarrer et administrer l’ensemble des services d’une architecture multi-tiers (frontal web, API métier, base de données relationnelle, cache mémoire) dans un fichier YAML unique (compose.yaml).

2. Architecture d’une pile applicative de référence

# Fichier : compose.yaml
services:
  reverse-proxy:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - api-service
    networks:
      - frontend-net

  api-service:
    build:
      context: ./backend
      dockerfile: Dockerfile
    environment:
      - DB_HOST=db-postgres
      - DB_NAME=swissdb
      - DB_USER=appuser
      - DB_PASS_FILE=/run/secrets/db_password
    secrets:
      - db_password
    depends_on:
      db-postgres:
        condition: service_healthy
    networks:
      - frontend-net
      - backend-net

  db-postgres:
    image: postgres:16-alpine
    environment:
      - POSTGRES_DB=swissdb
      - POSTGRES_USER=appuser
      - POSTGRES_PASSWORD_FILE=/run/secrets/db_password
    secrets:
      - db_password
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U appuser -d swissdb"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - backend-net

networks:
  frontend-net:
    driver: bridge
  backend-net:
    driver: bridge
    internal: true # Réseau strictement privé sans accès Internet sortant

volumes:
  pgdata:

secrets:
  db_password:
    file: ./secrets/db_password.txt

3. Commandes d’exploitation quotidienne

# Démarrer l'ensemble des conteneurs en arrière-plan (mode détaché)
docker compose up -d

# Visualiser les logs consolidés en temps réel de tous les services
docker compose logs -f --tail=50

# Stopper proprement les conteneurs et libérer les réseaux virtuels
docker compose down

Isolation réseau par conception : Dans l’exemple ci-dessus, la base de données db-postgres est isolée dans le réseau backend-net avec internal: true. Le conteneur reverse-proxy ne peut physiquement pas communiquer avec elle, respectant le principe de segmentation étanche des tiers.