Changer le thème

Gestion des logs Docker en pratique : de la configuration des drivers à la collecte centralisée

Easton editorial illustration: 容器日志源, DRIVER 选择器, ROTATE 线轴, COLLECT 归档库

Le téléphone vibre. Alerte disque sur le serveur de production, seuil à 85 %.

Je me redresse, ouvre le portable, me connecte en SSH. df -h : il ne reste que 12 % d’espace sur la partition racine. Après une série de vérifications, le coupable se trouve dans /var/lib/docker/containers — un conteneur Nginx actif depuis deux semaines, avec un fichier de logs gonflé à 12 Go.

Beaucoup ignorent que Docker ne limite pas la taille des logs par défaut. Ce conteneur crachait des dizaines de milliers de lignes d’accès par jour ; le driver json-file tout enregistrait fidèlement, et en deux semaines le disque était plein.

J’ai supprimé ce fichier de logs et ajouté la rotation sur tous les conteneurs. Ça m’a occupé jusqu’à quatre heures du matin.

Depuis cette nuit-là, j’ai passé une semaine à structurer la gestion des logs Docker — choix du driver, paramètres de rotation, collecte centralisée en environnement multi-conteneurs. Cet article résume ces galères.

1. Panorama des drivers de logs Docker

Concept de base : les logs d’un conteneur Docker ne sont pas écrits n’importe comment ; un « driver de logs » décide où ils vont et comment ils sont stockés.

Docker prend en charge plusieurs drivers, chacun adapté à un contexte. Par défaut, c’est json-file — stdout et stderr sont écrits au format JSON dans un fichier local, sous /var/lib/docker/containers/<ID du conteneur>/<ID du conteneur>-json.log.

json-file est simple : pas de config supplémentaire, format uniforme, lecture directe via docker logs. Mais le piège est évident : pas de limite de taille par défaut. Un conteneur qui tourne longtemps accumule les logs jusqu’à saturer le disque.

Le tableau suivant compare six drivers courants :

DriverCas d’usageSupport structuréService externeImpact perf.
json-fileDev, déploiement mono-machineOui (JSON auto)NonFaible
syslogInfra syslog existanteNon (parsing requis)Oui (rsyslog)Faible
journaldEnvironnement systemdPartielNonFaible
fluentdObservabilité cloud native, collecte centraliséeOui (tag personnalisé)Oui (service Fluentd)Moyen
gelfUtilisateurs GraylogOuiOui (Graylog)Moyen
noneDésactiver les logs, conteneurs temporairesNonNonAucun

json-file et syslog sont les plus courants. json-file pour le debug local et les déploiements légers ; syslog quand l’entreprise a déjà rsyslog ou syslog-ng — les logs sont centralisés en aval.

Le driver journald délègue à systemd journal. Sur un serveur géré par systemd (la plupart des Linux modernes), c’est pratique : consultation via journalctl.

fluentd et gelf visent la collecte centralisée. fluentd peut envoyer vers Elasticsearch, Kafka, stockage cloud, etc. ; gelf est le format dédié Graylog. Idéal en cluster multi-conteneurs, mais nécessite un service de collecte.

none désactive les logs — utile pour des conteneurs éphémères ou des tâches batch où les logs n’importent pas.

Comment choisir ?

Mono-machine, dev : json-file suffit, avec rotation (section suivante). Entreprise avec syslog : syslog, réutilisez l’existant. Cluster, logs centralisés : fluentd ou Loki (détaillé plus bas). Conteneur temporaire : none.

2. Rotation des logs en pratique

Retour au problème initial : un fichier de logs à 12 Go. Comment l’éviter ? Configurer la rotation.

json-file expose trois paramètres clés :

  • max-size : taille max. d’un fichier. Au-delà, Docker crée un nouveau fichier et numérote l’ancien. Ex. max-size=10m → 10 Mo max. par fichier.
  • max-file : nombre de fichiers historiques conservés. Au-delà, le plus ancien est supprimé. Ex. max-file=3 → 3 fichiers historiques + le fichier courant.
  • compress : compression des fichiers rotés. Par défaut false. true économise l’espace disque, avec un léger surcoût CPU.

La combinaison limite l’occupation disque. Ex. max-size=10m, max-file=3 → 30 Mo max. (moins avec compression).

Configuration : global vs conteneur

Trois niveaux possibles :

