Configurer la rotation des logs Docker : local et journald | INTROSERV
EUR
european

EUR

usa

USD

French Fr
Ex. VAT Ex. VAT 0%

Configurer la rotation des journaux Docker avec un pilote de journalisation : journalisation Docker avec journald et pilote de fichiers local

Niveau : Expert
Durée estimée : ~20 minutes
Objectif : Configurer la rotation des journaux Docker afin d'assurer une gestion des journaux sans interruption de service et d'éviter l'épuisement de l'espace disque.

Introduction

Des journaux Docker non maîtrisés peuvent épuiser rapidement le stockage d'un serveur. Par défaut, le démon Docker écrit les journaux au format json-file, sans limite de taille. Pour maintenir une infrastructure fiable, vous devez configurer la rotation des journaux Docker en vous appuyant sur un pilote de journalisation Docker évolutif. Ce guide explique comment mettre en place la rotation des journaux Docker de manière globale, soit avec la journalisation Docker via journald, soit avec le pilote de fichiers local (local) de Docker. Choisir la bonne configuration garantit une gestion efficace des journaux et la stabilité du système.

Terminologie

Avant de poursuivre, familiarisez-vous avec les concepts fondamentaux suivants :

  • Docker : plateforme permettant d'exécuter des applications dans des environnements isolés appelés conteneurs.
  • Journaux Docker : les flux de sortie capturés depuis Stdout (sortie standard) et Stderr (erreur standard) d'un conteneur.
  • Rotation des journaux : pratique consistant à archiver et à purger les anciens journaux pour récupérer de l'espace.
  • Pilote de journalisation (logging driver) : le mécanisme utilisé par Docker pour capturer, formater et acheminer les journaux.
  • Journald : le service de journalisation de systemd, idéal pour la journalisation centralisée de l'hôte.
  • Pilote de fichiers local (local) : pilote intégré haute performance, optimisé pour le stockage local.
  • Json-file : le pilote par défaut, qui écrit les journaux au format JSON.
  • Démon Docker : le service d'arrière-plan qui gère les opérations Docker.
  • Daemon.json : le fichier de configuration du démon.
  • Configuration du pilote de journalisation : le paramétrage de la journalisation, global ou par conteneur.
  • Options de journalisation : paramètres spécifiques transmis au pilote.
  • Max-size : la taille seuil à partir de laquelle un fichier de journal est renouvelé (rotation).
  • Max-file : le nombre maximal de fichiers issus de la rotation qui sont conservés.

Prérequis

Avant de commencer, assurez-vous de disposer de :

  • Système d'exploitation : Ubuntu 22.04 / 24.04 LTS, Debian 12 / 13, RHEL 9 / 10, AlmaLinux 9 / 10, Rocky Linux 9 / 10
  • Docker : version 24.x ou ultérieure installée
  • Accès : privilèges sudo
  • Connaissances requises : administration Linux et notions d'Infrastructure as Code

Étape 1 : Comprendre les différences entre les pilotes json-file et local de Docker

Lorsqu'on compare les pilotes json-file et local de Docker, ce sont les performances et la charge induite qui dictent le choix. Le pilote par défaut json-file est simple, mais il consomme davantage de CPU et d'espace disque en raison du formatage JSON. À l'inverse, le pilote de fichiers local utilise un format binaire en ajout seul (append-only), optimisé spécifiquement pour l'efficacité de la rotation. Dans les charges de travail de production habituelles, le pilote de fichiers local (local) de Docker réduit la charge sur le disque et applique la rotation de manière native et fiable.

Pour vérifier votre pilote actuel, exécutez :

docker info --format '{{.LoggingDriver}}'

Sortie attendue :

json-file

Si vous voyez json-file, passez à la modification de la configuration de journalisation Docker dans daemon.json.

Étape 2 : Configurer la rotation des journaux Docker avec le pilote de fichiers local (local)

Pour appliquer des limites globales à tous les conteneurs, vous allez modifier le fichier /etc/docker/daemon.json. C'est l'approche recommandée pour la configuration de journalisation Docker dans daemon.json.

Ouvrez le fichier de configuration :

Si /etc/docker/daemon.json n'existe pas sur votre système, nano le créera à l'enregistrement. C'est normal : Docker utilise ses valeurs par défaut intégrées lorsque le fichier est absent.

sudo nano /etc/docker/daemon.json

