Docker
Compose
La boutique de Cornucopia renaît en trois services, décrits dans une partition et levés d'une seule commande.
Compose en une diapo docs.docker.com/compose
Décrire au lieu de commander. Docker Compose définit une application multi-conteneurs dans un seul fichier YAML, la partition docker-compose.yml, et la lève d'une seule commande : docker compose up -d. Fini les docker run de trois lignes.
- Chaque service de la partition est un conteneur. Les services se trouvent entre eux par leur nom : le DNS interne de Docker fait la traduction, aucun numéro IP dans la partition.
- La partition est faite pour être versionnée, remise, partagée : c'est le capital de l'entreprise. Les secrets, eux, restent à part.
- Les commandes docker se transposent : docker compose up, ps, logs, stop, start, down agissent sur toute l'application à la fois, depuis le répertoire de la partition.
- Un service peut se construire avec un Dockerfile; cette semaine, rien à construire : trois images officielles de Docker Hub suffisent.
Les notions de la semaine sont détaillées dans le diaporama Notions - Docker Compose.
La mission et ce qu'on vous fournit
MISSION : Le WordPress de Cornucopia, emballé la semaine dernière dans un seul conteneur, devient une partition en trois services : le web, la base de données, phpMyAdmin. Les abonnés aux paniers d'aromates se multiplient : le site renaît avec son nouveau module d'abonnement, et vous prouvez que ses données survivent au grand ménage.
| Sauvegarde | sauvegarde-cornucopia-abonnement.zip (39 Mo) : fichiers-wordpress/ (le site, avec abonnement/), base-de-donnees.sql (l'export, avec la table abonnements et sa première abonnée, Hazel) et README.md. Le site original : cornucopia.projet.autos. |
|---|---|
| Images | Trois images officielles de Docker Hub : wordpress:7.1, mysql:8.0 et phpmyadmin. Rien à construire. |
| Comptes | Tableau de bord : agence, flora et hazel, mot de passe cornucopia-2026. Base de données cornucopia, compte flora, mot de passe potager-2026 (imposés par le wp-config.php de la sauvegarde); root de MySQL : racine-potager-2026. |
| Vous écrivez | docker-compose.yml (la partition), .env (les clés secrètes) et votre README.md. |
Pré-requis : le laboratoire Docker complété, une instance où docker compose version répond. Le matériel dans le GUIDE
Le plan du laboratoire
Trois services dans une partition, en quatre étapes. Le guide pas-à-pas déroule chacune en détail :
Déballer la sauvegarde de Cornucopia, puis décrire l'application entière : trois services, un réseau, deux répertoires partagés.
Résultat : docker compose config relit la partition sans erreur.
Guide · étape 01Une commande, trois services : la boutique de Flora s'affiche, phpMyAdmin voit la base, un article avec une image téléversée est publié.
Résultat : la boutique répond sur le port 8082, phpMyAdmin sur le 8083.
Guide · étape 02Sortir les mots de passe de la partition : elle devient remettable, le fichier .env ne se partage jamais.
Résultat : plus un seul mot de passe dans la partition.
Guide · étape 03La pause, le rangement, l'incendie volontaire : la preuve que les données survivent, et ce qui renaît de la sauvegarde.
Résultat : le cycle complet démontré et expliqué dans vos mots.
Guide · étape 04Le dessin du laboratoire : un conteneur par service
Étape 01 · Partition : ce qu'il faut faire
MISSION : Déballer la sauvegarde de Cornucopia et décrire l'application entière dans docker-compose.yml.
Tâches :
- Créer ~/my_wordpress, y télécharger et déballer la sauvegarde, donner fichiers-wordpress à www-data.
- Dans wp-config.php, une seule ligne change : DB_HOST devient db:3306, le nom du service.
- Ajouter le repointage de l'adresse à la fin de base-de-donnees.sql, avant le premier up.
- Écrire la partition : trois services, un réseau, deux répertoires partagés, et l'export déposé dans /docker-entrypoint-initdb.d/ du service db.
Résultat attendu : docker compose config relit votre partition sans erreur. Suivre le GUIDE
Étape 02 · Lever : ce qu'il faut faire
MISSION : Lever l'application entière d'une seule commande et vérifier que la boutique est bien transplantée.
Tâches :
- sudo docker compose up -d, puis docker compose ps et docker compose logs db : le premier démarrage importe la sauvegarde, comptez quelques secondes.
- Visiter la boutique sur le port 8082 : pas d'assistant d'installation, le site est transplanté, avec son module /abonnement/. Entrer au tableau de bord avec flora / cornucopia-2026.
- Visiter phpMyAdmin sur le port 8083 avec flora / potager-2026 : la base cornucopia, ses tables wp_posts et abonnements.
- Tester l'ajout d'un article avec une image téléversée depuis le tableau de bord : c'est le geste que vous referez en direct à la démonstration, et cet article témoin servira de preuve à l'étape 04.
Résultat attendu : trois services en marche, la boutique de Flora et son module d'abonnement répondent à l'adresse de votre instance (localhost sur votre poste, l'adresse IP de la machine virtuelle, l'adresse publique du VPS), et votre article illustré s'affiche avec son image. Suivre le GUIDE
Étape 03 · Secrets : ce qu'il faut faire
MISSION : Sortir les mots de passe de la partition pour qu'elle puisse être remise et versionnée.
Tâches :
- Créer un fichier .env à côté de la partition : MYSQL_UTILISATEUR, MYSQL_MOT_DE_PASSE et MYSQL_MOT_DE_PASSE_ROOT.
- Dans la partition, remplacer chaque secret par sa référence ${NOM} : dans le service db, et le mot de passe root aussi dans phpmyadmin.
- docker compose down puis up -d : le site fonctionne toujours.
- Dans votre README.md, nommer les variables attendues. Le fichier .env ne se remet jamais.
Résultat attendu : grep -i password docker-compose.yml ne montre plus que des ${...}. Règle du cours : jamais de vrai mot de passe dans un docker-compose.yml remis ou versionné. Suivre le GUIDE
Étape 04 · Survie : ce qu'il faut faire
MISSION : Prouver la différence entre la pause, le rangement et l'incendie volontaire. C'est la démonstration de persistance exigée dans l'évaluation.
Tâches :
- La pause : docker compose stop puis start. Les conteneurs sont arrêtés mais conservés; tout revient tel quel.
- Le rangement : docker compose down puis up -d. Conteneurs et réseau disparaissent, mais ./fichiers-wordpress et ./database restent : l'article témoin a survécu.
- L'incendie volontaire : down, puis sudo rm -rf ./database, puis up -d. La base a brûlé, et le service db, trouvant le répertoire vide, rejoue l'import de la sauvegarde : l'article témoin a disparu, l'abonnement de Hazel est revenu.
Résultat attendu : vous savez démontrer le cycle complet et expliquer, dans vos mots, la différence entre les trois gestes. C'est une question d'examen classique. Suivre le GUIDE
Livrables et barème
Ce que vous remettez, dans le dossier compose/ de votre dépôt Git :
- docker-compose.yml : la partition, secrets en ${...}.
- README.md : votre instance et son adresse, les variables attendues dans .env, les comptes de démonstration, la marche à suivre.
- Jamais le fichier .env, jamais les répertoires partagés ni la sauvegarde.
Ce que vous démontrez en direct : la boutique et phpMyAdmin accessibles depuis la machine hôte, l'ajout d'un article avec une image téléversée, et le cycle pause / rangement / incendie.
Le détail : Laboratoires Application conteneurisée.
Laboratoire 2 · Semaine 3 · 10 points
| Installation de Docker Compose | 1 |
| Répertoire de configuration | 1 |
| Configuration de Compose pour WordPress | 1 |
| Exécution avec Compose | 1 |
| Accès depuis la machine hôte | 1 |
| Article et illustration ajoutés | 4 |
| Arrêt, redémarrage, l'article illustré survit | 1 |
| Total | 10 |
Rappels importants, et le fichier complet
À gauche, la partition complète de la fin de l'étape 03, à télécharger : les secrets dans .env, la base cornucopia et les répertoires partagés de la sauvegarde.
- Versions figées : wordpress:7.1 et mysql:8.0, jamais latest. Le thème et la base de la sauvegarde sont calibrés dessus.
- Pas de variables WORDPRESS_DB_* : le wp-config.php de la sauvegarde fait foi. C'est le service db qui doit offrir exactement la base et le compte qu'il attend.
- Le repointage se fait avant le premier up : l'import ne se rejoue pas tant que ./database existe. Sinon : down, rm -rf ./database, corriger, up.
- L'indentation YAML est la grammaire : deux espaces par niveau, jamais de tabulation. docker compose config pour vérifier.
- Jamais de mot de passe en clair dans une partition remise, et le .env ne se remet jamais.
- Les commandes compose se lancent depuis le répertoire de la partition, et l'adresse dépend de votre instance.
- pwd avant rm -rf, et sudo obligatoire : MySQL écrit ses fichiers sous un autre utilisateur que le vôtre.
Pour aller plus loin
Défis facultatifs, décrits dans le guide :
- Défi A · Le bilan de santé : ajouter un healthcheck au service db et remplacer le simple depends_on par une condition service_healthy. WordPress n'essaiera plus de parler à une base encore endormie.
- Défi B · La sauvegarde par phpMyAdmin : exporter la base depuis phpMyAdmin, faire l'incendie volontaire, puis réimporter. Votre article témoin peut-il renaître de la sauvegarde ?
Vos deux documents : Le GUIDE pas-à-pas Le fichier complet L'énoncé de l'évaluation
Semaine prochaine, la même boutique s'orchestre dans un essaim : trois répliques du web, une base ancrée. La partition que vous écrivez cette semaine est votre point de départ.