1. Configuration globale (daemon.json)

Pour tous les conteneurs, une fois pour toutes. Dans /etc/docker/daemon.json :

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3",
    "compress": "true"
  }
}

Redémarrez le daemon : sudo systemctl restart docker. Les nouveaux conteneurs héritent de cette config.

Attention : seuls les conteneurs créés après coup en bénéficient. Les existants doivent être traités séparément ou recréés.

2. Configuration par conteneur (docker run)

Pour des paramètres spécifiques :

docker run -d \
  --name nginx \
  --log-driver json-file \
  --log-opt max-size=50m \
  --log-opt max-file=5 \
  --log-opt compress=true \
  nginx:alpine

Applications à fort trafic : assouplir, ex. max-size=50m, max-file=10.

3. Configuration Docker Compose

Le plus courant en production :

version: "3.9"
services:
  webapp:
    image: webapp:latest
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
        compress: "true"

  nginx:
    image: nginx:alpine
    logging:
      driver: "json-file"
      options:
        max-size: "50m"
        max-file: "5"

Chaque service peut avoir sa propre config.

Valeurs recommandées en production

Le guide pratique SigNoz 2024 propose :

  • Dev/test : max-size=10m, max-file=3, suffisant.
  • Trafic moyen : max-size=50m, max-file=5, plus d’historique pour le debug.
  • Fort trafic : max-size=100m, max-file=10, éviter une rotation trop agressive.

Les valeurs exactes dépendent de votre contexte. Principe : équilibrer capacité disque et importance des logs. Disque large et logs critiques → garder plus ; disque serré → resserrer.

3. Comparaison des solutions de collecte centralisée

La rotation suffit en mono-machine. Avec des dizaines de conteneurs sur plusieurs hôtes, les logs éparpillés compliquent le debug — il faut se connecter partout et lancer docker logs un par un.

La collecte centralisée regroupe tout : stockage et requêtes unifiés.

Trois familles dominantes :

Stack ELK (Elasticsearch + Logstash + Kibana)

Classique et éprouvée. Logstash collecte, Elasticsearch indexe, Kibana visualise.

Points forts : recherche full-text, requêtes complexes, graphiques, écosystème mature. Faiblesses : gourmande en ressources — Elasticsearch pèse souvent plusieurs Go de RAM ; Logstash aussi, config complexe.

Adaptée aux grandes entreprises avec équipe ops dédiée, gros volumes et besoins de requêtes avancées.

EFK (Fluentd à la place de Logstash)

Variante ELK : Fluentd remplace Logstash. Plus léger (quelques centaines de Mo de RAM), riche en plugins, multiples sources et sorties.

Config plus claire que Logstash, mais Elasticsearch reste lourd. Consommation globale encore élevée — équipes moyennes à grandes.

Loki + Promtail + Grafana

Loki (Grafana Labs) : pas d’index full-text, seulement les labels (nom du conteneur, application) ; le contenu est stocké compressé, requêtes type grep, performances suffisantes.

Résultat : très léger (quelques centaines de Mo de RAM), stockage bien moins cher qu’Elasticsearch. Promtail collecte ; Grafana interroge, intégration native.

Idéal cloud native, surtout Kubernetes. Petites équipes, budget serré : excellent rapport qualité-prix.

Tableau comparatif

SolutionAvantagesInconvénientsÉchelleCoût
ELKPuissant, requêtes flexibles, écosystème matureRessources, config complexe, stockage cherGrande entrepriseÉlevé
EFKFluentd léger, pluginsElasticsearch lourd, config complexeMoyenne-grandeMoyen-élevé
LokiTrès léger, faible coût, cloud nativeRequêtes limitées, pas de full-textPetite / K8sFaible

Comment choisir ?

  • Petite équipe (< 10 personnes), budget limité : Loki. Simple, léger, interface Grafana agréable.
  • Équipe moyenne (10-50), capacité ops : Loki ou EFK selon le volume.
  • Grande entreprise, équipe ops dédiée : ELK. Complet, mature, investissement justifié.

Si Grafana monitor déjà votre infra, Loki s’impose — métriques et logs dans la même interface.

4. Pièges en production

Quelques erreurs que j’ai commises, pour vous éviter la même galère.

1. Oublier la rotation → disque plein

Le piège le plus fréquent. Déploiement sans penser aux logs ; quelques mois plus tard, alerte disque, fichiers à plusieurs dizaines de Go.

