Docker Prune: Una guida completa con esempi pratici

Se lavori quotidianamente con Docker, sai quanto rapidamente può consumare spazio su disco.  

Col passare del tempo, il tuo sistema accumula immagini, container, volumi e reti inutilizzati. Questi rimangono principalmente inattivi, occupando spazio di archiviazione prezioso e potenzialmente impedendoti di lavorare sul tuo progetto attuale. Fortunatamente, Docker fornisce comandi di pulizia integrati che rimuovono facilmente le risorse non necessarie.  

Questi comandi di pulizia fanno parte della famiglia docker prune, e oggi imparerai tutto su di essi. Diventeranno rapidamente la tua soluzione principale per liberare spazio su disco.  

Cominciamo con una breve panoramica prima di passare agli esempi pratici.  

Sei nuovo su Docker? Dai un’occhiata alla nostra guida su come imparare Docker da zero per i professionisti dei dati per metterti rapidamente al passo.  

Cos’è Docker Prune?  

Il termine “Docker Prune” si riferisce tipicamente a un insieme di comandi progettati per aiutarti a rimuovere risorse Docker inutilizzate e non necessarie.  

Col passare del tempo, specialmente se lavori su più progetti, creerai innumerevoli immagini, eseguirai container e configurerai volumi e reti. Tutto ciò si accumula sul tuo sistema, occupando una quantità significativa di spazio su disco. Lo scopo di docker prune è quello di ripulire quel disordine e recuperare spazio di archiviazione.  

Ciò detto, c’è di più nel comando docker prune di quanto si veda.  

Non si tratta solo di un singolo comando che puoi eseguire. Beh, potresti farlo, ma a volte hai bisogno di un controllo granulare su cosa viene rimosso. Ed è qui che entra in gioco questo articolo. Ti mostrerà come gestire il pruning in modo efficace, garantendo di eliminare solo ciò che intendi e come esercitarti in un ambiente sicuro per evitare di rimuovere accidentalmente dati importanti.  

Vale anche la pena notare che i comandi di potaturarimuovono solo le risorse che non sono attivamente in uso. Immagini, volumi e reti referenziate dai container in esecuzione non verranno eliminati. In altre parole, la potatura non interferirà con i carichi di lavoro attivi.  

Nella sezione successiva, ti guideremo attraverso i diversi tipi di comandi di potatura e spiegheremo come si integrano nel tuo flusso di lavoro.  

Vuoi aggiungere Docker al tuo CV o portafoglio? Queste 10 idee progetto Docker ti renderanno pronto per il lavoro.

Tutti i Comandi di Potatura Docker con Esempi Pratici

Docker fornisce diversi comandi prune che ti consentono di eliminare singolarmente o tutti in una volta le risorse non utilizzate. In questa sezione, imparerai a conoscerli, sia attraverso la teoria e esempi pratici.  

docker system prune  

Questo è il comando più completo per recuperare spazio su disco. Rimuove tutti i container, reti, immagini e cache di build non utilizzati in un’unica operazione.  

Se stai cercando un modo rapido per liberare spazio su disco con un singolo comando, questo è quello da usare.

Puoi passare opzioni al comando docker system prune:

  • -a o --all rimuove tutte le immagini non utilizzate anziché solo quelle “dangling” (immagini che non sono contrassegnate o referenziate da nessun container).
  • --filter ti permette di specificare valori di filtro.
  • -f o --force salta la richiesta di conferma.
  • --volumes elimina anche i volumi anonimi insieme ai contenitori, alle reti, alle immagini e alla cache di compilazione.  

Per impostazione predefinita, docker system prune richiede conferma poiché si tratta di un’operazione potenzialmente distruttiva:  

Immagine 1 – Prompt di conferma di Docker system prune

Per evitare il prompt e rimuovere tutte le immagini, i contenitori, le reti e i volumi non utilizzati con un singolo comando, eseguire:  

docker system prune -a -f --volumes

Immagine 2 – Rimuovi tutto con un singolo comando docker system prune

Ma cosa succede se hai bisogno di un controllo più dettagliato? Vediamo questo prossimamente.

docker container prune

In poche parole, questo comando rimuove tutti i container fermi.

I container interrotti rimangono nel sistema fino a quando non vengono rimossi manualmente. Possono occupare spazio su disco e essere difficili da individuare a meno che non si utilizzi uno strumento come Docker Desktop Dashboard.

Come docker system prune, questo comando supporta le opzioni:

  • --filter ti permette di specificare coppie chiave-valore per controllare quali container vengono rimossi.
  • -f o --force salta il prompt di conferma.

