Passer au contenu principal

Données et réseau (Docker)

Logs et debug

Un container qui ne produit pas de logs exploitables est un container difficile à opérer. Configurer correctement les log drivers et savoir débugger un container en cours d'exécution ou post-mortem sont des compétences opérationnelles essentielles.

docker logs

# Logs d'un container
docker logs web

# Suivre en temps réel
docker logs -f web

# Depuis un timestamp ou une durée
docker logs --since 2024-01-15T10:00:00 web
docker logs --since 30m web

# Dernières N lignes
docker logs --tail 100 web

# Avec timestamps
docker logs -t web

Docker capture stdout et stderr du processus principal (PID 1). Si l'application écrit dans un fichier de log plutôt que stdout, rien n'apparaît dans docker logs. Les applications bien containerisées écrivent sur stdout/stderr.

Log drivers

// /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "5",
    "compress": "true"
  }
}

Autres drivers courants :

  • journald : intégration systemd, queryable avec journalctl
  • syslog : envoi vers un syslog server
  • gelf : Graylog Extended Log Format
  • fluentd / awslogs : intégrations cloud
# Surcharger le driver pour un container spécifique
docker run -d   --log-driver journald   --log-opt tag="docker-{{.Name}}"   nginx:alpine

# Lire depuis journald
journalctl -u docker CONTAINER_NAME=web -f

exec pour débugger

# Shell interactif
docker exec -it web bash

# Sur une image distroless ou sans bash : sh ou busybox
docker exec -it web sh

# Commandes ponctuelles
docker exec web cat /etc/hosts
docker exec web ss -tlnp
docker exec web curl -s localhost:8080/health

Container qui crashe au démarrage

# Voir les logs du dernier run même si le container a été supprimé
docker logs CONTAINER_ID

# Overrider l'entrypoint pour entrer dans l'image sans lancer l'app
docker run --rm -it --entrypoint bash myapp:latest

# Sur une image distroless : utiliser une image de debug
docker run --rm -it   --volumes-from myapp-container   busybox sh

Events et inspect

# Flux d'événements Docker en temps réel
docker events
docker events --filter event=die
docker events --filter container=web

# Inspecter l'état complet d'un container
docker inspect web

# Exit code du dernier run
docker inspect web --format '{{.State.ExitCode}}'