Docker Compose

Section INF (All)

Docker Compose

Comprendre la structure d’un fichier Compose
Connaître les éléments top level
Savoir définir des services et leurs dépendances
Découvrir les bonnes pratiques et commandes clés

Qu’est-ce que Docker Compose ?

Un outil pour déclarer et piloter une stack multi-conteneurs avec un seul fichier.

Fichier de configuration YAML lisible et versionnable.

5 éléments top level principaux:

  • services

  • networks

  • volumes

  • secrets

  • configs

Que signifie top level dans un YAML ?

L’indentation définit la hiérarchie.
Un top level est un élément sans indentation.

Exemple:

services:        # top level
  web:           # 2e niveau
    image: nginx
volumes:         # top level
networks:        # top level

Anatomie d’un service

Champs fréquents dans services.<nom>:

  • image ou build

  • command, entrypoint, user

  • ports

  • environment

  • volumes

  • networks

  • depends_on

  • healthcheck

  • restart

Exemple minimal:

services:
  web:
    image: nginx:1.27
    ports:
      - "8080:80"

Définir une image via Dockerfile

services:
  api:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        APP_ENV: dev
    environment:
      - APP_ENV=dev

Volumes: bind vs named

Bind mount: monte un dossier hôte tel quel.

services:
  web:
    volumes:
      - ./site:/usr/share/nginx/html:ro

Named volume: stocke des données Docker gérées par le daemon.

services:
  db:
    image: postgres:15
    volumes:
      - dbdata:/var/lib/postgresql/data

volumes:
  dbdata:

Usage

  • Bind pour le dev

  • Named pour la persistance

Réseaux

services:
  web:
    image: nginx
    networks: [frontnet]
  api:
    image: myapi
    networks: [frontnet, backnet]
  db:
    image: postgres:15
    networks: [backnet]

networks:
  frontnet: 
  backnet:
    driver: bridge
    internal: true
    ipam:
      config:
        - subnet: 192.168.17.0/24

Dépendances et ordre de démarrage

depends_on gère l’ordre de lancement, pas la disponibilité.

services:
  app:
    depends_on:
      - db

Attendre que le service soit healthy:

services:
  app:
    depends_on:
      db:
        condition: service_healthy
  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: secret
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 2s
      retries: 10

Healthcheck

But: donner un signal healthy à l’orchestrateur.

services:
  web:
    image: nginx:1.27
    healthcheck:
      test: ["CMD", "wget", "-qO-", "http://127.0.0.1"]
      interval: 10s
      timeout: 2s
      retries: 3

Secrets et configs

Local Compose: - secrets et configs montés depuis des fichiers.

Swarm: - intégration native avec gestionnaire de secrets.

services:
  app:
    image: myapp
    secrets:
      - api_key
secrets:
  api_key:
    file: ./secrets/api_key.txt

Variables et .env

Expansion des variables dans le YAML:

services:
  api:
    image: myapi:${API_TAG:-latest}
    environment:
      - API_URL=${API_URL}

Fichier .env au même répertoire que le compose.
Ordre de résolution: 1. Variables du shell 2. .env 3. Valeur par défaut :-

Que signifie external ?

services:
  web:
    image: nginx
    networks:
      - frontnet

networks:
  frontnet:
    external: true
    name: my-existing-network

external permet de lier le docker compose à une ressource déjà existante.

Commandes utiles

docker compose up -d              # créer et démarrer
docker compose down -v            # arrêter et supprimer tout
docker compose ps                 # état des services
docker compose logs -f web        # suivre les logs
docker compose restart api        # redémarrer un service
docker compose build --no-cache   # rebuilder

Exemple complet: web + api + db

Exemple complet