Ecco un elenco dei contenitori non in esecuzione:

Immagine 3 – Elenco dei contenitori non in esecuzione

Per rimuovere code-server (e qualsiasi altro contenitore arrestato), esegui:

docker container prune -f

Questo non ti chiederà conferma e, entro pochi secondi, vedrai un output come questo:

Immagine 4 – Messaggio di output della potatura del contenitore

E così, non ci sono più contenitori arrestati:

Immagine 5 – Elenco dei container non in esecuzione (2)

Adesso, occupiamoci delle immagini non utilizzate.

docker image prune

Simile al comando precedente, docker image prune rimuove le immagini non utilizzate.

Per impostazione predefinita, rimuove solo le immagini pendenti, cioè le immagini senza tag e non associate a un container. È possibile utilizzare un flag opzionale per rimuovere tutte le immagini non utilizzate, non solo quelle pendenti.

Ecco un elenco delle opzioni disponibili

  • -a o --all rimuove tutte le immagini non utilizzate anziché solo quelle pendenti.
  • --filter ti permette di specificare coppie chiave-valore per controllare quali immagini vengono rimosse.
  • -f o --force salta la richiesta di conferma.

Ora, vediamolo in azione!

Ecco un elenco di immagini attualmente presenti nel sistema:

Immagine 6 – Elenco delle immagini Docker

Per rimuoverle tutte con un unico comando, esegui:

docker image prune -a -f

Vedrai un output del genere nel terminale:

Immagine 7 – Messaggio di output della potatura dell’immagine

In seguito, non rimangono immagini in Docker Desktop:

Immagine 8 – Elenco delle immagini Docker (2)

Successivamente, gestiamo i volumi non utilizzati.

docker volume prune

Come suggerisce il nome, il comando docker volume prune rimuove tutti i volumi locali non utilizzati. In altre parole, elimina i volumi che non sono referenziati da alcun container.

Per impostazione predefinita, il comando rimuove solo volumi anonimi – volumi senza nome creati da Docker quando un contenitore viene avviato. Per rimuovere i volumi esplicitamente nominati, è necessario passare un’opzione aggiuntiva.

Ecco le opzioni disponibili:

  • -a o --all rimuove tutti i volumi non utilizzati anziché solo quelli anonimi.
  • --filter ti consente di specificare coppie chiave-valore per controllare quali volumi vengono rimossi.
  • -f o --force salta la richiesta di conferma.

Nel nostro sistema, abbiamo un unico volume creato dall’utente da un file docker-compose.yml:

Immagine 9 – Elenco dei volumi Docker

Il comando seguente rimuove tutti i volumi locali:

docker volume prune -a -f

Dopo averlo eseguito, vedrai un output simile a questo:

Immagine 10 – Messaggio di output della potatura del volume

Al momento, non rimangono volumi:

Immagine 11 – Elenco dei volumi Docker (2)

Infine, vediamo come eliminare le reti non utilizzate.

docker network prune

Quando i container Docker comunicano tra loro, spesso utilizzano reti definite dall’utente. Tuttavia, le loro reti di solito rimangono sul sistema una volta che quei container vengono rimossi.

Il comando docker network prune rimuove le reti che non sono più in uso da parte di nessun container.

Come gli altri comandi prune, include alcune opzioni:

  • --filter ti permette di specificare coppie chiave-valore per controllare quali reti vengono rimosse.
  • -f o --force salta il prompt di conferma.

A differenza delle immagini, dei container o dei volumi, non puoi ispezionare visivamente le reti tramite Docker Desktop, quindi dovrai lavorare dalla riga di comando. Ecco un elenco delle reti disponibili:

Immagine 12 – Elenco delle reti Docker

Per rimuovere tutte le reti non associate all’installazione predefinita di Docker, eseguire il seguente comando:

docker network prune -a -f

Dopo aver eseguito il comando, vedrai un output come questo:

Immagine 13 – Messaggio di output del pruning della rete

Tutte le reti associate ai container in esecuzione in precedenza sono ora scomparse:

Immagine 14 – Elenco delle reti Docker

Tuttavia, nota che le tre reti rimanenti sono essenziali affinché Docker funzioni correttamente e non possono essere rimosse.

E questo è tutto per l’uso di base dei comandi docker prune! Prossimamente, tratteremo argomenti avanzati come l’utilizzo sicuro di questi comandi e le migliori pratiche per ambienti di produzione e sensibili.

Utilizzare Docker Prune in modo sicuro  