Conseil : defaults globaux dans daemon.json. Ne comptez pas sur votre mémoire à chaque docker run — la config, elle, n’oublie pas.

2. Redémarrage = perte de logs

Avec json-file, supprimer le conteneur supprime les logs. docker rm + docker run au lieu de docker restart → logs perdus.

Problème pour l’analyse rétrospective : crash à 3 h du matin, conteneur recréé, logs d’avant-crash disparus.

Conseils :

  • Préférez docker restart à supprimer/recréer.
  • Applications critiques : driver fluentd ou syslog vers stockage externe.
  • Sauvegardez régulièrement les logs importants en production.

3. Adresse Fluentd incorrecte

Avec fluentd, les logs partent en TCP vers le service. Mauvaise adresse : le conteneur démarre sans erreur, mais rien n’est collecté — vous croyez centraliser, les logs se perdent en route.

Exemple :

docker run -d \
  --log-driver fluentd \
  --log-opt fluentd-address=127.0.0.1:24224 \
  --log-opt tag="docker.&#123;&#123;.Name&#125;&#125;" \
  my-web-app

fluentd-address doit correspondre à l’écoute réelle de Fluentd. Port par défaut 24224, TCP.

Diagnostic :

  • Fluentd actif : curl http://localhost:24224 ou netstat -tlnp | grep 24224.
  • docker inspect &lt;ID du conteneur&gt; pour la config du driver.
  • Logs Fluentd : flux Docker reçus ou non.

4. Monitoring et alertes

La gestion des logs ne s’arrête pas à la configuration.

Deux métriques clés :

  • Espace disque : surveiller /var/lib/docker/containers. Seuil d’alerte, ex. 10 Go.
  • Latence d’écriture : en collecte centralisée, latence Fluentd ou Loki. Latence élevée → réseau ou goulot stockage.

Prometheus + Grafana, ou un script Cron simple.

Synthèse

Points clés de la gestion des logs Docker :

  1. Choix du driver : json-file le plus universel ; syslog pour infra existante ; fluentd pour collecte centralisée.
  2. Rotation : combinaison max-size + max-file ; global pour la simplicité, par conteneur pour la flexibilité.
  3. Collecte centralisée : Loki pour petites équipes, ELK pour grandes — selon échelle et budget.
  4. Pièges : rotation par défaut, éviter la perte de logs, vérifier Fluentd, surveiller le disque.

Modèle rapide :

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

Action immédiate : si la rotation n’est pas en place, vérifiez maintenant. Regardez /var/lib/docker/containers pour des fichiers géants, ajoutez les paramètres dans daemon.json, redémarrez Docker. Quelques minutes pour éviter de vous lever à 2 h du matin pour une alerte disque.

Configuration de la rotation des logs Docker

Configurer la rotation des logs des conteneurs Docker pour éviter que les fichiers de logs saturent le disque

⏱️ Estimated time: 10 min

  1. 1

    Step 1: Vérifier l'état actuel des logs

    Exécutez les commandes suivantes pour voir l'occupation disque des logs :

    ```bash
    # Taille totale du répertoire des logs
    du -sh /var/lib/docker/containers

    # Taille des logs par conteneur
    docker ps -q | xargs -I {} sh -c 'echo -n "{}: "; docker inspect --format="{{.LogPath}}" {} | xargs du -sh 2>/dev/null || echo "N/A"'
    ```

    Si un conteneur dépasse 1 Go de logs, configurez la rotation.
  2. 2

    Step 2: Configurer la rotation globale par défaut

    Éditez `/etc/docker/daemon.json` et ajoutez la configuration du driver de logs :

    ```json
    {
    "log-driver": "json-file",
    "log-opts": {
    "max-size": "10m",
    "max-file": "3",
    "compress": "true"
    }
    }
    ```

    Paramètres :
    - max-size : taille max. 10 Mo par fichier
    - max-file : conserver 3 fichiers historiques
    - compress : compresser les anciens fichiers pour économiser l'espace
  3. 3

    Step 3: Redémarrer Docker pour appliquer

    Redémarrez le service pour que la configuration prenne effet :

    ```bash
    sudo systemctl restart docker
    ```

    **Attention** : la configuration globale ne s'applique qu'aux nouveaux conteneurs ; les conteneurs existants doivent être recréés ou configurés individuellement.
  4. 4

    Step 4: Vérifier la configuration

    Créez un conteneur de test pour valider la configuration :

    ```bash
    # Créer un conteneur de test
    docker run -d --name test-nginx nginx:alpine

    # Voir la configuration des logs
    docker inspect --format='{{.HostConfig.LogConfig}}' test-nginx
    ```

    La sortie doit afficher les paramètres `max-size=10m,max-file=3`.
  5. 5

    Step 5: Nettoyer les anciens logs (optionnel)

    Si les logs de conteneurs existants sont trop volumineux, vous pouvez les nettoyer manuellement :

    ```bash
    # Méthode 1 : vider le fichier de logs (sans redémarrer le conteneur)
    sudo truncate -s 0 $(docker inspect --format='{{.LogPath}}' nom-conteneur)

    # Méthode 2 : recréer le conteneur (recommandé)
    docker rm -f nom-conteneur
    docker run ... # recréer avec les paramètres de logs
    ```

    Après recréation, le nouveau conteneur héritera de la configuration globale.

