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.pcapFilesystem 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 ouvertsContainer 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 shNettoyage 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 --volumesstrace 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