Une panne à neuf heures du soir
Un conteneur laisse deux traces : ses réglages, que lit docker inspect, et son journal, que lit docker logs. Elles disent pourquoi il est tombé.
La page d’une boutique affiche une erreur. La personne qui l’a construite dort. C’est vous qui êtes d’astreinte, et vous ne pouvez rien lui demander.
Tout se trouve sur la machine. Il y a ce qu’on a dit au programme de faire, et ce que le programme a dit pendant qu’il tournait.
À la fin de cette leçon
Remarque
Je peux trouver comment un conteneur a été réglé et ce qu’il a dit.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Inspecter | lire tous les réglages d’un conteneur | |
| Journal (log) | les messages qu’un programme écrit pendant qu’il tourne | |
| Code de sortie | le nombre qu’un programme donne en s’arrêtant ; 0 veut dire succès | |
| Test de santé | un test que Docker répète pour voir si un service répond encore | |
| Variable d’environnement | un réglage nommé donné à un programme | NGINX_VERSION |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
docker inspect lit les réglages d’un conteneur
docker ps montre quelques colonnes. docker inspect montre tout ce que Docker sait d’un conteneur, en JSON.
On en lit rarement la totalité. --format choisit un champ, écrit entre doubles accolades. Les quatre commandes suivantes lisent l’image, les portes, la limite de mémoire et une variable d’environnement de web.
Quelle image web fait-il tourner ?
docker inspect --format '{{.Config.Image}}' 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.
Quelles portes dit-il utiliser ?
docker inspect --format '{{json .Config.ExposedPorts}}' 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.
Combien de mémoire peut-il prendre, en octets ?
docker inspect --format '{{.HostConfig.Memory}}' 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.
Lire une variable d’environnement dedans
docker exec web printenv NGINX_VERSIONAffiché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é : qui a réglé quoi
| Élément | Qui l’a réglé | Comment le lire |
|---|---|---|
| L’image | la personne qui a démarré le conteneur | Config.Image |
| Les portes (ports) | l’auteur de l’image, dans le Dockerfile | Config.ExposedPorts |
| La limite de mémoire | le fichier compose du labo | HostConfig.Memory |
| NGINX_VERSION | l’auteur de l’image, dans le Dockerfile | docker exec web printenv NGINX_VERSION |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une erreur fréquente
Attention
On croit souvent que docker ps montre tout d’un conteneur. Il en montre un résumé. L’utilisateur sous lequel il tourne, ses limites, son environnement et sa santé ne sont que dans docker inspect. Utilisez ps pour trouver le conteneur et inspect pour l’interroger.
Un journal garde ce que le programme dit
Le journal d’un conteneur est tout ce que son programme principal a affiché. docker logs le montre.
Un service occupé écrit beaucoup. Dans ce labo, un test de santé appelle web toutes les quelques secondes, et chaque appel fait une ligne. On filtre donc. Demandez d’abord une page qui n’existe pas.
Demander à web une page absente
curl -s -o /dev/null -w "%{http_code}\n" http://web/missingAffiché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.
Retrouver cette demande dans le journal
docker logs web 2>&1 | grep "/missing"Affiché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.
Code de sortie et santé : comment ça finit
Un conteneur tourne, ou il s’est arrêté. Quand il s’arrête, son code de sortie dit comment. Zéro veut dire que tout s’est bien fini. Tout autre nombre veut dire un échec.
Un test de santé est un test que Docker répète pendant que le conteneur tourne. Le résultat est healthy ou unhealthy.
web tourne-t-il ? Quel est son code de sortie ?
docker inspect --format '{{.State.Status}} {{.State.ExitCode}}' 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.
web réussit-il son test de santé ?
docker inspect --format '{{.State.Health.Status}}' 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.
Quelle mémoire web utilise-t-il maintenant ?
docker stats --no-stream --format "{{.Name}} {{.MemUsage}}" 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.
Exemple travaillé : quatre questions en cas de panne
| Question | Commande | Ce que montrerait une tâche « rapport » arrêtée |
|---|---|---|
| Tourne-t-il ? | docker ps -a | Exited (137) il y a une minute |
| Comment a-t-il fini ? | docker inspect --format '{{.State.ExitCode}}' rapport | 137 : il a été tué |
| Qu’a-t-il dit en dernier ? | docker logs --tail 5 rapport | une ligne sur un manque de mémoire |
| Qu’avait-on réglé ? | docker inspect --format '{{.HostConfig.Memory}}' rapport | une limite trop petite pour la tâche |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Pour aller plus loin
Le worker du labo s’est arrêté. Vous avez maintenant les quatre questions pour lui : son statut, son code de sortie, son journal et ses réglages. La tâche du labo est d’y répondre et de le réparer.
Avant cela, lancez docker inspect web sans --format. Repérez les trois grandes parties : Config, State et HostConfig.