Docker Log Rotation: Evitare la Saturazione Disco con daemon.json
Il classico incubo su server Linux, VPS e NAS: il disco improvvisamente al 100% per colpa dei file json-log di Docker mai ruotati. Ecco come diagnosticare, troncare e impostare la rotazione globale persistente.
json-file) memorizza l'output standard (stdout/stderr) di ogni container in un singolo file sul disco host che cresce all'infinito fino a saturare /var/lib/docker/ e mandare in crash il sistema operativo.
1. Diagnosi Rapida dello Spazio Occupato
Per scoprire se i log di Docker stanno divorando lo spazio del tuo server:
# Visualizza riepilogo generale dello storage Docker
docker system df
# Trova i file di log più pesanti ordinati per dimensione
sudo find /var/lib/docker/containers/ -name "*-json.log" -exec du -h {} + | sort -hr | head -n 10
Non è raro scoprire file di log singoli che superano i 20 o 50 GB per container molto chiacchieroni (es. database o reverse proxy).
2. Configurazione Globale in /etc/docker/daemon.json
La soluzione definitiva consiste nell'istruire il demone Docker a troncare e ruotare i file di log per tutti i container creati sul sistema.
Modifica o crea il file /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "3"
}
}
Con questa configurazione:
- Ogni file di log non supererà mai i 20 MB.
- Docker conserverà al massimo 3 file ruotati per container (spazio massimo per container: ~60 MB).
- I log più vecchi verranno eliminati automaticamente senza richiedere alcun intervento manuale.
3. Applicare le Modifiche al Demone Docker
Ricarica la configurazione del demone di sistema:
sudo systemctl reload docker
# Oppure riavvia il servizio se la distribuzione non supporta il reload a caldo
sudo systemctl restart docker
daemon.json si applicano solo ai nuovi container. Per applicarle ai container già attivi, è sufficiente ricrearli (ad esempio con docker compose up -d --force-recreate).
4. Come Svuotare Immediatamente i Log Esistenti Senza Crash
NON usare mai rm per cancellare un file di log attivo! Il processo manterrà aperto il file descriptor e il filesystem non libererà un singolo megabyte.
Usa il comando truncate per azzerare la dimensione all'istante:
# Azzera in sicurezza tutti i file di log esistenti
sudo find /var/lib/docker/containers/ -name "*-json.log" -exec truncate -s 0 {} +
Lo spazio su disco verrà liberato immediatamente in millisecondi senza interrompere i container in esecuzione.
❓ Domande Frequenti (FAQ Tecniche)
Perché Docker non abilita la rotazione di default?
Docker predilige la conservazione integrale dei dati di debug di default, delegando all'amministratore di sistema la policy di rotazione opportuna per l'ambiente di produzione.
Posso configurare la rotazione solo per un singolo container?
Sì, puoi definire la sezione logging: options: max-size: "10m" max-file: "3" direttamente all'interno del blocco del servizio nel tuo file docker-compose.yml.
Qual è la differenza tra driver 'json-file' e 'local'?
Il driver local salva i log in formato binario compresso e ha la rotazione abilitata di default (100MB e 5 file), ma potrebbe non essere supportato da alcuni vecchi log-collector esterni che si aspettano JSON puro.