Lire l'état et réparer en 5 minutes

11 min
Public
débutant, labo démarré au moins une fois
Durée
30 min
Module
1/7
Compétence visée
diagnostiquer une panne du labo en trois gestes, reconnaître les douze messages d'erreur classiques et appliquer le bon remède sans casser ses données

En une image

Quand une voiture refuse de démarrer, un bon mécanicien ne change pas le moteur : il regarde le tableau de bord (quel voyant est allumé ?), il écoute (quel bruit, à quel moment ?), et seulement en dernier recours il remet tout à zéro. Le labo se dépanne pareil. Geste 1, etat : le tableau de bord, qui tourne, qui répond. Geste 2, journal <service> : le bruit, les cent dernières lignes de ce que le service raconte, où se trouve presque toujours la phrase qui explique tout. Geste 3, reinitialiser : la remise à zéro, qui efface conteneurs et données et te rend un labo neuf en deux minutes. Entre le geste 2 et le geste 3, cette leçon te donne un catalogue de douze pannes vues et revues, chacune avec son message exact, sa cause et son remède. Neuf fois sur dix, tu n'iras pas jusqu'au geste 3.

Comment ça marche

Ce que chaque geste te dit :

GesteCommandeCe que tu lisCombien de temps
1./labo.sh etat · .\labo.ps1 etatcolonne STATUS : Up … (healthy), Up … (unhealthy), Exited (137), ou conteneur absent ; puis ✔/✘ par service et les compteurs10 s
2./labo.sh journal elasticsearch (ou kibana, neo4j, opensearch)100 dernières lignes ; cherche ERROR, FATAL, bootstrap check, Exception1 min
3./labo.sh reinitialiser puis demarrer, importer, charger-graphedemande confirmation (oui) ; supprime conteneurs et volumes3 min

Le geste 3 ne touche qu'aux conteneurs labo-* et aux trois volumes labo-recherche-graphes_es-data, _neo4j-data, _os-data. Tu perds ce que tu as créé toi-même (index de bac à sable, tableaux de bord, nœuds de test) ; les données du cours se rechargent avec importer et charger-graphe.

Un journal sain, pour reconnaître ensuite un journal malade (trois lignes réelles relevées avec journal) :

text
labo-elasticsearch  | {"@timestamp":"2026-09-09T13:39:45.630Z","log.level": "INFO", "current.health":"GREEN","message":"Cluster health status changed from [YELLOW] to [GREEN] (reason: [shards started [[cours][0]]])." …}
labo-kibana         | [2026-09-09T13:37:16.402+00:00][INFO ][status] Kibana is now available
labo-neo4j          | 2026-09-09 13:38:32.401+0000 INFO  Started.

Elasticsearch parle en JSON (une ligne par événement, champ message), Kibana en crochets [date][NIVEAU][module], Neo4j en texte. Les trois phrases ci-dessus sont celles qu'on veut voir. Kibana émet aussi des WARN sans gravité (Error initializing AI assistant resources: Platinum, Enterprise or trial license needed, Error while trying to load prerelease flag) : ignore-les.

Pas à pas

