Retour au cours

docker compose : orchestrer plusieurs services

Objectifs

  • Comprendre la nécessité d’orchestrer plusieurs conteneurs pour une application complète.
  • Écrire un fichier docker-compose.yml simple pour définir plusieurs services.
  • Lancer et arrêter une application multi-conteneurs avec docker compose up et docker compose down.
  • Comprendre comment les services communiquent entre eux grâce au réseau automatique de Compose.

Pourquoi Docker Compose ?

Une application réelle est rarement un seul conteneur. Elle est souvent composée de plusieurs services qui doivent fonctionner et communiquer ensemble : un serveur web, une base de données, un cache, etc.

Lancer et configurer chaque conteneur manuellement avec de longues commandes docker run devient vite complexe et sujet à erreurs.

Docker Compose est l’outil qui résout ce problème. Il vous permet de définir et de gérer tous les services de votre application dans un seul fichier de configuration au format YAML.

Le fichier docker-compose.yml

C’est le fichier central qui décrit votre application. Il définit les services, leurs images, les ports, les volumes, les réseaux, etc.

Exemple : Un site web avec une base de données

Imaginons une application web simple (par exemple, un WordPress) qui a besoin d’une base de données (PostgreSQL).

Fichier docker-compose.yml :

# version: '3.8' # La version est maintenant souvent optionnelle
services:
  # Le premier service : notre application web
  web:
    # On pourrait construire notre propre image avec 'build: .'
    # Ici, on utilise une image WordPress existante pour l'exemple
    image: wordpress:latest
    ports:
      # On mappe le port 8080 de notre machine sur le port 80 du conteneur
      - "8080:80"
    environment:
      # On passe des variables d'environnement pour configurer la connexion à la base de données
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: mon_mot_de_passe_secret
      WORDPRESS_DB_NAME: wordpress
    # Ce service dépend du service 'db' et ne démarrera qu'après lui
    depends_on:
      - db

  # Le deuxième service : la base de données
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: wordpress
      POSTGRES_USER: wordpress
      POSTGRES_PASSWORD: mon_mot_de_passe_secret
    volumes:
      # On monte un volume pour que les données de la DB persistent
      # même si le conteneur est supprimé.
      - db_data:/var/lib/postgresql/data

# Définition des volumes nommés
volumes:
  db_data:

Le réseau automatique

Un des grands avantages de Docker Compose est qu’il crée automatiquement un réseau privé pour votre application. Tous les services définis dans le même fichier peuvent communiquer entre eux en utilisant simplement leur nom de service comme nom d’hôte.

Dans l’exemple ci-dessus, le service web peut se connecter à la base de données à l’adresse db:5432.

Commandes essentielles

  • docker compose up : Crée (si nécessaire) et démarre tous les services définis dans le docker-compose.yml.
    • Ajoutez -d pour lancer en mode détaché (en arrière-plan).
  • docker compose down : Arrête et supprime les conteneurs, les réseaux et (optionnellement) les volumes créés par up. C’est le moyen propre de tout nettoyer.
  • docker compose ps : Liste les conteneurs de votre application.
  • docker compose logs <nom_service> : Affiche les logs d’un service spécifique.
    • Ajoutez -f pour suivre les logs en temps réel.
  • docker compose exec <nom_service> <commande> : Exécute une commande à l’intérieur d’un conteneur en cours d’exécution. docker compose exec db psql -U wordpress

Bonnes pratiques

  • Utilisez Docker Compose pour tous vos environnements de développement locaux. C’est le moyen le plus simple de s’assurer que tous les développeurs travaillent avec la même pile de services.
  • Séparez la configuration de l’application. Utilisez des variables d’environnement et un fichier .env pour ne pas écrire de secrets (mots de passe, clés d’API) en dur dans votre docker-compose.yml.
  • Utilisez des volumes nommés pour la persistance des données.

Exercices

  1. Créez votre premier docker-compose.yml :

    • Créez un nouveau dossier.
    • À l’intérieur, créez un fichier docker-compose.yml.
    • Définissez un seul service nommé webserver, basé sur l’image nginxdemos/hello:latest, et mappez le port 8888 de votre machine sur le port 80 du conteneur.
  2. Lancez et inspectez l’application :

    • Dans le terminal, à la racine de votre dossier, lancez docker compose up -d.
    • Vérifiez que le conteneur tourne avec docker compose ps.
    • Ouvrez votre navigateur à l’adresse http://localhost:8888. Vous devriez voir une page de test Nginx.
  3. Nettoyez :

    • Affichez les logs de votre service webserver.
    • Arrêtez et supprimez tout avec docker compose down.
    • Vérifiez avec docker ps -a qu’il n’y a plus de conteneurs.