Recuperare spazio su disco è una delle attività di manutenzione più comuni e critiche per chi gestisce ambienti Docker. Immagini obsolete, container fermi, volumi orfani e, soprattutto, log non gestiti possono saturare rapidamente lo storage, portando a rallentamenti, errori nelle build e, nei casi peggiori, al blocco completo del servizio. Ho visto server andare in crash per un disco pieno, in un ambiente enterprise con centinaia di container, con conseguente interruzione di servizi cruciali e ore di lavoro per ripristinare la normalità. La chiave è la prevenzione e una pulizia proattiva, non reattiva, e in questo articolo vedremo come farlo in modo efficace, utilizzando i comandi giusti e configurando Docker per una gestione ottimale dello spazio.
Testato su: Ubuntu 24.04 LTS · Docker Engine 26.1 · Ottobre 2026
Prerequisiti / Ambiente di test
Per seguire questa guida, avrai bisogno di un sistema Linux con Docker installato e funzionante. L’accesso SSH con privilegi di sudo è necessario per alcune operazioni di configurazione e riavvio del demone Docker. Assicurati di avere familiarità con i concetti base di Docker, come immagini, container e volumi.
Capire dove va lo spazio: docker system df
Il primo passo per liberare spazio è capire dove viene consumato. Docker offre un comando specifico che fornisce una panoramica dettagliata dell’utilizzo del disco per le sue componenti. Questo è il punto di partenza per ogni strategia di pulizia.
docker system df -v
L’output di questo comando ti mostrerà l’utilizzo del disco per immagini, container, volumi e cache di build, distinguendo tra elementi attivi e quelli che possono essere recuperati. Il flag -v (verbose) fornisce dettagli aggiuntivi, inclusi i dati sui volumi.
| Componente | Descrizione |
|---|---|
| Images | Immagini Docker scaricate o create localmente |
| Containers | Spazio occupato dai container (layer scrivibili) |
| Local Volumes | Dati persistenti montati dai container |
| Build Cache | Cache utilizzata dal builder Docker per velocizzare le build successive |
Leggi anche: Certctl e Docker Compose: Gestione Semplice di Certificati TLS Self-Hosted
Immagini inutilizzate e dangling
Le immagini Docker possono occupare una quantità significativa di spazio. Spesso, dopo aggiornamenti o rebuild, rimangono sul sistema immagini obsolete o “dangling” (non più associate a un tag o a un container). docker image prune è il comando per gestirle.
Per rimuovere tutte le immagini non utilizzate (quelle non associate a nessun container):
docker image prune
Per rimuovere tutte le immagini non utilizzate, incluse quelle non associate a container o a tag (le cosiddette immagini “dangling”), aggiungi il flag -a:
docker image prune -a
Se vuoi essere più selettivo e rimuovere solo le immagini più vecchie di un certo periodo, puoi usare il filtro until:
docker image prune -a --filter "until=168h" # Rimuove immagini più vecchie di 7 giorni (168 ore)
Container fermi e volumi orfani
Anche i container fermi e i volumi non più in uso possono accumularsi. Un container fermo mantiene il suo layer scrivibile sul disco, mentre un volume orfano è un volume persistente che non è più collegato a nessun container attivo.
Per rimuovere tutti i container fermi:
docker container prune
Per identificare e rimuovere i volumi orfani, che spesso contengono dati non più necessari:
docker volume ls -f dangling=true
Dopo aver verificato che questi volumi non siano più necessari, puoi rimuoverli con:
docker volume prune
La cache di build
Durante il processo di build di un’immagine Docker, vengono creati layer intermedi che possono rimanere come cache. Questa cache è utile per velocizzare le build successive, ma può occupare molto spazio, specialmente in ambienti di sviluppo o CI/CD con molte build.
Per pulire la cache di build:
docker builder prune
Questo comando rimuove i layer intermedi non più referenziati da alcuna immagine. Leggi anche: Docker vs Podman: Quale Container Runtime Scegliere nel 2026
Log dei container che crescono senza limite
Un problema spesso sottovalutato è la crescita incontrollata dei log dei container. Per impostazione predefinita, Docker non impone limiti alla dimensione dei file di log, che possono raggiungere dimensioni considerevoli e saturare il disco in ambienti con container molto “verbosi”.
Per individuare i file di log più grandi, puoi usare questo comando:
sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail
Questo ti mostrerà i 10 file di log Docker più grandi, permettendoti di identificare i container che generano più output.
Configurare la rotazione dei log in daemon.json
La soluzione definitiva per i log è configurare la rotazione direttamente nel demone Docker. Questo impedisce ai log di crescere indefinitamente, limitandone la dimensione e il numero di file mantenuti. Devi modificare il file /etc/docker/daemon.json.
Se il file non esiste, crealo. Aggiungi o modifica la sezione log-driver e log-opts come segue:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
In questo esempio:
"max-size": "10m": ogni file di log avrà una dimensione massima di 10 megabyte."max-file": "3": verranno mantenuti al massimo 3 file di log per container. Quando il primo file raggiunge i 10MB, viene ruotato, e il più vecchio dei 3 viene eliminato.
Dopo aver modificato il file daemon.json, è necessario riavviare il servizio Docker per applicare le modifiche:
sudo systemctl restart docker
Leggi anche: Creare Servizio systemd: Riavvio Automatico e Dipendenze
Cosa NON cancellare: volumi con dati
È cruciale fare attenzione quando si rimuovono i volumi. I volumi sono progettati per la persistenza dei dati. Se un volume contiene dati importanti (ad esempio, un database, configurazioni di applicazioni, file caricati dagli utenti), la sua eliminazione comporterà una perdita irreversibile di tali dati. Utilizza sempre docker volume ls per listare i volumi e docker volume inspect per esaminarne il contenuto o l’associazione a container prima di procedere con la rimozione. Il comando docker volume ls -f dangling=true è sicuro perché mostra solo i volumi che non sono più associati a nessun container attivo, indicando che probabilmente sono orfani e non più in uso.
Pulizia automatica programmata
La migliore strategia è automatizzare la pulizia. Puoi creare uno script e programmarlo con cron o systemd timers per eseguire regolarmente i comandi docker system prune e docker builder prune. Ad esempio, per eseguire una pulizia ogni domenica notte:
Crea uno script shell, ad esempio /usr/local/bin/docker-cleanup.sh:
#!/bin/bash
echo "$(date): Avvio pulizia Docker..."
docker system prune -af --filter "until=168h" # Rimuove immagini/container/volumi non usati da 7 giorni
docker builder prune -f # Pulisce la cache di build
echo "$(date): Pulizia Docker completata."
Rendi lo script eseguibile:
sudo chmod +x /usr/local/bin/docker-cleanup.sh
Poi, aggiungi una voce a crontab (ad esempio, sudo crontab -e per l’utente root) per eseguirlo settimanalmente:
0 3 * * 0 /usr/local/bin/docker-cleanup.sh >> /var/log/docker-cleanup.log 2>&1
Questo eseguirà lo script ogni domenica alle 03:00 del mattino, reindirizzando l’output a un file di log. Il flag -f (force) in prune è cruciale per l’automazione, poiché sopprime le richieste di conferma interattive. Leggi anche: Comando find Linux: 20 Esempi Pratici
Errori comuni e troubleshooting
- “Cannot connect to the Docker daemon”: Assicurati che il servizio Docker sia in esecuzione (
sudo systemctl status docker) e che il tuo utente abbia i permessi corretti (sia nel gruppodocker). - Pulizia insufficiente: Se dopo aver eseguito i comandi lo spazio non si libera significativamente, rivedi l’output di
docker system df -v. Potrebbe esserci un volume dati molto grande che non è stato identificato o che non può essere rimosso. Verifica anche i log non gestiti manualmente prima di configurare la rotazione. - Perdita di dati: La rimozione indiscriminata di volumi può portare alla perdita di dati. Fai sempre un backup o verifica attentamente l’uso di un volume prima di eliminarlo.
docker volume ls -f dangling=trueè il tuo amico.
FAQ — Domande Frequenti
Con quale frequenza dovrei eseguire la pulizia di Docker?
Dipende dall’intensità del tuo utilizzo di Docker. Per ambienti di sviluppo o CI/CD con build frequenti, una pulizia giornaliera o settimanale può essere appropriata. Per server di produzione stabili, una pulizia mensile o bimestrale potrebbe essere sufficiente. L’importante è monitorare regolarmente lo spazio su disco con docker system df e aggiustare la frequenza di conseguenza.
docker system prune rimuove anche i container in esecuzione?
No, docker system prune e i suoi sottocomandi (image prune, container prune, volume prune, builder prune) sono progettati per rimuovere solo gli elementi non utilizzati o fermi. I container in esecuzione, le immagini usate da container in esecuzione e i volumi montati da container attivi non verranno toccati da questi comandi, a meno che non si usino flag come -a o -f in contesti specifici e ben compresi.
Posso annullare una pulizia di Docker?
Generalmente no. Una volta che un’immagine, un container o un volume vengono rimossi con i comandi prune, i dati associati vengono eliminati in modo permanente. È fondamentale essere sicuri di ciò che si sta rimuovendo prima di eseguire questi comandi, specialmente in produzione. I backup regolari sono la tua unica vera assicurazione contro la perdita di dati.
La rotazione dei log in daemon.json si applica anche ai container esistenti?
Sì, le impostazioni di log-driver e log-opts nel file daemon.json si applicano a tutti i nuovi container avviati dopo il riavvio del demone Docker. Per i container già in esecuzione prima della modifica, le nuove impostazioni non avranno effetto finché non verranno riavviati. È buona pratica riavviare tutti i container dopo aver modificato daemon.json per assicurare che le nuove regole di rotazione dei log vengano applicate universalmente.
Conclusioni con takeaway operativi
La gestione dello spazio su disco in ambienti Docker non è un’opzione, ma una necessità. Ignorare l’accumulo di immagini, container e log può portare a problemi di performance e stabilità del sistema, con costi operativi significativi. Utilizzare docker system df -v per un’analisi approfondita, combinare i comandi prune per una pulizia efficace e configurare la rotazione dei log tramite daemon.json sono passaggi fondamentali. Automatizzare queste operazioni con cron o systemd timers è il passo finale per un ambiente Docker resiliente e performante. Ricorda sempre di verificare attentamente ciò che stai rimuovendo, specialmente i volumi, per evitare perdite di dati irrecuperabili.
Fonti
Aggiornato: Ottobre 2026