I comandi docker prune aiutano a recuperare rapidamente spazio su disco, ma devono essere utilizzati con cautela, specialmente negli ambienti di produzione.  

L’eliminazione accidentale di contenitori, immagini o volumi importanti può causare la perdita di dati e interrompere flussi di lavoro critici. Per prevenirlo, è meglio capire cosa verrà rimosso prima di eseguire qualsiasi comando di pulizia.

Questa sezione spiega le precauzioni principali da prendere quando si esegue in modo sicuro il comando docker prune.

Comprensione di cosa verrà rimosso

I comandi prune sono progettati per rimuovere solo le risorse che non sono attualmente in uso.

Ad esempio, docker image prune elimina solo le immagini pendenti, mentre docker volume prune rimuove solo i volumi non collegati a nessun container. Tuttavia, aggiungere opzioni come -a -f rimuoverà tutte le immagini o i volumi senza richiedere conferma.  

Inoltre, in ambienti complessi, le dipendenze possono essere facili da trascurare, quindi controllare attentamente prima della pulizia è sempre una buona pratica.  

Prima di eseguire qualsiasi comando prune, dovresti ispezionare il tuo sistema per vedere quali risorse sono attualmente in uso. Ci sono diversi modi per farlo e esploreremo i più comuni in questa sezione. 

Usa questo comando per visualizzare tutti i container, inclusi quelli fermi:  

docker ps -a

Dovresti vedere un output simile a questo:

Immagine 15 – Elenco di tutti i contenitori Docker

Allo stesso modo, utilizza questo comando per elencare tutte le immagini, incluse quelle non utilizzate:  

docker images

L’output sarà strutturato in modo simile a quello sopra:  

Immagine 16 – Elenco di tutte le immagini Docker

Per controllare i volumi, esegui questo comando per elencare tutti i volumi:    

docker volume ls

Immagine 17 – Elenco di tutti i volumi Docker

Esamina attentamente questi output per assicurarti che nessuna risorsa critica venga eliminata per errore.  

Esecuzione a secco per sicurezza  

Purtroppo, Docker non ha ancora un’opzione integrata per un’esecuzione a secco del comando di potatura, anche se è stata richiesta anni fa.

Per questo motivo, è necessario ispezionare manualmente le risorse utilizzando i comandi elencati nella sezione precedente prima di eseguire un comando di pruning.  

Se stai lavorando in un ambiente sensibile dove la persistenza dei dati è fondamentale, dovresti sempre creare un backup prima di eseguire comandi di pruning che influiscono sui volumi.  

Ovviamente, queste sono solo misure precauzionali, ma speriamo di vedere presto implementata un’opzione di prova a secco.

Migliori pratiche per Docker Prune

Per mantenere il tuo ambiente Docker privo di ingombri inutili, è importante eseguire regolarmente comandi di prune, forse addirittura automatizzarli.

Questa sezione illustra le migliori pratiche per eseguire i comandi docker prune in ambienti di produzione.

Usare docker prune regolarmente

Col passare del tempo, Docker accumula immagini inutilizzate, container arrestati e volumi non necessari, i quali consumano un significativo spazio su disco.

L’esecuzione regolare dei comandi di potatura mantiene pulito l’ambiente e previene un uso eccessivo del disco. Dovresti includerli come parte del tuo programma di manutenzione.  

Ogni poche settimane è un buon punto di partenza, ma se la tua configurazione prevede la creazione e rimozione frequente di contenitori, considera un programma più frequente.  

Sii cauto in produzione  

Ogni lavoro in un ambiente di produzione richiede una cautela extra, e la potatura di Docker non fa eccezione.  

Un momento di distrazione può portare a tempi di inattività o perdita di dati, e non vuoi essere responsabile di ciò. Prima di eseguire comandi docker prune in un ambiente di produzione, ispeziona sempre le risorse di sistema usando docker ps -a, docker images e docker volume ls, come spiegato nella sezione precedente.

Inoltre, è una buona idea utilizzare comandi di potatura specifici invece del comando generale docker system prune, poiché potrebbe essere più facile riprendersi da eliminazioni non intenzionali.

Automatizzare la potatura di Docker

Un’altra buona pratica è ottimizzare gli sforzi di pulizia automatizzando i comandi docker prune utilizzando attività pianificate.

Su Linux, è possibile impostare un lavoro cron per eseguire i comandi a intervalli regolari, mentre su Windows è possibile utilizzare Task Scheduler per una automazione simile. Questo aiuta a mantenere un sistema ordinato senza bisogno di intervento manuale. Tuttavia, in un ambiente di produzione, assicurarsi che il pruning automatico non interferisca con i carichi di lavoro critici.  

