Aller au contenu
Conteneurs & Orchestration medium

Configurer le daemon Docker (daemon.json)

17 min de lecture

logo docker

  • daemon.json : emplacement, structure, options principales
  • Storage drivers : overlay2, btrfs, zfs — choix et configuration
  • Logging drivers : json-file, journald, fluentd, splunk
  • Registries : mirrors, insecure registries, authentification
  • Ressources : limites par défaut, cgroups, ulimits
  • Production : live restore, userland proxy, metrics

Le fichier daemon.json est le cœur de la configuration de Docker Engine. Il permet de personnaliser le comportement du daemon sans modifier les arguments de ligne de commande systemd. Ce guide couvre toutes les options importantes pour configurer Docker en production : du choix du storage driver à l’exposition des métriques Prometheus.

  • Accès root ou sudo
  • Docker Engine installé (pas Docker Desktop)
  • Éditeur de texte (vim, nano)

Le fichier de configuration du daemon Docker varie selon le système d’exploitation.

SystèmeEmplacement
Linux/etc/docker/daemon.json
WindowsC:\ProgramData\docker\config\daemon.json
macOS (Docker Desktop)~/.docker/daemon.json

Création du fichier sur Linux :

Fenêtre de terminal
# Créer le répertoire si nécessaire
sudo mkdir -p /etc/docker
# Créer le fichier avec une configuration minimale
sudo tee /etc/docker/daemon.json << 'EOF'
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
EOF
# Redémarrer Docker
sudo systemctl restart docker

Le fichier daemon.json utilise le format JSON standard. Chaque option doit respecter la syntaxe JSON stricte.

Règles de syntaxe :

  • Pas de virgule après le dernier élément
  • Les chaînes entre guillemets doubles (")
  • Les booléens en minuscules (true, false)
  • Pas de commentaires (JSON ne les supporte pas)

Exemple de structure :

{
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65535,
"Soft": 65535
}
},
"live-restore": true,
"debug": false
}

Validez toujours le fichier avant de redémarrer Docker :

Fenêtre de terminal
# Validation par dockerd
sudo dockerd --validate
# Alternative simple avec jq
jq . /etc/docker/daemon.json

Le storage driver gère le système de fichiers des images et conteneurs. Le choix du driver impacte les performances et la compatibilité.

DriverKernelPerformanceRecommandé
overlay24.0+Excellente✅ Oui
btrfsbtrfsBonneSystèmes btrfs
zfszfsBonneSystèmes ZFS
devicemapper2.6.9+Moyenne⚠️ Déprécié
vfsToutTrès mauvaiseDebug uniquement
aufsPatchBonne❌ Obsolète

overlay2 est le driver par défaut et recommandé depuis Docker 18.09. Il utilise OverlayFS du kernel Linux, offrant d’excellentes performances avec le mécanisme copy-on-write.

Vérifier le driver actuel :

Fenêtre de terminal
docker info | grep "Storage Driver"
# Storage Driver: overlay2
{
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}

Options overlay2 :

OptionDescription
overlay2.override_kernel_checkIgnorer la vérification de version kernel
overlay2.sizeLimiter la taille par conteneur (nécessite quota)

En production, utilisez une partition dédiée pour les données Docker. Cela permet :

  • D’isoler l’espace disque Docker
  • D’utiliser un filesystem adapté (ext4, xfs)
  • De faciliter les sauvegardes et migrations
  1. Créer et monter la partition

    Fenêtre de terminal
    # Formater la partition (exemple: /dev/sdb1)
    sudo mkfs.ext4 /dev/sdb1
    # Créer le point de montage
    sudo mkdir -p /mnt/docker-data
    # Monter la partition
    sudo mount /dev/sdb1 /mnt/docker-data
    # Ajouter au fstab pour montage automatique
    echo '/dev/sdb1 /mnt/docker-data ext4 defaults 0 2' | sudo tee -a /etc/fstab
  2. Migrer les données existantes

    Fenêtre de terminal
    # Arrêter Docker
    sudo systemctl stop docker
    # Copier les données
    sudo rsync -aP /var/lib/docker/ /mnt/docker-data/
    # Sauvegarder l'ancien répertoire
    sudo mv /var/lib/docker /var/lib/docker.bak
  3. Configurer daemon.json

    {
    "data-root": "/mnt/docker-data"
    }
  4. Redémarrer et vérifier

    /mnt/docker-data
    sudo systemctl start docker
    docker info | grep "Docker Root Dir"

