Bonjour ! Dans la leçon précédente, vous avez maîtrisé la création d'un Dockerfile multi-stage optimisé pour votre application Spring Boot. Vous savez maintenant comment empaqueter votre code dans une image Docker légère, sécurisée et prête pour la production.
Cependant, une application vit rarement seule. Elle a besoin de communiquer avec une base de données, un système de cache, et potentiellement d'autres services. Comment lancer et gérer tout cet écosystème de manière cohérente et reproductible en développement ?
C'est l'objectif de notre leçon du jour. Vous allez apprendre à orchestrer votre application et ses dépendances (base de données, cache) avec Docker Compose. À la fin de cette session, vous serez capable de définir l'ensemble de votre stack applicative dans un seul fichier et de la démarrer avec une unique commande.
1. Qu'est-ce que Docker Compose ?
Imaginez que votre Dockerfile est la recette pour construire une brique (un conteneur). Docker Compose est le plan d'architecte qui explique comment assembler plusieurs briques (conteneurs) pour construire une maison (votre application complète).
C'est un outil qui permet de définir et de gérer des applications multi-conteneurs à l'aide d'un simple fichier de configuration au format YAML : le docker-compose.yml. Ce fichier décrit les services qui composent votre application, comment les construire, et comment ils interagissent.

2. La structure d'un fichier docker-compose.yml
Le fichier docker-compose.yml est le cœur de l'orchestration. Il s'organise autour de quelques clés principales. Une vidéo vous guidera à travers la mise en place initiale de ce fichier.
Spring Boot + MySQL + Docker : Comment Dockeriser une application Web en moins de 15 minutes
La vidéo "Spring Boot + MySQL + Docker" de Coding With Armand est un excellent point de départ. Elle montre concrètement comment créer un fichier docker-compose.yml à partir de zéro.
Regardez le segment de 04:43 à 06:09. L'auteur y introduit les trois sections fondamentales que nous allons utiliser : version, volumes, et networks. Concentrez-vous sur la raison d'être de chacune.
Pour résumer ce que vous venez de voir, les trois sections principales sont :
services: C'est ici que vous définissez chaque composant de votre application (ex: votre backend, votre base de données). Chaque service correspondra à un conteneur.volumes: Les conteneurs sont éphémères. Si vous supprimez un conteneur de base de données, vous perdez toutes vos données. Les volumes permettent de stocker les données de manière persistante sur la machine hôte, en dehors du cycle de vie du conteneur.networks: Pour que vos conteneurs puissent communiquer entre eux de manière sécurisée et isolée, Docker Compose crée un réseau privé. Les services peuvent s'appeler par leur nom, comme s'ils étaient sur le même réseau local.
3. Définir les services dépendants : MySQL et Redis
Commençons par configurer les dépendances de notre application : une base de données MySQL pour la persistance et un cache Redis pour la performance.
Le service de base de données MySQL
La configuration d'un service avec état comme une base de données requiert une attention particulière. La vidéo que vous avez commencée détaille parfaitement ce processus.
Spring Boot + MySQL + Docker : Comment Dockeriser une application Web en moins de 15 minutes
Continuons avec la vidéo de Coding With Armand. Cette partie se concentre exclusivement sur la configuration du service MySQL.
Regardez attentivement de 06:09 à 10:49. Prenez note de la configuration des éléments suivants : image, ports, environment, volumes et healthcheck. C'est un exemple très complet.
Voici une analyse des points clés abordés dans la vidéo :
image: mysql:8: Utilise l'image officielle MySQL version 8 depuis Docker Hub.environment: Permet de configurer le conteneur MySQL au démarrage. Les variables commeMYSQL_ROOT_PASSWORDetMYSQL_DATABASEsont essentielles.volumes: - mysql-data:/var/lib/mysql: C'est la ligne qui assure la persistance. Elle lie un volume nommémysql-data(défini à la racine du fichier) au dossier interne du conteneur où MySQL stocke ses données.ports: - "3308:3306": Mappe le port 3306 du conteneur au port 3308 de votre machine. Cela vous permet de vous connecter à la base de données depuis votre machine locale (par exemple avec un client SQL) vialocalhost:3308, tout en évitant les conflits si vous avez déjà un MySQL local tournant sur le port 3306.healthcheck: Une pratique essentielle. Docker va périodiquement exécuter une commande (mysqladmin ping) pour vérifier que la base de données est non seulement lancée, mais qu'elle est aussi prête à accepter des connexions.
Le service de cache Redis
Conformément à l'objectif d'apprentissage, ajoutons un service de cache. Redis est un choix très courant. Sa configuration est beaucoup plus simple.
services:
# ... service mysql
redis:
image: redis:7-alpine # Utilise une image Redis légère (basée sur Alpine)
restart: always
ports:
- "6379:6379" # Mappe le port Redis par défaut
networks:
- app-network # Le connecte au même réseau
Ici, pas besoin de variables d'environnement complexes ou de volume persistant pour un usage de cache en développement.
4. Intégrer votre application Spring Boot
Maintenant que nos dépendances sont définies, il est temps d'ajouter le service principal : notre application Spring Boot, en utilisant le Dockerfile que vous avez créé lors de la leçon précédente.
Spring Boot + MySQL + Docker : Comment Dockeriser une application Web en moins de 15 minutes
La dernière partie de la vidéo de Coding With Armand montre comment intégrer le service applicatif et le lier à la base de données.
Regardez de 10:49 à 14:40. Portez une attention particulière à la directive build, à la section depends_on, et surtout à la manière dont l'URL de la base de données est configurée dans les variables d'environnement.
Le chaînon manquant : depends_on et la communication réseau
Cette partie est cruciale. Comme vous l'avez vu, la communication entre les conteneurs n'est pas magique.
-
L'ordre de démarrage avec
depends_on
La sectiondepends_ongarantit que Docker Compose démarre les conteneurs dans le bon ordre.depends_on: mysql-db: condition: service_healthyCette configuration est très robuste. Elle indique à Docker Compose d'attendre que le
healthcheckdu servicemysql-dbsoit positif avant de lancer le conteneur de l'application. Votre application ne démarrera donc jamais avant que la base de données ne soit réellement prête. -
La communication via le nom de service
C'est le point qui déroute le plus souvent les débutants. Dans les variables d'environnement de votre application, l'URL de la base de données n'est pasjdbc:mysql://localhost:3306/....
Kafka avec Spring Boot : logique métier (4/6) - izo-nova
L'article "Kafka avec Spring Boot" contient une explication très claire sur ce point dans sa section sur les variables d'environnement.
Lisez la sous-section "Pourquoi ne pas utiliser localhost ?" dans la partie "2.2. Variables d’environnement avec .env". Elle explique pourquoi le nom du service (mysql dans leur exemple) remplace localhost.
En bref, depuis l'intérieur du réseau Docker, chaque service est accessible via son **nom de service**. Si vous avez nommé votre service de base de données `mysql-db`, alors pour votre application Spring Boot, le nom d'hôte de la base de données est `mysql-db`.
5. Assemblage final et exécution
Voici à quoi pourrait ressembler un fichier docker-compose.yml complet, intégrant votre application, une base de données MySQL et un cache Redis. Cet exemple s'inspire des bonnes pratiques que nous avons vues.
docker-containerization - MCP Hub
La ressource suivante propose un exemple complet et bien structuré de fichier docker-compose.yml, incluant une application, une base de données et un cache Redis.
Étudiez la section "5. Docker Compose for Multi-Container". Bien que l'exemple utilise Node.js et PostgreSQL, la structure est universelle. Observez comment les services app, db, et redis sont définis et connectés via app-network. C'est un excellent modèle pour notre propre fichier.
En adaptant ce modèle à notre stack Spring Boot / MySQL, voici notre fichier docker-compose.yml final :
version: '3.8'
services:
# Service Backend Spring Boot
backend-app:
build: . # Construit l'image à partir du Dockerfile à la racine
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=docker
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql-db:3306/appdb
- SPRING_DATASOURCE_USERNAME=user
- SPRING_DATASOURCE_PASSWORD=password
- SPRING_DATA_REDIS_HOST=redis
- SPRING_DATA_REDIS_PORT=6379
depends_on:
mysql-db:
condition: service_healthy
redis:
condition: service_started
networks:
- app-network
# Service Base de Données MySQL
mysql-db:
image: mysql:8.0
environment:
- MYSQL_DATABASE=appdb
- MYSQL_USER=user
- MYSQL_PASSWORD=password
- MYSQL_ROOT_PASSWORD=rootpassword
ports:
- "3308:3306"
volumes:
- mysql-data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
networks:
- app-network
# Service de Cache Redis
redis:
image: redis:7-alpine
ports:
- "6379:6379"
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
networks:
- app-network
volumes:
mysql-data:
networks:
app-network:
driver: bridge
(Note : il est nécessaire d'adapter le fichier application.properties de votre projet Spring Boot ou d'utiliser des profils pour que ces variables d'environnement soient prises en compte.)
Pour lancer l'ensemble de la stack, placez-vous à la racine de votre projet (là où se trouvent le Dockerfile et le docker-compose.yml) et exécutez :
docker compose up --build -d
up: Démarre les services.--build: Force la reconstruction de l'image de votre application si son code ou sonDockerfilea changé.-d: (detached) Lance les conteneurs en arrière-plan.
Quelques autres commandes utiles :
docker compose ps: Voir l'état de vos conteneurs.docker compose logs -f backend-app: Suivre les logs de votre application en temps réel.docker compose down: Arrêter et supprimer les conteneurs.docker compose down -v: Idem, mais supprime aussi les volumes nommés (attention, cela efface vos données de base de données !).
Conclusion
Félicitations ! Vous avez fait un grand pas en avant, passant de la conteneurisation d'un seul service à l'orchestration d'une application multi-services complète.
Points clés à retenir :
- Docker Compose utilise un fichier
docker-compose.ymlpour définir et gérer une application composée de plusieurs conteneurs. - Les services communiquent entre eux via un réseau privé, en utilisant leur nom de service comme nom d'hôte.
- Les volumes nommés sont essentiels pour assurer la persistance des données des services avec état, comme les bases de données.
- La combinaison de
depends_onethealthcheckest la méthode la plus robuste pour gérer l'ordre de démarrage des services et s'assurer que les dépendances sont prêtes.
Prochaine étape :
Dans notre fichier docker-compose.yml, nous avons écrit des mots de passe en clair. C'est acceptable pour du développement local rapide, mais c'est une très mauvaise pratique pour tout environnement partagé ou de production. Dans la prochaine leçon, nous aborderons justement comment gérer les secrets et les variables d'environnement de manière sécurisée dans un contexte conteneurisé.