1.5 · Observer et déboguer : logs, exec, inspect

Niveau 1 · Conteneurs : images, volumes, réseaux

1.5Observer et déboguer : logs, exec, inspect

Objectif : diagnostiquer un conteneur qui ne démarre pas en moins de 5 minutes.
Temps estimé : 12 min · lecture autonome · Si vous n'avez que 5 min : lisez « L'essentiel en 30s » + le schéma.

L'essentiel en 30 secondes

  • logs : écouter le malade : docker logs bdd lit le journal, -f le suit en direct, --tail 50 n'en prend que la fin — un conteneur en boucle raconte toujours sa cause.
  • exec : entrer pour vérifier : docker exec -it web sh ouvre un shell dans le vivant (fichier, ping, env) — diagnostic, jamais d'installation durable.
  • ps → logs → exec/inspect : docker ps -a donne l'état et le code de sortie, inspect révèle tout (variables, montages, réseaux) — sans deviner.

Mini-cas filé — Idir autopsie un web muet

Le jour de la démo, le web d'Idir ne répond plus. Au lieu de tout recréer à l'aveugle, il applique la méthode : docker ps -a montre un Exited (1), docker logs web accuse un port déjà utilisé, docker inspect web confirme le conflit de publication. Il libère le port, relance — la page revient. Cinq minutes, zéro devinette : son responsable retient surtout qu'Idir a nommé la cause avant de corriger.

Fin du cas 1.1-1.4 — Idir boucle le niveau : diagnostiquer avant de corriger.

1. logs : écouter le malade

docker logs bdd lit le journal, -f le suit en direct, --tail 50 n'en prend que la fin. Un conteneur qui redémarre en boucle raconte toujours sa cause dans ses logs (mot de passe manquant, port occupé, volume au mauvais chemin).

Sur les services bavards, on limite avec --tail : lire la fin, pas des kilomètres. Si logs est vide, l'appli loggue peut-être ailleurs (fichier interne : entrer avec exec) ou meurt avant d'écrire (inspect + config).

2. exec : entrer pour vérifier

docker exec -it web sh ouvre un shell dans le vivant : vérifier un fichier, tester une connexion (ping bdd), lire une variable (env). Pour un one-shot sans shell : docker exec web ls /usr/share/nginx/html. On n'installe rien durablement ainsi : c'est du diagnostic.

Modifier à la main dans le conteneur est perdu au run suivant : exec constate, il ne répare pas durablement.

3. inspect et ps : l'état civil

docker ps -a donne l'état (Up, Exited, Restarting) et le code de sortie. docker inspect révèle tout : commande, variables, montages, réseaux, ports. Méthode : ps → logs → exec/inspect, dans cet ordre, sans deviner.

Et on note la cause réelle, pas le symptôme : « port déjà utilisé » plutôt que « ça ne marche pas ».