FAQ

Quel est le driver de logs par défaut de Docker ? Pourquoi la taille n'est-elle pas limitée ?
Docker utilise par défaut le driver json-file, qui écrit stdout et stderr du conteneur au format JSON dans un fichier local. L'absence de limite par défaut garantit l'intégrité des logs pour le dépannage, mais les conteneurs de longue durée voient leurs logs croître indéfiniment — configurez impérativement la rotation.
Comment combiner au mieux max-size et max-file ?
Combinaisons recommandées : environnement de dev `max-size=10m, max-file=3` (30 Mo au total) ; production `max-size=50m, max-file=5` (250 Mo) ; applications à fort trafic `max-size=100m, max-file=10` (1 Go). L'équilibre dépend de la capacité disque et des besoins de diagnostic.
Les logs persistent-ils après suppression du conteneur ? Comment les conserver ?
Avec json-file, les fichiers de logs sont supprimés avec le conteneur. Solutions de persistance : 1) driver fluentd/syslog vers un stockage externe ; 2) sauvegarde régulière de `/var/lib/docker/containers` ; 3) utiliser `docker restart` plutôt que supprimer et recréer pour redémarrer.
ELK ou Loki : lequel choisir ? Quelle solution pour une petite équipe ?
Petites équipes (&lt;10 personnes) : Loki — déploiement simple, quelques centaines de Mo de RAM, faible coût de stockage, intégration native avec Grafana. ELK est puissant mais gourmand (Elasticsearch souvent plusieurs Go de RAM), adapté aux grandes entreprises avec une équipe ops dédiée. Si vous utilisez déjà Grafana pour le monitoring, Loki est le choix naturel.
Que se passe-t-il si l'adresse Fluentd est mal configurée ? Comment diagnostiquer ?
En cas d'adresse incorrecte, le conteneur démarre normalement mais les logs ne sont pas collectés — perte découverte seulement au dépannage. Étapes : 1) vérifier Fluentd `netstat -tlnp | grep 24224` ; 2) inspecter la config logs `docker inspect --format='{{.HostConfig.LogConfig}}' ID-conteneur` ; 3) consulter les logs Fluentd pour confirmer la réception des flux Docker.
Comment appliquer une nouvelle rotation aux conteneurs existants ?
La config globale `daemon.json` ne s'applique qu'aux nouveaux conteneurs. Pour les existants : 1) recréer (recommandé) : `docker rm -f nom-conteneur` puis recréer ; 2) config par conteneur : `docker update --log-opt max-size=10m nom-conteneur` (certains paramètres en hot update) ; 3) vider manuellement : `truncate -s 0 $(docker inspect --format='{{.LogPath}}' nom-conteneur)`.
Comment surveiller l'occupation disque des logs Docker ?
Options : 1) script simple + Cron avec `du -sh /var/lib/docker/containers`, alerte au-delà d'un seuil ; 2) Prometheus + node_exporter pour l'utilisation disque ; 3) métriques intégrées Loki/Fluentd (latence d'écriture). Définissez un seuil d'alerte (ex. 10 Go) pour éviter les réveils nocturnes.

8 min de lecture · Publié le: 30 avr. 2026 · Mis à jour le: 27 juil. 2026

Commentaires

Connectez-vous avec GitHub pour laisser un commentaire

Easton BlogEaston Blog