Docker ti consente di impacchettare rapidamente le tue applicazioni come contenitori, rendendo possibile eseguirle ovunque dal tuo laptop a un cloud pubblico. Dopo aver utilizzato Docker per un po', puoi accumulare un gran numero di contenitori, immagini e altre risorse ridondanti. Ecco come metterli in ordine.
Docker di solito non elimina nulla a meno che tu non lo dica. Ciò significa che le immagini che hai estratto e i contenitori che hai creato probabilmente sono ancora in giro sul tuo sistema, anche se non vengono più utilizzati.
Avere troppe risorse ridondanti può portare rapidamente a un utilizzo eccessivo del disco. Si traduce anche in un output molto più lungo quando si elencano le risorse sulla riga di comando, rendendo più difficile trovare le informazioni che stai cercando.
Potatura delle risorse penzolanti
Una risorsa "pendente" è qualsiasi oggetto Docker non attualmente associato a un contenitore. Ciò include immagini Docker, reti e volumi, nonché contenitori interrotti. Nel caso delle immagini, un'immagine è "pendente" se è priva di tag e non ha riferimenti.
Docker fornisce un unico comando di pulizia per consentirti di eliminare tutte le risorse penzolanti e i contenitori fermi. A meno che una risorsa non sia utilizzata da un in esecuzione contenitore, verrà eliminato.
docker system prune
L'esecuzione del comando visualizza una richiesta di conferma che elenca i tipi di risorse da eliminare. Digita y
e premere Invio per continuare con l'eliminazione. Puoi disabilitare la conferma passando il -f
o --force
bandiera.
I volumi non vengono rimossi per impostazione predefinita. L'eliminazione dei volumi rischia la perdita di dati persistenti che potresti voler conservare. Se vuoi rimuovere i volumi che non sono associati a un container, passa il --volumes
flag per includerli nell'operazione.
Puoi eliminare ancora più dati di immagine passando il -a
(o --all
) bandiera. Ciò farà sì che Docker elimini tutti gli non utilizzati immagini, non solo penzolanti senza riferimenti. Ogni immagine sul tuo sistema verrà eliminata, a meno che non sia presente almeno un container in esecuzione che lo richiede.
Utilizzo dei filtri durante lo sfoltimento
I filtri possono essere utilizzati con prune
comando. Il filtraggio ti dà un maggiore controllo su ciò che viene eliminato. Attualmente sono supportati due filtri, until
e timestamp
.
until
– Iluntil
filter impedisce la cancellazione di contenitori, immagini e reti create prima di un dato momento. Puoi specificare l'ora in diversi formati, ad esempio un timestamp Unix in secondi (ad es.1614890000
) o una stringa timestamp formattata per data (ad es.2021-03-04T20:30:00
).label
– L'label
filter limita l'eliminazione in modo che vengano eliminate solo le risorse con una determinata etichetta. Le etichette possono essere utilizzate con contenitori, immagini, reti e volumi. Specifica le etichette comelabel=key=value
(chiave uguale a valore),label!=key=value
(chiave diversa da valore),label=key
(ha l'etichetta data) olabel!=key
(non ha l'etichetta indicata).
Per utilizzare un filtro, passalo a --filter
bandiera:
docker system prune --filter until=2021-03-04T20:30:00 --filter label=foo=bar
Questo comando eliminerebbe le risorse con il foo=bar
etichetta creata prima delle 20:30 del 4 marzo. Eventuali risorse che non corrispondono a questi criteri rimarrebbero intatte.
Eliminazione dei singoli tipi di risorse
Non sarà sempre necessario utilizzare docker system prune
. Docker fornisce anche comandi di sfoltimento più granulari. Questi possono essere utilizzati quando desideri rimuovere solo un tipo di risorsa.
Il --force
e --filter
flag supportati da docker system prune
si applicano anche ai singoli comandi di sfoltimento elencati di seguito.
Contenitori per potatura
I comandi giornalieri di Docker possono causare rapidamente un numero elevato di contenitori fermi. Il problema è esasperato se docker build
immagini senza il --rm
flag, poiché ciò fa sì che i livelli di build intermedi vengano mantenuti.
Esegui docker container prune
per ripulire i contenitori fermi. I contenitori interrotti non vengono visualizzati quando esegui docker ps
; per vederli, dovrai usare docker ps -a
per mostrare tutti i contenitori sul tuo sistema.
Se desideri rimuovere un singolo contenitore, utilizza il docker rm
comando che passa l'ID del contenitore. Puoi ottenerlo eseguendo docker ps
. Se il container è in esecuzione, dovrai utilizzare il --force
flag per eliminarlo.
Immagini di potatura
Usa docker image prune
per rimuovere tutte le immagini penzolanti. Come docker system prune
, ciò influirà sulle immagini senza tag o non referenziate da alcun contenitore.
Aggiungi il -a
flag per eliminare invece tutte le immagini non utilizzate. Questo eliminerà ogni immagine sul tuo sistema che non è richiesta da almeno un contenitore. Verranno incluse anche le immagini contrassegnate, consentendoti di ripulire rapidamente i vecchi pull da Docker Hub.
Puoi rimuovere un'immagine specifica con la docker rmi
comando:
docker rmi wordpress:latest
Quando un'immagine ha più tag, docker rmi
rimuoverà il tag specificato senza eliminare effettivamente l'immagine. Verrà eliminato una volta rimosso l'ultimo tag.
Reti di potatura
Le reti Docker non vengono pulite automaticamente. Nel tempo, puoi finire con un gran numero di loro. Ciò ingombra il tuo sistema con dispositivi bridge virtuali ridondanti e voci della tabella di routing. Esegui docker network prune
per distruggere le reti inutilizzate e ripristinare le modifiche alla configurazione del tuo host.
Puoi eliminare singole reti eseguendo docker rm my-network
.
Volumi di potatura
Docker non cancellerà mai un volume. Memorizzano i dati persistenti creati dai tuoi contenitori, quindi la rimozione involontaria potrebbe avere conseguenze devastanti. I volumi possono anche essere condivisi da più contenitori o lasciati inattivi pronti per essere collegati a un altro contenitore in futuro.
Se desideri eliminare i volumi inutilizzati, devi eseguire docker volume prune
. Questo eliminerà tutti i volumi che non sono utilizzati da almeno un container. I singoli volumi possono essere rimossi utilizzando docker volume rm my-volume
.
Prevenire l'accumulo futuro
Puoi ridurre al minimo il rischio che risorse ridondanti si accumulino in futuro facendo attenzione a passare il --rm
contrassegnare su docker build
e docker run
comandi.
Se utilizzato con build
, causerà l'eliminazione dei livelli di build intermedi (contrassegnati come <none>:<none>
in docker images
) produzione. Ciò può rappresentare una significativa riduzione dell'utilizzo del disco. Normalmente viene creato un nuovo livello intermedio per ogni istruzione nel tuo Dockerfile
. Di solito puoi rimuoverli a meno che tu non intenda utilizzarli in seguito come punto di partenza per una nuova immagine.
Usando --rm
con docker run
rimuoverà il contenitore non appena il suo comando esce. Questo è l'ideale quando si esegue un file binario in un contenitore monouso. Non superare --rm
ai container che intendi eseguire perennemente o che potresti voler avviare e interrompere su richiesta. Gli esempi includono server Web e database che eseguono un servizio anziché un comando fornito dall'utente.
Conclusione
L'eliminazione delle risorse Docker può liberare spazio su disco e aiutarti a lavorare con Docker CLI. L'eliminazione di contenitori e immagini ridondanti semplifica l'identificazione delle risorse che stai cercando.
Docker non cancellerà nulla a meno che tu non lo dica. Vale la pena eseguire docker system prune
periodicamente per mantenere pulito il sistema. Puoi creare un'attività cron che la esegua mensilmente, usando until
filtro per creare un periodo di conservazione per le risorse aggiunte di recente.