Ajoutez la configuration de pilote de journalisation suivante :

{ "log-driver": "local", "log-opts": { "max-size": "50m", "max-file": "3" } }

Enregistrez et fermez le fichier. Les nouveaux paramètres sont écrits sur le disque. Cette configuration applique le pilote de manière globale. Les options de journalisation indiquent à Docker d'effectuer la rotation des journaux lorsqu'ils atteignent 50 mégaoctets (max-size pour les journaux Docker) et de conserver au maximum 3 fichiers (max-file pour les journaux Docker). Notez que le pilote local prend toujours en charge nativement ces contraintes explicites de taille et de nombre de fichiers, contrairement à journald.

Redémarrez le démon Docker pour appliquer les modifications. Le service docker.service gère les conteneurs : son redémarrage met donc les limites en application :

sudo systemctl restart docker

Vous perdrez la connectivité avec le démon pendant quelques secondes. Une fois le redémarrage effectué, tous les conteneurs créés par la suite utiliseront le pilote de fichiers local (local) de Docker et hériteront de ces limites max-size et max-file pour les journaux Docker.

Warning

Le pilote de journalisation est immuable pour un conteneur donné. Les conteneurs existants conservent leur ancien pilote de journalisation ; docker update ne peut pas le modifier. Pour appliquer le nouveau pilote de journalisation Docker, il faut recréer le conteneur (par exemple avec docker compose up -d ou un redéploiement via l'orchestrateur), car il n'existe pas de migration à chaud. Sinon, vous vous retrouverez avec des états de journalisation hétérogènes sur votre hôte.

Par ailleurs, il est important de comprendre l'ordre de priorité des configurations de journalisation :

  1. Les options de la CLI (docker run --log-driver) prévalent sur tout le reste.
  2. Les surcharges de journalisation dans docker-compose.yml s'appliquent par service, au moment de la création du conteneur.
  3. daemon.json sert de valeur globale par défaut pour tous les conteneurs sans configuration explicite.

Étape 3 : Activer la journalisation Docker via journald comme pilote de journalisation Docker

Vous pouvez également acheminer les journaux directement vers le démon journald du système. La journalisation Docker via journald s'intègre parfaitement à systemctl et aux outils externes de transfert de journaux.

Ouvrez le fichier de configuration :

sudo nano /etc/docker/daemon.json

Remplacez le contenu par la configuration journald. Remplacez entièrement le contenu du fichier : supprimez toute entrée log-opts précédente, car journald ne prend pas en charge les options max-size et max-file :

{ "log-driver": "journald" }

Enregistrez et fermez le fichier. La configuration est mise à jour.

Redémarrez le service. Le service docker.service doit être rechargé pour transférer la gestion des journaux vers journald :

sudo systemctl restart docker

Avec les journaux Docker via journald, le pilote journald supprime le contrôle de la rotation côté Docker. La rotation des journaux existe toujours, mais elle est entièrement gérée en dehors de Docker, par le journal systemd. Les journaux sont acheminés directement vers le journal systemd. Ils sont indexés par des champs de métadonnées du conteneur plutôt que d'être rattachés à l'unité docker.service.

Sur le plan opérationnel, journald gère ces journaux à l'aide de limites concrètes définies dans /etc/systemd/journald.conf, notamment SystemMaxUse, RuntimeMaxUse et MaxRetentionSec. Cela comporte un risque important en termes de rayon d'impact (blast radius) : en production, l'épuisement de journald peut affecter la journalisation ssh, les journaux du noyau, les journaux d'audit et tous les autres services qui partagent le journal. Notez que les options max-size et max-file ne s'appliquent qu'aux pilotes json-file et local, et non à journald.

Pour appliquer les modifications de la configuration de journald :

sudo systemctl restart systemd-journald # Or to trigger immediate rotation without a full restart: sudo systemctl kill -s SIGUSR2 systemd-journald

Tip

Utilisez les journaux Docker via journald pour les déploiements dans des environnements où les journaux sont collectés directement depuis le journal système.

Étape 4 : Gérer la sortie de journalctl

Lorsque vous configurez la rotation des journaux Docker via journald, vous consultez les journaux avec journalctl au lieu de docker logs. Le service journald traite ces journaux de façon centralisée.

Pour afficher les journaux d'un conteneur précis avec les journaux Docker dans journald, exécutez :

journalctl CONTAINER_NAME=<YOUR_CONTAINER_NAME> -o cat

Tip

Si vous préférez filtrer par identifiant plutôt que par nom, utilisez CONTAINER_ID_FULL=$(docker inspect -f '{{.Id}}' <YOUR_CONTAINER_NAME>) pour l'identifiant complet, ou faites passer l'identifiant par cut -c1-12 afin d'obtenir la forme courte stockée dans CONTAINER_ID. Le champ _CONTAINER_ID appartient à systemd-cgroup et ne correspond pas à l'identifiant du conteneur Docker.

Sortie attendue :

Application started successfully

Étape 5 : Vérification

Pour vérifier la configuration du pilote de journalisation Docker sur un conteneur en cours d'exécution, lancez un conteneur de test :

docker run -d --name log-test nginx:latest

Inspectez les options de journalisation du conteneur :

docker inspect -f '{{.HostConfig.LogConfig.Type}}' log-test

Sortie attendue pour le pilote local :

local

Si vous avez configuré journald, la sortie sera journald.

Vérifiez les paramètres appliqués pour le pilote local :

docker inspect -f '{{.HostConfig.LogConfig.Config}}' log-test

Sortie attendue :

map[max-file:3 max-size:50m]

Cela confirme que votre configuration de journalisation Docker dans daemon.json a bien appliqué les paramètres max-size et max-file des journaux Docker. Notez que journald n'expose pas ici les options max-size ou max-file, car la rotation est déléguée au système d'exploitation.

Utilisez cette commande pour identifier les conteneurs préexistants qui utilisent encore l'ancien pilote. Le pilote de journalisation est fixé à la création du conteneur : ces conteneurs doivent être recréés (par exemple avec docker compose up -d --force-recreate) pour hériter de la nouvelle configuration :

docker ps -aq | xargs -r docker inspect -f '{{.Name}}: {{.HostConfig.LogConfig.Type}}'

Annulation des modifications

Pour rétablir la configuration globale du pilote de journalisation au format par défaut, supprimez la configuration de daemon.json.

Supprimez le fichier (sauvegardez toujours les fichiers de configuration avant de les modifier) et redémarrez le service Docker :

sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak.$(date +%F) sudo rm /etc/docker/daemon.json sudo systemctl restart docker

Warning

L'annulation de ces modifications supprime immédiatement les limites pour tous les conteneurs créés par la suite, avec un risque d'épuisement de l'espace disque s'ils génèrent de gros volumes de journaux.

Warning

Si /etc/docker/daemon.json contient d'autres paramètres du démon sans rapport (miroirs de registre, pilote de stockage, DNS, MTU, insecure-registries, etc.), la suppression du fichier les supprimera également. Sauvegardez d'abord le fichier (comme indiqué plus haut) ou modifiez-le manuellement pour ne retirer que les sections log-driver et log-opts.

Dépannage

  • journalctl ne renvoie aucune sortie pour CONTAINER_ID : le pilote journald de Docker écrit l'identifiant court de 12 caractères dans CONTAINER_ID, alors que docker inspect renvoie l'identifiant complet de 64 caractères. Utilisez plutôt CONTAINER_NAME ou CONTAINER_ID_FULL.
  • Les conteneurs existants utilisent toujours json-file après le redémarrage : la commande docker update ne modifie pas le pilote de journalisation. Vous devez recréer le conteneur (par exemple avec docker compose down puis up) pour appliquer le nouveau pilote de journalisation.
  • max-size et max-file n'ont aucun effet avec journald : la rotation des journaux pour journald est gérée globalement via /etc/systemd/journald.conf (par exemple SystemMaxUse), et non par les log-opts de Docker.

Conclusion

Gérer correctement la sortie des conteneurs est un élément fondamental d'une infrastructure fiable. En choisissant judicieusement entre les pilotes json-file et local de Docker, vous évitez les problèmes de stockage. Que vous configuriez la rotation des journaux Docker avec le léger pilote de fichiers local (local) de Docker ou que vous vous intégriez nativement via la journalisation Docker avec journald, votre environnement est désormais prêt à traiter en toute sécurité de gros flux de journaux. L'application de ces bonnes pratiques de rotation des journaux Docker garantit que la configuration de votre pilote de journalisation Docker reste stable et que les ressources de votre hôte demeurent prévisibles.

Version du document : 1.0
Dernière mise à jour : mai 2026
Responsable : Équipe de documentation technique

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA