Passer au contenu principal

Expertise (Docker)

Troubleshooting avancé

Débugger un container en production est différent du débug local : pas de rebuild possible, accès limité, urgence. La boîte à outils présentée ici s'applique sur un container vivant ou post-mortem.

OOM forensics

# Détecter un OOM kill
docker inspect CONTAINER --format '{{.State.OOMKilled}}'

# Logs kernel OOM
dmesg | grep -i "oom\|killed"
journalctl -k | grep -i oom

# Profiling mémoire dans un container Python
docker exec myapp python3 -c "
import tracemalloc
tracemalloc.start()
# ... (attacher au code en cours via pyrasite ou gdb)
"

Debug réseau dans un container

Les images distroless et slim n'ont pas d'outils réseau. Deux approches :

# Option 1 : container de debug partageant le namespace réseau
docker run --rm -it   --network container:mon-container   nicolaka/netshoot   bash
# Dans netshoot : ss, tcpdump, curl, dig, nmap disponibles

# Option 2 : nsenter (sur l'hôte, accès au namespace du container)
PID=$(docker inspect -f '{{.State.Pid}}' mon-container)
nsenter -t $PID -n -- ss -tlnp
nsenter -t $PID -n -- tcpdump -i eth0 -w /tmp/capture.pcap

Filesystem et processus

# Copier des fichiers depuis un container (même stoppé)
docker cp mon-container:/var/log/app.log ./app.log

# Voir les fichiers modifiés vs l'image de base
docker diff mon-container

# Lister les processus dans le container depuis l'hôte
docker top mon-container
# Ou via nsenter
PID=$(docker inspect -f '{{.State.Pid}}' mon-container)
ls /proc/$PID/fd   # fichiers ouverts

Container qui ne démarre pas

# Override de l'entrypoint pour entrer dans l'image
docker run --rm -it   --entrypoint sh   --env-file .env   myapp:latest

# Sur une image distroless : utiliser un container side-by-side
docker run --rm -it   -v $(docker inspect myapp --format '{{.GraphDriver.Data.MergedDir}}'):/rootfs:ro   busybox sh

Nettoyage et espace disque

# Vue d'ensemble de l'espace utilisé
docker system df
docker system df -v  # détail par ressource

# Nettoyage sélectif
docker container prune   # containers stoppés
docker image prune -a    # images sans container
docker volume prune      # volumes sans container
docker network prune     # réseaux inutilisés
docker builder prune     # cache de build BuildKit

# Nettoyage global (attention : irréversible)
docker system prune -a --volumes

strace et syscalls

# Tracer les syscalls d'un processus dans un container
PID=$(docker inspect -f '{{.State.Pid}}' mon-container)
strace -p $PID -f -e trace=network,file 2>&1 | head -100