Erreur d'interprétation fréquente : « Devant une panne, on recrée vite à l'aveugle, et exec marche même sur un conteneur arrêté ». Non. Recréer sans lire reproduit la même erreur (la cause — mot de passe, port, chemin — n'a pas changé), et exec exige un conteneur vivant (« container not running » sinon). On lit d'abord (ps → logs), on prouve ensuite (inspect, exec si vivant).
Diagnostiquer sans deviner État, journaux, inspection : un ordre fixe ps (état) Up ? Exited ?Restarting ?logs (cause) --tail, -f :le journal accuseexec/inspect (preuve) Del'intérieur + config réelle
État, journaux, inspection : un ordre fixe
Version texte du schéma (SEO / lecteurs d'écran / traduction) : 1) État : Idir lit docker ps -a — son web est en Exited (1), pas en Up : la piste est posée. 2) Cause : docker logs web accuse un port déjà utilisé — le journal parle. 3) Preuve : docker inspect web confirme le conflit de publication, il libère le port et relance. Leçon : 90 % des pannes se résolvent sans recréer à l'aveugle — l'état oriente, les logs accusent, l'inspection confirme.

Le recréeur en boucle (ne faites jamais ça)

« Mon conteneur crash ? Je le recrée. Il recrash ? Je le recrée plus vite. Sept fois. »
Verdict : la cause (mot de passe manquant, lisible dès la première ligne de logs) a survécu aux sept recréations — elle ne part qu'en la lisant.

Moralité : recréer sans lire, c'est perdre sept fois contre la même ligne de log.

🔎 Exemple concret — 🔎 Exemple concret — Un web qui ne répond pas

L'autopsie du web muet d'Idir, étape par étape.

docker ps -a          # Exited (1) ? Restarting ?
docker logs web       # ex. : port déjà utilisé
docker inspect web    # vérifier ports et réseaux
docker exec -it web sh  # fouiller de l'intérieur

Lecture : l'état oriente, les logs accusent, l'inspection confirme.

Leçon : 90 % des pannes se résolvent sans recréer à l'aveugle.

Vocabulaire de la section

logs
Le journal capté par le daemon ; se lit avec -f (direct) et --tail (fin).

Exemple simple : docker logs web --tail 30 révèle le port occupé chez Idir.

Ce que ce n'est pas : un fichier modifiable à la main.

Réflexe : toujours lire avant de recréer.

exec
Exécuter une commande dans un conteneur vivant (shell -it ou one-shot).

Exemple simple : docker exec -it web sh pour fouiller le web vivant.

Ce que ce n'est pas : la création d'un nouveau conteneur (run).

Réflexe : exec = vivant ; arrêté = inspect ou run --rm.

inspect
Le dossier complet JSON d'un conteneur, image ou réseau (variables, montages, ports).

Exemple simple : docker inspect web confirme le conflit de ports.

Ce que ce n'est pas : une devinette sur la configuration.

Réflexe : la config réelle, pas celle qu'on croit.

Code de sortie
Le 0 (OK) ou non-zéro (erreur) laissé par le processus, visible dans ps -a.

Exemple simple : Exited (1) oriente Idir vers les logs.

Ce que ce n'est pas : un numéro de port.

Réflexe : non-zéro = lire les logs aussitôt.

En pratique — En pratique — Autopsie guidée

  1. Lancez volontairement un conteneur mal configuré (mauvais -e).
  2. Relevez son état exact avec ps -a.
  3. Lisez ses 30 dernières lignes de logs et nommez la cause.
  4. Confirmez avec inspect (variables, montages), puis corrigez.
Vous diagnostiquez au lieu de tâtonner : état, cause, preuve.

Script prêt à dire — autopsier en 5 minutes (30 s)

« Mon conteneur est en Exited (1) : je lis ses trente dernières lignes de logs, je nomme la cause — port déjà utilisé. Je confirme avec inspect : ports et réseaux. Je corrige la cause, pas le symptôme, et je la note. »

À dire en enchaînant ps, logs --tail puis inspect ; montrer la cause nommée avant la correction.

Modèle copier-coller — check-list d'autopsie

docker ps -a                 # 1. ÉTAT : Up ? Exited (code) ? Restarting ?
docker logs NOM --tail 50   # 2. CAUSE : lire la fin, nommer (port, -e, volume)
docker inspect NOM          # 3. PREUVE : variables, montages, réseaux, ports
docker exec -it NOM sh      # 4. si VIVANT : fouiller (fichier, ping, env)
# 5. CORRIGER la cause, NOTER (pas le symptôme). Jamais recréer à l'aveugle.

Web muet d'Idir

Comme ci-dessus : Exited (1) → logs → port occupé → inspect → libération → relance. Cinq minutes, zéro devinette.

Base en Restarting

Boucle de redémarrage : les logs contiennent la cause (souvent -e manquant ou mauvais chemin de volume) — on lit avant d'agir.

Logs vides

Appli qui loggue dans un fichier interne : entrer avec exec pour le lire, ou inspect + config si le conteneur meurt avant d'écrire.

One-shot sans shell

docker exec web ls /usr/share/nginx/html : vérifier un contenu sans ouvrir de shell — rapide et sans risque.

✓ Bonnes pratiques

  • Toujours lire les logs avant de recréer.
  • Limiter avec --tail sur les services bavards.
  • Noter la cause réelle (pas le symptôme).

✗ Pièges fréquents

  • Recréer en boucle sans lire (même erreur).
  • Modifier à la main dans le conteneur (perdu au run suivant).
  • Confondre exec (vivant) et run (nouveau).

Points clés à retenir

  • ps donne l'état, logs la cause.
  • exec entre, inspect révèle tout.
  • L'ordre ps → logs → exec/inspect ne change pas.
  • On corrige la cause, pas le symptôme.

Défi 48h — appliquez demain

Sabotez volontairement un conteneur (mauvais -e), relevez son état ps -a, lisez 30 lignes de logs, nommez la cause, confirmez par inspect — puis corrigez et notez.

Checklist sortie de section
  • Je relève l'état exact (ps -a) avant toute hypothèse.
  • Je lis les logs pour nommer la cause.
  • Je confirme par inspect/exec et je corrige la cause.
Auto-évaluation 1-5 : est-ce que je lis les logs avant de recréer ?est-ce que je note la cause réelle, pas le symptôme ?

Questions fréquentes

logs est vide, que faire ?

Soit l'appli loggue ailleurs (fichier interne : entrez avec exec), soit le conteneur meurt avant d'écrire (inspect + config). Vérifiez aussi le pilote de logs.

exec refuse : « container not running » ?

Normal : exec exige un conteneur vivant. Démarrez-le, ou utilisez run --rm pour une inspection jetable de l'image.

Vérifiez votre compréhension

Un conteneur est en « Restarting ». Premier réflexe ?

Ressources supplémentaires (optionnel, pour aller plus loin)

Examen du niveau 1Questions inédites et durcies pour valider vos acquis