← Retour au portail

Fiche 8 - Docker Compose — Déploiement multi-services

Utiliser Docker Compose pour définir et orchestrer plusieurs conteneurs avec un fichier docker-compose.yml.

Intermédiaire — SISR 2ème année ⏱️ 20 min 📁 Virtualisation

🎯 Objectifs de la fiche

  1. Principe de Docker Compose — Fichier docker-compose.yml, services, réseaux
  2. Structure du fichier compose — services, volumes, networks, environnement
  3. Commandes Docker Compose — up, down, ps, logs, exec
  4. Exemples pratiques — App web + base de données, WordPress
  5. Bonnes pratiques — Variables d'environnement, .env, healthcheck

Prérequis

Docker installé et maîtrisé (voir fiche 7). Connaître les bases des conteneurs (images, volumes, réseaux).

1. Principe de Docker Compose

Docker Compose permet de définir et gérer des applications multi-conteneurs dans un seul fichier YAML (docker-compose.yml). Au lieu de lancer plusieurs commandes docker run, une seule commande docker compose up démarre tous les services définis.

Sans ComposeAvec Compose
docker run -d --name db ...docker compose up -d
docker run -d --name app ...(démarre tous les services)
docker run -d --name nginx ...(dans l'ordre et avec les dépendances)
3 commandes à mémoriser + options1 fichier YAML versionnable

2. Structure du fichier docker-compose.yml

# Structure générale
services:
  nom-service:
    image: image:tag         # Image Docker à utiliser
    build: .                 # Ou construire depuis un Dockerfile
    container_name: nom      # Nom du conteneur
    ports:
      - "port_hote:port_conteneur"
    environment:
      - VARIABLE=valeur
    env_file:
      - .env                 # Variables depuis un fichier
    volumes:
      - /hote:/conteneur
      - nom-volume:/chemin
    networks:
      - nom-reseau
    depends_on:
      - autre-service        # Démarrer après ce service
    restart: unless-stopped  # Politique de redémarrage

volumes:
  nom-volume:

networks:
  nom-reseau:

3. Exemple concret — App web + MariaDB

# docker-compose.yml
services:
  db:
    image: mariadb:11
    container_name: mariadb
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: appdb
      MYSQL_USER: appuser
      MYSQL_PASSWORD: apppass
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - app-network

  app:
    image: php:8.2-apache
    container_name: webapp
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - ./src:/var/www/html
    depends_on:
      - db
    networks:
      - app-network

volumes:
  db-data:

networks:
  app-network:
    driver: bridge

4. Exemple WordPress + MariaDB

# docker-compose.yml — WordPress complet
services:
  db:
    image: mariadb:11
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
    volumes:
      - wp-db:/var/lib/mysql

  wordpress:
    image: wordpress:latest
    restart: unless-stopped
    ports:
      - "80:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp-content:/var/www/html
    depends_on:
      - db

volumes:
  wp-db:
  wp-content:
# Fichier .env (même répertoire que docker-compose.yml)
DB_PASSWORD=MotDePasseSecurise!
DB_ROOT_PASSWORD=RootSecurise!

5. Commandes Docker Compose essentielles

CommandeAction
docker compose up -dDémarrer tous les services en arrière-plan
docker compose up -d --buildRebuilder les images et démarrer
docker compose downArrêter et supprimer les conteneurs
docker compose down -vArrêter + supprimer volumes (attention : perd les données)
docker compose psLister les services et leur état
docker compose logsVoir les logs de tous les services
docker compose logs -f appSuivre les logs du service app
docker compose restart appRedémarrer un service spécifique
docker compose exec app bashOuvrir un shell dans le service app
docker compose pullMettre à jour les images
docker compose configValider et afficher la config finale
# Démarrage complet d'une application
mkdir monapp && cd monapp
nano docker-compose.yml     # créer le fichier
nano .env                   # créer les variables

docker compose config       # valider la syntaxe
docker compose up -d        # démarrer
docker compose ps           # vérifier l'état
docker compose logs -f      # voir les logs

6. Bonnes pratiques

Bonne pratiqueExplication
Utiliser .envNe jamais mettre les mots de passe directement dans docker-compose.yml
Ajouter .env au .gitignoreNe pas committer les secrets dans Git
Nommer les volumesLes volumes nommés sont plus faciles à gérer que les bind mounts
Utiliser depends_onGarantir l'ordre de démarrage des services
Tagger les imagesEviter :latest en production — utiliser une version précise (ex: nginx:1.25)
restart: unless-stoppedAssure la reprise automatique après un reboot du serveur
Que fait la directive depends_on dans Docker Compose ?
  • Installe les dépendances du service
  • Attend que le service listé soit en bonne santé avant de démarrer
  • Définit l'ordre de démarrage des services
  • Partage les variables d'environnement entre services

✅ Réponse : Définit l'ordre de démarrage des services

Quelle commande démarre tous les services en arrière-plan ?
  • docker compose start -d
  • docker compose up -d
  • docker compose run --all
  • docker-compose launch

✅ Réponse : docker compose up -d

Que fait docker compose down -v ?
  • Affiche les logs de tous les services
  • Arrête les conteneurs et supprime les volumes nommés
  • Arrête les conteneurs uniquement
  • Met à jour les images

✅ Réponse : Arrête les conteneurs et supprime les volumes nommés

Pourquoi utiliser un fichier .env avec Docker Compose ?
  • Pour accélérer le démarrage des conteneurs
  • Pour éviter de mettre les secrets directement dans docker-compose.yml
  • Pour définir les ports d'exposition
  • C'est obligatoire pour Docker Compose v2

✅ Réponse : Pour éviter de mettre les secrets directement dans docker-compose.yml

Comment deux services Docker Compose communiquent-ils entre eux ?
  • Via l'IP de l'hôte
  • Par leur nom de service (ex: db, app) sur le même réseau Compose
  • Via localhost:port
  • Ils ne peuvent pas communiquer directement

✅ Réponse : Par leur nom de service (ex: db, app) sur le même réseau Compose