Docker supporte plusieurs backends pour les logs des conteneurs. Le choix dépend de votre infrastructure de centralisation.

Le driver par défaut stocke les logs en JSON dans /var/lib/docker/containers/<id>/<id>-json.log.

{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"compress": "true",
"labels": "production_status,team"
}
}
OptionDescriptionExemple
max-sizeTaille max par fichier10m, 100k
max-fileNombre de fichiers en rotation3, 5
compressCompresser les fichiers rotéstrue
labelsLabels à inclure dans les logsenv,team

Consulter les logs :

Fenêtre de terminal
# Via docker logs
docker logs mycontainer
# Fichier direct
cat /var/lib/docker/containers/<id>/<id>-json.log | jq

Le driver journald envoie les logs au journal systemd. Intégration native avec les outils système Linux.

{
"log-driver": "journald",
"log-opts": {
"tag": "{{.Name}}/{{.ID}}"
}
}

Avantages :

  • Rotation automatique par journald
  • Métadonnées enrichies
  • Intégration journalctl

Consulter les logs :

Fenêtre de terminal
# Tous les conteneurs
journalctl -u docker.service
# Un conteneur spécifique
journalctl CONTAINER_NAME=mycontainer
# Avec l'ID
journalctl CONTAINER_ID=abc123

Pour les environnements de production, envoyez les logs vers un système centralisé.

{
"log-driver": "fluentd",
"log-opts": {
"fluentd-address": "localhost:24224",
"tag": "docker.{{.Name}}",
"fluentd-async": "true"
}
}
OptionDescription
fluentd-addressAdresse du collecteur Fluentd
tagTag pour le routage
fluentd-asyncMode asynchrone (recommandé)

Les registry mirrors agissent comme cache local pour Docker Hub. Ils réduisent la bande passante et évitent les rate limits.

{
"registry-mirrors": [
"https://mirror.gcr.io",
"https://registry.example.com"
]
}

Fonctionnement :

  1. docker pull nginx interroge d’abord le mirror
  2. Si l’image est en cache, téléchargement local (rapide)
  3. Sinon, le mirror télécharge depuis Docker Hub et met en cache

Vérifier la configuration :

Fenêtre de terminal
docker info | grep -A5 "Registry Mirrors"

Pour les registries internes sans HTTPS ou avec certificats auto-signés :

{
"insecure-registries": [
"registry.local:5000",
"192.168.1.100:5000"
]
}

L’authentification aux registries est stockée dans ~/.docker/config.json (par utilisateur, pas dans daemon.json).

Fenêtre de terminal
# Connexion interactive
docker login registry.example.com
# Vérifier les credentials stockés
cat ~/.docker/config.json

Credential helpers pour stockage sécurisé :

{
"credHelpers": {
"gcr.io": "gcloud",
"*.dkr.ecr.*.amazonaws.com": "ecr-login"
}
}

Live restore maintient les conteneurs en fonctionnement pendant un redémarrage du daemon Docker.

{
"live-restore": true
}

Cas d’usage :

  • Mise à jour de Docker sans interruption de service
  • Récupération après crash du daemon
  • Maintenance du daemon

Limitations :

  • Ne fonctionne pas si arrêt manuel (systemctl stop docker)
  • Les options de runtime ne doivent pas changer entre les versions

Vérification :

Fenêtre de terminal
# Redémarrer le daemon
sudo systemctl restart docker
# Les conteneurs doivent toujours tourner
docker ps

Exposez les métriques Docker au format Prometheus pour le monitoring.

{
"metrics-addr": "0.0.0.0:9323",
"experimental": true
}

Métriques disponibles :

MétriqueDescription
engine_daemon_container_states_containersConteneurs par état
engine_daemon_image_actions_secondsDurée des opérations images
engine_daemon_network_actions_secondsDurée des opérations réseau
process_cpu_seconds_totalCPU utilisé par le daemon

Accès aux métriques :

Fenêtre de terminal
curl http://localhost:9323/metrics

Configuration Prometheus (prometheus.yml) :

scrape_configs:
- job_name: 'docker'
static_configs:
- targets: ['docker-host:9323']

Définissez des limites appliquées à tous les conteneurs par défaut.