Ad esempio, questo lavoro cron su Linux esegue un comando di pruning completo ogni domenica a mezzanotte:

0 0 * * 0 docker system prune -a -f

Soluzione dei problemi relativi a Docker Prune

I comandi docker prune sono una soluzione pratica per recuperare spazio su disco, ma potrebbero non essere sempre sufficienti per garantire spazio adeguato per scaricare nuove immagini o eseguire nuovi container.

Inoltre, potresti rimuovere accidentalmente risorse importanti, quindi è cruciale discutere delle strategie di ripristino.

Entrambi gli argomenti saranno trattati in questa sezione.

Problemi di spazio su disco

Le immagini Docker possono essere grandi—recentemente ne abbiamo avuta una di oltre 13GB—e siamo sicuri che ce ne siano di ancora più grandi là fuori. Quindi, anche dopo aver eseguito docker prune, potresti scoprire che il sistema ha ancora poco spazio su disco.

Per vedere esattamente quanto spazio viene utilizzato dalle immagini, dai contenitori e dai volumi, eseguire questo comando:  

docker system df

Immagine 18 – Spazio utilizzato da Docker

Quando si recupera spazio su disco con i comandi docker prune, aggiungere il flag -a per rimuovere tutte le immagini, i volumi o i contenitori, non solo quelli in sospeso o anonimi. Naturalmente, tenere presente gli eventuali svantaggi di questo approccio.  

Se il problema dello spazio su disco persiste, la tua unica opzione è aumentare lo spazio su disco disponibile.  

Recupero da rimozioni accidentali

Il recupero è più facile a dirsi che a farsi, ecco perché consigliamo di capire cosa verrà rimosso prima di eseguire effettivamente il comando di potatura.  

Tuttavia, se ti trovi in una situazione in cui hai potato accidentalmente contenitori, immagini o volumi importanti, inizia controllando i log per identificare cosa è stato rimosso.  

Su macOS, questo può essere fatto eseguendo i seguenti due comandi (opzioni per Windows e Linux):  

pred='process matches ".*(ocker|vpnkit).*" || (process in {"taskgated-helper", "launchservicesd", "kernel"} && eventMessage contains[c] "docker")' /usr/bin/log stream --style syslog --level=debug --color=always --predicate "$pred" /usr/bin/log show --debug --info --style syslog --last 30m --predicate "$pred" >/tmp/logs.txt

Eseguire questi comandi salverà gli ultimi 30 minuti dei log relativi a Docker in /tmp/logs.txt. Dovresti ispezionare questi log per determinare quali contenitori o immagini sono state eliminate.  

Per immagini eliminate, probabilmente puoi scaricarle di nuovo da un registro come Docker Hub. Un comando del genere dovrebbe fare al caso tuo:

docker pull <image_name>

E per contenitori eliminati, puoi sempre ricrearli se erano basati su immagini persistenti:

docker run --name <container_name> <image_name>

In alternativa, puoi ripristinare da backup se disponibili, che possono essere utilizzati per recuperare sia i dati del volume che del contenitore. In futuro, considera l’uso di strumenti per gli snapshot dei volumi per evitare la perdita di dati.

Tuttavia, la migliore strategia è ispezionare le risorse che verranno eliminate prima di eseguire un comando di potatura e procedere solo se sei assolutamente certo che non influirà sul tuo flusso di lavoro.

Riassumendo Docker Prune  

Per concludere, la famiglia di comandi docker prune è un modo potente per recuperare spazio su disco, ma comporta il rischio di eliminare accidentalmente risorse di cui hai bisogno, portando alla perdita di dati. Questo rischio è ancora maggiore quando si utilizzano i flag opzionali -a -f, che rimuoveranno tutto in modo forzato.

Tuttavia, la potatura rimane un metodo essenziale per mantenere il sistema pulito e organizzato.

Dovresti essere cauto, specialmente negli ambienti di produzione. Utilizza comandi come docker ps -a, docker images e docker volume ls prima di eseguire la pulizia per elencare tutti i container, le immagini e i volumi. Esegui il comando di pulizia solo dopo essere sicuro di voler eliminare le risorse elencate (ammesso che non siano utilizzate da un container in esecuzione).   solo dopo essere sicuro di voler eliminare le risorse elencate (ammesso che non siano utilizzate da un container in esecuzione).  

Se desideri saperne di più su Docker, la containerizzazione e l’orchestrazione dei container, dai un’occhiata a questi corsi su DataCamp:

Source:
https://www.datacamp.com/tutorial/docker-prune