Les douze pannes, par ordre de fréquence en salle de cours. Les messages marqués « relevé » ont été reproduits sur le labo du cours ; les autres sont cités tels que les moteurs les émettent.

  1. Port déjà utilisé (relevé). demarrer échoue immédiatement sur :

    text
    Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint labo-elasticsearch (…): Bind for 0.0.0.0:9200 failed: port is already allocated

    Cause : un autre programme écoute déjà sur 9200 (un Elasticsearch installé « en dur », un autre projet Docker), ou 5601, 7474, 7687. Remède : prerequis te dit quel port ; trouve le coupable (Get-NetTCPConnection -LocalPort 9200 sous PowerShell, sudo ss -ltnp | grep 9200 sous Linux/macOS), arrête-le ou, si tu dois le garder, change le port côté hôte dans docker-compose.yml ("9202:9200") et adapte les adresses du cours.

  2. Conteneur Exited (137). etat affiche labo-elasticsearch Exited (137) 2 minutes ago, et le journal s'arrête net sans message d'erreur. Cause : code 137 = tué par le signal 9, presque toujours l'OOM killer : Docker n'a pas assez de mémoire pour trois JVM (Elasticsearch et Neo4j réclament jusqu'à 1 Go de tas chacun, plus Kibana). docker inspect labo-elasticsearch --format '{{.State.OOMKilled}}' répond true. Remède : leçon 02, étape 1 ou 2 : monte la mémoire de Docker à 6 Go (.wslconfig puis wsl --shutdown sous Windows), puis demarrer. N'active pas le profil OpenSearch sous 6 Go.

  3. Linux : vm.max_map_count trop bas. Elasticsearch (ou OpenSearch) sort en quelques secondes et son journal se termine par :

    text
    bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
    ERROR: Elasticsearch did not exit normally - check the logs at /usr/share/elasticsearch/logs/labo.log

    Cause : limite du noyau Linux hôte, que le conteneur ne peut pas changer lui-même. Remède : sudo sysctl -w vm.max_map_count=262144, rends-le permanent dans /etc/sysctl.conf (leçon 02, étape 3), puis demarrer. Sous Docker Desktop (Windows, macOS), la valeur est déjà 262144.

  4. « Kibana server is not ready yet ». La page http://localhost:5601 n'affiche que cette phrase. Cause : Kibana attend Elasticsearch. Soit c'est trop tôt (les 40 premières secondes), soit Elasticsearch est tombé (panne 2 ou 3), et journal kibana répète Unable to retrieve version information from Elasticsearch nodes. connect ECONNREFUSED 172.x.x.x:9200. Remède : etat. Si Elasticsearch est healthy, attends une minute et recharge ; sinon, répare Elasticsearch d'abord, Kibana suivra tout seul (restart: unless-stopped).

  5. Disque presque plein : index en lecture seule. À 95 % de disque plein, un Elasticsearch standard journalise flood stage disk watermark [95%] exceeded on […] all indices on this node will be marked read-only et toute écriture répond 429 : cluster_block_exception … blocked by: [TOO_MANY_REQUESTS/12/disk usage exceeded flood-stage watermark, index has read-only-allow-delete block]. Dans le labo, tu ne verras pas ce message : le compose fixe cluster.routing.allocation.disk.threshold_enabled=false (vérifiable avec GET _nodes/settings?filter_path=nodes.*.settings.cluster.routing). Le risque restant est no space left on device dans le journal pendant importer. Remède : docker system df pour mesurer, docker image prune pour libérer, puis relance importer.

  6. Neo4j refuse le mot de passe (relevé). Dans Neo4j Browser : Connection to instance failed — The client is unauthorized due to authentication failure. (détails : Neo.ClientError.Security.Unauthorized). Dans etat : ✘ Neo4j ne répond pas, et en ligne de commande cypher-shell dit The client is unauthorized due to authentication failure. Cause A : faute de frappe, le mot de passe est aiopsatlas2026. Cause B, plus sournoise : le volume neo4j-data a été créé lors d'un précédent démarrage avec un autre mot de passe ; NEO4J_AUTH ne s'applique qu'à la toute première initialisation, et le journal le dit noir sur blanc (ligne relevée) : Changed password for user 'neo4j'. IMPORTANT: this change will only take effect if performed before the database is started for the first time. Remède A : retape. Remède B : reinitialiser puis demarrer et charger-graphe.

  7. Conflit de nom de conteneur (relevé). demarrer échoue sur :

    text
    Error response from daemon: Conflict. The container name "/labo-elasticsearch" is already in use by container "a26fe0358d63…". You have to remove (or rename) that container to be able to reuse that name.

    Cause : un conteneur labo-elasticsearch existe déjà mais n'appartient pas à ce projet Compose, typiquement parce que tu as cloné le kit dans un second dossier, ou lancé un docker run --name labo-elasticsearch à la main. Remède : docker rm -f labo-elasticsearch (le conteneur seulement, les données du volume restent), puis demarrer. Si le conflit porte sur les cinq noms, docker rm -f $(docker ps -aq --filter name=labo-).

  8. Git Bash réécrit les chemins /labo (relevé). Sous Windows, dans Git Bash, une commande tapée à la main comme docker compose exec -T neo4j ls /labo/cypher répond :

    text
    ls: cannot access 'C:/Program Files/Git/labo/cypher': No such file or directory

    Cause : l'émulation MSYS de Git Bash convertit tout argument qui commence par / en chemin Windows avant de le passer à docker. Remède : labo.sh exporte MSYS_NO_PATHCONV=1 et MSYS2_ARG_CONV_EXCL='*' dès sa deuxième ligne, donc toutes les commandes du script sont protégées. Pour tes propres commandes dans Git Bash, préfixe-les : MSYS_NO_PATHCONV=1 docker compose exec -T neo4j ls /labo/cypher (relevé : la liste des fichiers .cypher apparaît).

  9. PowerShell 5.1 et Invoke-RestMethod cassent les accents (relevé). Tu envoies une requête avec un mot accentué depuis PowerShell :

    powershell
    $corps = '{"analyzer":"french","text":"déployés en production"}'
    Invoke-RestMethod -Uri http://localhost:9200/cours/_analyze -Method Post -ContentType 'application/json' -Body $corps

    PowerShell 5.1 répond Le serveur distant a retourné une erreur : (400) Demande incorrecte. ; côté Elasticsearch la raison est x_content_parse_exception … Invalid UTF-8 middle byte 0x70. Cause : PowerShell 5.1 encode le corps en Latin-1 alors qu'Elasticsearch attend de l'UTF-8 ; la même commande sous PowerShell 7 fonctionne. Remède : passe par Kibana Dev Tools pour toutes les requêtes du cours (UTF-8 garanti) ; labo.ps1 lui-même utilise curl à l'intérieur des conteneurs. Pour scripter malgré tout : PowerShell 7, ou -Body ([System.Text.Encoding]::UTF8.GetBytes($corps)).

  10. Docker Desktop n'est pas démarré. Toute commande docker (donc prerequis, etat, demarrer) échoue sur :

    text
    error during connect: Get "http://%2F%2F.%2Fpipe%2FdockerDesktopLinuxEngine/v1.51/info": open //./pipe/dockerDesktopLinuxEngine: The system cannot find the file specified.

    (Cannot connect to the Docker daemon at unix:///var/run/docker.sock sous macOS/Linux.) prerequis traduit : ✘ le démon Docker ne répond pas — lancez Docker Desktop et attendez l'icône verte. Cause : Docker Desktop fermé, ou encore en train de démarrer après une session Windows. Remède : lance Docker Desktop, attends que l'icône cesse de s'animer, relance la commande. Les conteneurs en restart: unless-stopped repartent d'eux-mêmes.

  11. Téléchargement très lent ou TLS handshake timeout. Pendant == Téléchargement des images == :

    text
    Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: TLS handshake timeout

    ou failed to copy: read tcp … connection reset by peer. Cause : réseau saturé, wifi d'école, proxy d'entreprise ; les images pèsent 2,5 à 2,8 Go chacune. Remède : rien à réparer, relance demarrer : Docker reprend les couches déjà téléchargées (Already exists). Derrière un proxy, configure-le dans Docker Desktop → Settings → Resources → Proxies.

  12. Volume plein ou données corrompues : la remise à zéro. Symptômes variés : etat affiche le cluster en red, le journal d'Elasticsearch parle de CorruptIndexException ou de no space left on device, Neo4j reste bloqué en recovery après un arrêt brutal du PC, ou plus simplement plus rien n'a de sens après une manipulation hasardeuse. Remède, le geste 3 :

    bash
    ./labo.sh reinitialiser      # répondre : oui
    ./labo.sh demarrer
    ./labo.sh importer
    ./labo.sh charger-graphe
    powershell
    .\labo.ps1 reinitialiser
    .\labo.ps1 demarrer
    .\labo.ps1 importer
    .\labo.ps1 charger-graphe

    Ce qu'il faut voir : reinitialiser exécute docker compose --profile opensearch down -v --remove-orphans et confirme ✔ labo remis à zéro. Les images restent en cache : pas de nouveau téléchargement, et le trio suivant prend deux à trois minutes. Ce qu'il faut savoir : arreter (sans -v) conserve les données ; reinitialiser les efface, c'est la seule différence.

Si ça coince

  • etat ne liste aucun conteneur et demarrer recrée tout à chaque fois → Tu lances le script depuis une seconde copie du dépôt. Garde une seule copie du kit et lance toujours les commandes depuis sa racine.

  • journal affiche des milliers de lignes JSON illisibles → Normal pour Elasticsearch. Filtre sur les mots-clés : sous PowerShell .\labo.ps1 journal elasticsearch | Select-String 'ERROR|WARN|bootstrap', sous bash ./labo.sh journal elasticsearch | grep -E 'ERROR|WARN|bootstrap'.

  • Après reinitialiser, Kibana affiche à nouveau « Vos données ne sont pas sécurisées » → Bannière normale d'un Kibana sans sécurité ; elle revient parce que la configuration de Kibana a été effacée avec le volume. Clique « Rejeter ».

À retenir

  • Trois gestes, toujours dans cet ordre : etat (qui ne va pas), journal <service> (pourquoi), reinitialiser (dernier recours, efface les données du labo mais pas les images).
  • Les codes à reconnaître : Exited (137) = mémoire ; port is already allocated = port pris ; vm.max_map_count [65530] is too low = Linux à régler ; Neo.ClientError.Security.Unauthorized = mot de passe ; container name … already in use = docker rm.
  • Le kit désamorce deux pièges d'avance : le seuil disque d'Elasticsearch est désactivé, et labo.sh neutralise la conversion de chemins de Git Bash.
  • Sous Windows, ne fais pas transiter d'accents par Invoke-RestMethod en PowerShell 5.1 : Dev Tools et labo.ps1 s'en chargent proprement.
  • arreter garde les données, reinitialiser les efface. Les données du cours se rechargent toujours en deux commandes.

Pour aller plus loin

docker inspect --format '{{.State.Health.Status}}' labo-elasticsearch renvoie starting, healthy ou unhealthy : c'est exactement ce que lit demarrer toutes les trois secondes. {{json .State.Health.Log}} montre les cinq derniers résultats du healthcheck.