Orchestration multi-conteneurs avec Docker Compose

Docker Compose est un outil open-source développé par Docker, conçu pour simplifier la gestion et l’exécution de plusieurs conteneurs simultanément. Il permet de définir et de coordonner des serviecs (conteneurs) au sein d’un projet unique, le tout via un fichier YAML déclaratif. L’objectif est d’éviter de devoir lancer manuellement chaque conteneur avec des commandes docker run répétitives.

Concepts clés

  • Service : un conteneur ou une application (ex. base de données, serveur web).
  • Projet : ensemble de services qui fonctionnent ensemble pour former une application complète.

Installation de Docker Compose

L’installation sous Linux se fait en téléchargeant le binaire et en le rendant exécutable. Comme le site officiel peut être lent, on utilise le miroir chinois DaoCloud :

curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version  # Vérifier l'installation

Structure d'un fichier docker-compose.yml

Le fichier YAML déclare les services, les volumes et les réseaux. Voici les directives les plus courantes :

  • build : construit une image à partir d'un Dockerfile.
  • image : utilise une image existante.
  • ports : mappe les ports (ex. "80:8080", de préférence sous forme de chaîne).
  • volumes : monte des volumes nommés ou des chemins hôtes.
  • networks : attache le service à un réseau défini.
  • depends_on : ordonne le démarrage des services (dépendances).
  • environment ou env_file : définit des variables d’environnement (le fichier .env évite d’exposer des données sensibles).
  • healthcheck : vérifie l’état de santé du conteneur.
  • command : remplace la commande par défaut du conteneur.

Exemple de fichier docker-compose.yml utilisant des services personnalisés (variables et noms modifiés pour l’exemple) :

version: "3.8"

services:
  webapp:
    container_name: frontend-app
    build:
      context: ./web
      dockerfile: Dockerfile.web
    ports:
      - "8080:80"
    volumes:
      - webdata:/var/www/html
    networks:
      - app-net
    depends_on:
      - db
      - cache
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 1m30s
      timeout: 10s
      retries: 3

  db:
    container_name: mysql-db
    image: mysql:8.0
    ports:
      - "3307:3306"
    volumes:
      - dbconf:/etc/mysql
    networks:
      - app-net
    environment:
      - MYSQL_ROOT_PASSWORD=mysecret
    env_file: ./db.env

  cache:
    container_name: redis-cache
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - cachedata:/data
    networks:
      - app-net
    command: "redis-server --appendonly yes"

volumes:
  webdata:
    external: false   # sera créé automatiquement (prefixe = projet_webdata)
  dbconf:
  cachedata:

networks:
  app-net:
    external: false   # réseau créé automatiquement (projet_app-net)

Lorsque external: false, le nom réel du volume ou du réseau est préfixé par le nom du projet. Pour utiliser un volume ou réseau existant, mettre external: true et s’assurer qu’il a été créé au préalable.

Utilisation de build dans Compose

La directive build permet de construire une image à partir d’un Dockerfile avant de lancer le conteneur. Exemple :

version: "3.8"
services:
  custom-centos:
    build:
      context: ./centos
      dockerfile: Dockerfile.centos
    container_name: centos-dev
    networks:
      - dev-net
    command: "/bin/bash"

networks:
  dev-net:
    external: true   # suppose que le réseau 'dev-net' a été créé manuellement

Commandes courantes de Docker Compose

  • docker-compose up : démarre tous les services du projet.
  • docker-compose down : arrête et supprime les conteneurs, réseaux (et volumes si -v).
  • docker-compose ps : liste les conteneurs du projet.
  • docker-compose logs : affiche les logs.
  • docker-compose exec <service> <commande> : exécute une commande dans un service en cours.

Règles de syntaxe YAML

  • Après une clé et avant sa valeur, un espace est obligatoire (ex. version: "3").
  • Les listes sont indentées avec un tiret précédé d’un espace (ex. ports:- "8080:80").
  • Un fichier .env contient des lignes KEY=VALUE sans guillemets.

Étiquettes: Docker Compose YAML orchestration Conteneurs

Publié le 7 juin à 04h11