0 XP
?
Intermédiaire40 min30 XP

Objectifs de cette leçon

  • Debugger les problèmes courants Docker
  • Utiliser les logs et le monitoring
  • Résoudre les problèmes de réseau et de permissions

Debugging Docker 🐛

Les outils de diagnostic

┌──────────────────────────────────────────────────┐
│              Outils de debugging Docker            │
├──────────────┬───────────────┬────────────────────┤
│  docker logs │  docker exec  │  docker inspect    │
│  (voir les   │  (accéder     │  (détails complets)│
│   sorties)   │   au conteneur)│                   │
├──────────────┼───────────────┼────────────────────┤
│  docker stats│  docker top   │  docker diff       │
│  (ressources)│  (processus)  │  (modifications)   │
└──────────────┴───────────────┴────────────────────┘

1. docker logs — Voir les sorties

# Voir les logs
docker logs mon-conteneur

# Suivre les logs en temps réel
docker logs -f mon-conteneur

# Voir les 50 dernières lignes
docker logs --tail 50 mon-conteneur

# Voir les logs avec timestamps
docker logs -t mon-conteneur

# Voir les logs depuis une heure
docker logs --since 1h mon-conteneur

# Voir les erreurs uniquement
docker logs mon-conteneur 2>&1 | grep -i error

2. docker exec — Accéder au conteneur

# Ouvrir un terminal
docker exec -it mon-conteneur bash

# Si pas de bash, utiliser sh
docker exec -it mon-conteneur sh

# Exécuter une commande spécifique
docker exec mon-conteneur cat /etc/nginx/nginx.conf

# Voir les variables d'environnement
docker exec mon-conteneur env

# Voir les processus
docker exec mon-conteneur ps aux

# Tester un service externe depuis le conteneur
docker exec mon-conteneur ping postgres

3. docker inspect — Détails complets

# Informations complètes
docker inspect mon-conteneur

# IP du conteneur
docker inspect --format='{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mon-conteneur

# Port mappé
docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}}{{$p}} -> {{(index $conf 0).HostPort}}{{end}}' mon-conteneur

# Mounts (volumes)
docker inspect --format='{{json .Mounts}}' mon-conteneur | python3 -m json.tool

4. docker stats — Ressources en temps réel

# Voir l'usage CPU, mémoire, réseau
docker stats

# Résultat :
# CONTAINER   CPU %   MEM USAGE / LIMIT   MEM %   NET I/O
# mon-app     2.5%    128MiB / 512MiB     25%     1.2MB / 500kB
# postgres    0.1%    64MiB / 1GiB        6.2%    100kB / 200kB

# Stats d'un conteneur spécifique
docker stats mon-app --no-stream

5. docker top — Processus

# Voir les processus dans le conteneur
docker top mon-conteneur

# Résultat :
# UID   PID   PPID  C  STIME  TTY  TIME      CMD
# 1000  1234  1230  0  10:00  ?    00:00:01  node server.js

6. docker diff — Modifications

# Voir les fichiers modifiés dans le conteneur
docker diff mon-conteneur

# Résultat :
# C /app/logs       (Changed)
# A /app/temp.txt   (Added)
# D /app/old.txt    (Deleted)

Problèmes courants et solutions

1. Conteneur qui s'arrête immédiatement

# Voir la raison de l'arrêt
docker logs mon-conteneur

# Voir le code de sortie
docker inspect --format='{{.State.ExitCode}}' mon-conteneur

# Codes courants :
# 0   → Arrêt normal
# 1   → Erreur de l'application
# 126 → Permission refusée
# 127 → Commande non trouvée
# 137 → OOM Killed (manque de mémoire)

2. Conteneur ne démarre pas

# Diagnostic complet
docker logs mon-conteneur 2>&1
docker inspect mon-conteneur | grep -A 5 "State"

# Vérifier les dépendances
docker compose ps

3. Problème réseau

# Vérifier le réseau
docker network ls
docker network inspect bridge

# Tester la connectivité depuis le conteneur
docker exec mon-app ping postgres
docker exec mon-app curl http://api:8000/health

4. Problème de permissions

# Voir les permissions
docker exec mon-app ls -la /app

# Corriger les permissions
docker exec mon-app chown -R node:node /app

# Ou dans le Dockerfile
RUN chown -R node:node /app
USER node

Scénario de debugging complet

# 1. Le conteneur plante
docker compose up -d
docker compose logs app
# → Erreur : "Cannot find module 'express'"

# 2. Accéder au conteneur
docker compose exec app sh

# 3. Vérifier node_modules
ls node_modules/
# → Dossier vide !

# 4. Diagnostic
cat package.json | grep express
# → express est dans dependencies

# 5. Solution : Rebuild sans cache
docker compose build --no-cache app
docker compose up -d

Commandes utiles

CommandeUsage
docker logs -fSuivre les logs en temps réel
docker exec -it shAccéder au shell
docker inspectDétails complets
docker statsUsage ressources
docker topProcessus
docker diffModifications
docker system dfEspace disque utilisé

Exercices 🎯

  1. Logs : Lancez un conteneur et observez ses logs.
  2. Shell : Accédez au shell d'un conteneur et naviguez dans le filesystem.
  3. Debug : Créez un conteneur avec une erreur, diagnostiquez-la avec les outils Docker.
  4. Réseau : Vérifiez la connectivité entre deux conteneurs.

Prochaine leçon : Optimisation et bonnes pratiques.

Debugging Docker
Essayez chaque commande
$ docker logs <container>

Affiche les logs du conteneur

# Sortie :
2024-01-01 10:00:00 [INFO] Server started
2024-01-01 10:00:01 [ERROR] Connection refused
✅ Logs récupérés — erreur de connexion BDD détectée
1/4