{
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65535,
"Soft": 65535
},
"nproc": {
"Name": "nproc",
"Hard": 4096,
"Soft": 4096
}
},
"default-shm-size": "64M"
}
OptionDescription
nofileLimite de descripteurs de fichiers
nprocLimite de processus
default-shm-sizeTaille de /dev/shm

Surcharge par conteneur :

Fenêtre de terminal
docker run --ulimit nofile=1024:2048 myapp

Le userland proxy gère le port forwarding en espace utilisateur. Le désactiver améliore les performances mais peut causer des problèmes avec localhost.

{
"userland-proxy": false
}

Avantages désactivé :

  • Meilleures performances réseau
  • Moins de processus (pas de docker-proxy)

Inconvénients :

  • Problèmes avec connexions localhost vers conteneurs
  • Incompatibilité avec certains scénarios hairpin

Activez le support IPv6 natif pour les conteneurs.

{
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64"
}
OptionDescription
ipv6Active IPv6 sur le bridge par défaut
fixed-cidr-v6Plage d’adresses IPv6 pour les conteneurs

Vérification :

Fenêtre de terminal
docker run --rm alpine ip -6 addr show eth0
Fenêtre de terminal
# Validation complète par dockerd
sudo dockerd --validate
# Validation JSON simple
jq . /etc/docker/daemon.json
# Valider et voir les valeurs par défaut
sudo dockerd --config-file /etc/docker/daemon.json --validate

Certaines options peuvent être appliquées sans redémarrer le daemon (rechargement à chaud via SIGHUP), tandis que d’autres nécessitent un redémarrage complet. Cette distinction est importante en production pour minimiser les interruptions.

OptionReload (SIGHUP)Restart
debug
labels
live-restore
max-concurrent-downloads
max-concurrent-uploads
shutdown-timeout
storage-driver
data-root
log-driver
default-runtime
Fenêtre de terminal
# Reload (options compatibles)
sudo systemctl reload docker
# ou
sudo kill -SIGHUP $(pidof dockerd)
# Restart (toutes les options)
sudo systemctl restart docker

Voici une configuration de référence pour un environnement de production :

{
"storage-driver": "overlay2",
"data-root": "/mnt/docker-data",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "5",
"compress": "true"
},
"live-restore": true,
"userland-proxy": false,
"no-new-privileges": true,
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65535,
"Soft": 65535
}
},
"default-shm-size": "64M",
"registry-mirrors": [
"https://mirror.gcr.io"
],
"metrics-addr": "127.0.0.1:9323",
"experimental": true,
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5
}

Points clés de cette configuration :

  • overlay2 : storage driver performant
  • data-root : partition dédiée
  • Rotation logs : évite de remplir le disque
  • live-restore : continuité de service
  • no-new-privileges : sécurité par défaut
  • Métriques : monitoring Prometheus (localhost uniquement)
Fenêtre de terminal
# Logs systemd
journalctl -u docker.service -f
# Mode debug
sudo dockerd --debug

Les erreurs de configuration du daemon empêchent généralement Docker de démarrer. Voici les messages d’erreur les plus fréquents et leurs solutions.

ErreurCauseSolution
invalid characterErreur JSONValider avec jq
unable to configure the Docker daemon with fileOption invalideVérifier la documentation
Error starting daemon: error initializing graphdriverStorage driver incompatibleSupprimer /var/lib/docker
daemon not runningErreur de configConsulter journalctl -u docker
permission deniedDroits fichierchmod 644 daemon.json
Fenêtre de terminal
# Arrêter Docker
sudo systemctl stop docker
# Sauvegarder et supprimer la config
sudo mv /etc/docker/daemon.json /etc/docker/daemon.json.bak
# Redémarrer avec config par défaut
sudo systemctl start docker
  1. daemon.json se trouve dans /etc/docker/ sur Linux et n’existe pas par défaut
  2. overlay2 est le storage driver recommandé pour les kernels modernes
  3. Rotation des logs obligatoire avec max-size et max-file
  4. registry-mirrors accélèrent les pulls et évitent les rate limits
  5. live-restore maintient les conteneurs pendant les redémarrages daemon
  6. Validez toujours avec dockerd --validate avant de redémarrer
  7. Certaines options nécessitent un restart complet, d’autres supportent reload
  8. Partition dédiée pour /var/lib/docker en production

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

10 questions
10 min.
70%

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre