← Retour au portail

Module V7 – Docker Compose

📘 Fiche de cours ⏱️ 2h30 🎯 Bloc 4 – Virtualisation
Objectifs : maîtriser l’orchestration de conteneurs avec Docker Compose, définir des services en YAML, gérer réseaux et volumes, déployer une application multi‑conteneurs.

📖 Introduction

Docker Compose est un outil permettant de définir et de lancer des applications multi‑conteneurs Docker. Grâce à un fichier docker-compose.yml, vous pouvez décrire l’ensemble des services (conteneurs), leurs images, leurs ports, leurs variables d’environnement, leurs volumes et leurs dépendances. Un simple docker compose up déploie toute l’application de manière reproductible.

📌 Évolution récente : Depuis la version 2.0 de Docker Compose (intégrée à Docker Engine), la directive version n’est plus obligatoire. Vous pouvez commencer directement par services: ou utiliser --- (début d’un document YAML). Les exemples ci‑dessous utilisent la syntaxe moderne, sans la ligne version.
🎯

À l'issue de ce module, vous serez capable de :

  • Comprendre la structure d’un fichier docker-compose.yml moderne.
  • Définir des services, des réseaux et des volumes.
  • Utiliser les commandes essentielles de Docker Compose.
  • Déployer une application LAMP / WordPress en quelques minutes.

🔍 Qu'est-ce que Docker Compose ?

Docker Compose est un outil d’orchestration simple qui permet de gérer des applications composées de plusieurs conteneurs.

  • Déclaratif : on décrit l’état souhaité dans un fichier YAML.
  • Reproductible : le même fichier fonctionne sur n’importe quel hôte Docker.
  • Unifié : on gère l’ensemble des services en une seule commande.

📐 Structure du fichier docker-compose.yml

⚠️ Syntaxe moderne : La directive version est optionnelle. Si vous utilisez une version récente de Docker Compose (≥ 2.0), vous pouvez omettre la ligne version: et commencer directement par services: ou par ---.
SectionRôleExemples
ServicesDéfinition des conteneurs (nom, image, ports, variables...).web: image: nginx:latest
NetworksRéseaux personnalisés pour isoler les services.app-network
VolumesVolumes nommés pour persister les données.db-data

🛠️ Syntaxe YAML – rappel

  • Indentation : 2 espaces (pas de tabulations).
  • Listes : préfixées par un -.
  • Clés/valeurs : séparées par : suivi d’un espace.
  • Début de fichier : --- est facultatif mais recommandé pour les puristes YAML.

🧪 Exemple complet – Stack WordPress

docker-compose.yml (syntaxe moderne, sans version)

services:
  db:
    image: mysql:8.0
    container_name: wordpress_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppass
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - wp-network

  wordpress:
    image: wordpress:latest
    container_name: wordpress_app
    restart: always
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppass
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp-data:/var/www/html
    networks:
      - wp-network
    depends_on:
      - db

volumes:
  db-data:
  wp-data:

networks:
  wp-network:
  • db : service MySQL, avec variables d’environnement et volume pour persister les données.
  • wordpress : service WordPress, exposé sur le port 8080 de l’hôte.
  • depends_on : assure que la base de données démarre avant WordPress.
  • volumes nommés : db-data et wp-data persistent entre les redémarrages.
  • réseau : les deux services communiquent via wp-network.
  • Absence de version : syntaxe compatible avec les versions récentes de Docker Compose.

📋 Commandes essentielles

CommandeDescription
docker compose up -dLance tous les services en arrière‑plan.
docker compose downArrête et supprime les conteneurs, réseaux (et volumes si -v).
docker compose logs -fAffiche les logs en temps réel.
docker compose psListe les conteneurs du projet.
docker compose exec <service> bashOuvre un shell dans un conteneur.
docker compose restartRedémarre tous les services.

📂 Gestion des volumes et réseaux

  • Volumes nommés : persistance indépendante du cycle de vie des conteneurs.
  • Bind mounts : montage de répertoires locaux (./html:/var/www/html).
  • Réseau par défaut : Compose crée un réseau <nom_projet>_default.
  • Réseaux personnalisés : permettent de segmenter les services (frontend vs backend).

🧪 Mise en pratique

1. Créer un projet Docker Compose

mkdir ~/mon-projet-compose
cd ~/mon-projet-compose
nano docker-compose.yml

Collez l’exemple ci‑dessus, puis lancez :

docker compose up -d

Accédez à http://localhost:8080 pour voir WordPress.

2. Ajouter un service phpMyAdmin

phpmyadmin:
  image: phpmyadmin/phpmyadmin
  container_name: wordpress_phpmyadmin
  restart: always
  ports:
    - "8081:80"
  environment:
    PMA_HOST: db
    PMA_PORT: 3306
  networks:
    - wp-network
  • PMA_HOST: db : se connecte à la base via le service db.
  • PMA_PORT: 3306 : port par défaut de MySQL.
  • Le réseau wp-network est partagé avec la base et WordPress.

📝 Exercices d'application

Exercice 1 – Analyse de fichier Compose

Dans l’exemple WordPress, quel est le rôle du champ depends_on ?

depends_on définit l’ordre de démarrage des services. Ici, WordPress ne démarre que si la base db est déjà lancée.

Exercice 2 – Ajout de service

Comment ajouter un service Redis à une stack existante ?

redis:
  image: redis:alpine
  container_name: app_redis
  restart: always
  networks:
    - wp-network

🎯 Quiz d'auto‑évaluation

1. Le fichier docker-compose.yml utilise la syntaxe YAML.

2. La commande docker compose up -d lance les conteneurs en arrière‑plan.

3. La section volumes permet de définir des volumes nommés.

4. La directive ports: - "8080:80" expose le port 80 du conteneur sur le port 8080 de l’hôte.

5. La commande docker compose down supprime les conteneurs, les réseaux, mais pas les volumes par défaut.

6. La ligne version: est obligatoire dans tous les fichiers docker-compose.yml.

📚 Ressources