Démarrer le cache, puis la boutique
Un fichier Compose décrit plusieurs services et leurs liens, et une seule commande les démarre tous. Il évite les erreurs d’ordre et de nom.
Une boutique a besoin d’un serveur web et d’un cache. Démarrer chacun à la main, c’est taper de longues commandes, dans le bon ordre, avec les bons noms.
Au troisième essai, quelqu’un les démarre dans le mauvais sens. Un seul fichier peut le dire une fois, pour tout le monde.
À la fin de cette leçon
Remarque
Je peux décrire deux services qui travaillent ensemble dans un fichier Compose.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Service | un programme d’un fichier Compose, lancé en un ou plusieurs conteneurs | |
| Fichier Compose | un fichier texte qui décrit des services et leurs liens | |
| Port publié | une porte du conteneur ouverte sur l’hôte | 8080:80 |
| Depends on | une règle : un service attend un autre | |
| Test de santé | un test que Docker répète pour voir si un service répond |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Ce que le labo ne peut pas faire
Remarque
Le terminal du labo n’a pas de commande docker compose. Le labo a démarré ses trois services depuis un fichier Compose, que vous ouvrez avec Modifier le fichier. Nous avons lancé le fichier de cette leçon sur notre machine. Vous le lisez, regardez ce qu’a fait celui du labo, et vérifiez l’ordre de démarrage dans le devoir.
Un seul fichier décrit tous les services
Sous services:, chaque service a un nom et l’image qu’il lance. D’autres clés disent ses liens : ses portes, ses réglages, le volume qu’il garde et ce qu’il attend.
docker compose up lit le fichier et démarre tout dans le bon ordre. Voici un serveur web et un cache.
Deux services dans un fichier Compose
services:
web:
image: nginx:1.27-alpine
ports:
- "8080:80"
environment:
CACHE_HOST: cache
depends_on:
cache:
condition: service_healthy
cache:
image: valkey/valkey:8.1-alpine
healthcheck:
test: ["CMD", "valkey-cli", "ping"]
interval: 3s
volumes:
- cache-data:/data
volumes:
cache-data:
Trouver le cache par son nom de service
docker exec web getent hosts cacheAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Voir quel service a démarré quand
docker inspect --format '{{.Name}} {{.State.StartedAt}}' web cache workerAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Exemple travaillé : ce que fait chaque clé
| Clé | Ce qu’elle fait | Ce que nous avons vu |
|---|---|---|
| image | dit quelle image lancer | le labo lance nginx et valkey |
| depends_on | fait attendre un service pour un autre | dans le labo, worker a démarré quelques secondes après web et cache |
| healthcheck | dit à Docker comment tester un service | cache répond à valkey-cli ping : il est healthy |
| environment | donne un réglage au programme | printenv CACHE_HOST a affiché cache |
| volumes | garde un dossier hors du conteneur | cache-data reste quand les services sont supprimés |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un port publié ouvre une porte
Dans le réseau, les services s’atteignent par leur nom. Un visiteur sur l’hôte a besoin d’une porte.
"8080:80" veut dire : le port 8080 de l’hôte va vers le port 80 du conteneur. Le côté de l’hôte est en premier. Sur notre machine, curl http://localhost:8080 a répondu 200. Le web du labo n’a pas de port publié : seuls les autres services et le bouton Ouvrir du labo l’atteignent.
Une erreur fréquente
Attention
On croit souvent que depends_on attend que l’autre programme soit prêt. Seul, il attend seulement que l’autre conteneur ait démarré. Donnez à l’autre service un test de santé et utilisez condition: service_healthy. Alors web ne démarre que lorsque le cache répond.
Le dossier partagé est-il modifiable dans web ?
docker inspect --format '{{range .Mounts}}{{.Destination}} {{.RW}}{{end}}' webAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Et dans worker ?
docker inspect --format '{{range .Mounts}}{{.Destination}} {{.RW}}{{end}}' workerAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Pour aller plus loin
Ajoutez un troisième service au fichier d’exemple : un worker qui dépend de web et de cache. Écrivez seulement ses trois lignes : le nom, une image et son depends_on.
Cherchez ensuite dans quel ordre Compose démarre les trois. Le devoir pose la même question pour n’importe quelle liste.