3 : Orchestration Locale avec Docker Compose

3.1. Du CLI au YAML : L’Infrastructure as Code (IaC)

Jusqu’à présent, pour lancer une base de données et une application, nous devions taper deux longues commandes docker run, créer un réseau manuel, et espérer ne pas faire de faute de frappe.

Docker Compose est un outil qui permet de définir et lancer des applications multi-conteneurs. On décrit l’état souhaité dans un fichier docker-compose.yml (format YAML).

Comparaison Directe

Avant (CLI) :

docker network create mon-net
docker run -d --name ma-db --network mon-net -e POSTGRES_PASSWORD=secret postgres
docker run -d -p 8080:80 --network mon-net -e DB_HOST=ma-db my-app

Après (Compose) :

services:
  database:
    image: postgres
    environment:
      POSTGRES_PASSWORD: secret
    # Le réseau est créé automatiquement !

  webapp:
    image: my-app
    ports:
      - "8080:80"
    environment:
      DB_HOST: database # Magie : on utilise le nom du service comme nom d'hôte

Note Modernité : Depuis Docker Compose V2, la commande est docker compose (avec espace) et non plus docker-compose (avec tiret)


3.2. La Magie du Réseau (DNS Interne)

C’est le concept le plus important du jour. Dans un fichier Compose, tous les services sont sur le même réseau par défaut.

Comment l’application web trouve-t-elle la base de données ? Pas besoin d’IP ! Docker intègre un serveur DNS interne.

  • Si le service s’appelle database dans le YAML.

  • L’application peut faire un ping sur database ou se connecter à jdbc:postgresql://database:5432.

  • Docker résout automatiquement database -> 172.x.x.x.

@startuml
!theme sunlust
skinparam componentStyle rectangle

package "Réseau Docker (Bridge par défaut)" {
  [Service: webapp] as Web
  [Service: database] as DB

  note bottom of Web : IP: 172.20.0.3\nCode: connect("database")
  note bottom of DB : IP: 172.20.0.2\nNom DNS: "database"

  Web -> DB : Résolution DNS "database"
}

[Navigateur Hôte] -> Web : Port 8080 (localhost)
@enduml

3.3. Gestion des Volumes et Persistance

Dans Compose, la syntaxe pour les volumes est très lisible.

services:
  db:
    image: mysql
    volumes:
      -db_data:/var/lib/mysql  # Volume nommé (Recommandé pour la DB)

  web:
    image: nginx
    volumes:
      - ./html:/usr/share/nginx/html # Bind Mount (Recommandé pour le code/config)

# Déclaration des volumes nommés en bas de fichier
volumes:
  db_data:

3.4. Commandes Essentielles (Cheatsheet)

Commande Action Analogie
docker compose up -d Crée réseaux, volumes et lance les conteneurs en arrière-plan. “Allumer la maison”
docker compose down Arrête et supprime conteneurs et réseaux. “Raser la maison”
docker compose logs -f Affiche les logs de tous les services agrégés. “Lire tous les journaux intimes”
docker compose ps État des services de la stack. “L’appel des élèves”
docker compose restart Redémarre les services. “Reboot”

3.5. Activité Pratique : “The Broken Stack”

C’est l’heure de mettre les mains dans le cambouis avec un exercice de troubleshooting.

Contexte :

Un stagiaire a essayé de conteneuriser une application WordPress avec MySQL mais il a abandonné. “Rien ne marche”, dit-il.

Le fichier fourni (docker-compose.yml) contient des erreurs volontaires :

# ATTENTION : CE FICHIER CONTIENT DES ERREURS POUR L'EXERCICE
version: '3'
services:
  wordpress:
    image: wordpress:latest
    ports:
      - "80:80"
    depends_on∶
      - db_server
    environment:
      WORDPRESS_DB_HOST: localhost
      WORDPRESS_DB_PASSWORD: root

  db_server:
    image: mysql:5.7
    enviromnent:                   
      MYSQL_ROOT_PASSWORD: root
    volumes:
       ./db_data:/var/lib/mysql