Ingegneria civile e strutturale
Automatizzazione Docker Container Cleanup per salvare spazio disco
Table of Contents
Perché la pulizia automatica del docker è essenziale per la gestione dello spazio del disco
I contenitori Docker offrono un ambiente leggero e coerente per lo sviluppo, il test e la distribuzione delle applicazioni. Tuttavia, la comodità di filare rapidamente e abbattere i contenitori viene ad un costo: bloat del disco. Nel tempo, immagini di formicolio, contenitori fermati, volumi inutilizzati, e accumulare cache di accumulo di avanzi, consumando spazio prezioso del disco.
Un'unica postazione di lavoro per sviluppatori potrebbe raccogliere gigabyte di [ immagini Docker non utilizzate[] entro settimane. In ambienti di produzione, dove i contenitori sono frequentemente aggiornati o sostituiti, il problema si bilancia rapidamente. La pulizia manuale è di errore-prone e spesso trascurata.
Capire Docker’s Cleanup Utilities
Docker fornisce una suite di comandi per la rimozione dei dati non utilizzati. Il più potente è , che può indirizzare contenitori, immagini, volumi e reti.
- ][] – Rimuove tutti i contenitori fermati, tutte le immagini abbaglianti e le reti inutilizzate.
- [][]] – Aggiunge la rimozione di tutte le immagini non utilizzate (non solo quelle che si mettono in pericolo), comprese le immagini non richiamate da alcun contenitore.
- ][] – Anche le prugne non utilizzate (per i volumi di default non vengono rimosse).
- []] – Combina tutte le bandiere: rimozione della forza senza conferma, tutte le immagini inutilizzate e i volumi.
Per un controllo più granulare, Docker offre comandi separati: , , [], e []. Ciascuno accetta filtri (ad esempio, )]) per limitare la cancellazione di risorse rispetto ad un certo tempo.
Setup passo per passo per l'automazione basata su Cron
Su sistemi Linux, cron rimane il più semplice strumento di pianificazione per le attività ricorrenti. Per automatizzare la pulizia Docker, è necessario solo alcune linee nel tuo crontab.
1. Verificare il percorso di comando Docker
I lavori Cron funzionano con un ambiente limitato. Determinare il percorso completo di eseguendo:
which docker
In genere questo restituisce . Utilizzare quel percorso nel vostro comando cron.
2. Modifica il tuo Crontab
Corri!
crontab -e
Se questa è la tua prima volta, ti verrà chiesto di scegliere un editore. Aggiungi una linea come la seguente per eseguire ogni giorno alle 2:00 AM:
0 2 * * * /usr/bin/docker system prune -af --volumes > /dev/null 2>&1
Il reindirizza stdout e stderr a null per evitare di riempire la casella di posta con l'output.
3. Testare il lavoro
Prima di affidarsi a cron, eseguire il comando manualmente per assicurarsi che funzioni come previsto:
sudo /usr/bin/docker system prune -af --volumes
Se si utilizza un'installazione non-root Docker, si potrebbe avere bisogno di aggiungere []] o eseguire il lavoro cron come utente nel gruppo .
Automazione avanzata con Timer Systemd
Mentre cron è sufficiente per molti, timer systemd offrono un migliore accesso, gestione della dipendenza e integrazione con il resto del sistema init.
1. Creare un'unità di servizio
Salvare quanto segue :
[Unit]
Description=Docker system prune
Wants=docker.service
After=docker.service
[Service]
Type=oneshot
ExecStart=/usr/bin/docker system prune -af --volumes
User=root
StandardOutput=journal
2. Creare un'unità Timer
Salva come :
[Unit]
Description=Run Docker cleanup daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
3. Attivare e avviare il timer
sudo systemctl daemon-reload
sudo systemctl enable docker-cleanup.timer
sudo systemctl start docker-cleanup.timer
Verifica con . Questo approccio registra l'output alla rivista systemd, rendendo più facile l'audit delle operazioni di pulizia.
Configurazione dei filtri per la pulizia per le politiche di conservazione
La potatura aggressiva è sicura per la maggior parte degli ambienti di sviluppo, ma i sistemi di produzione possono richiedere [] politiche di conservazione[[[[FLT: 1:27]]]]. Ad esempio, si potrebbe desiderare di mantenere le immagini contrassegnate come o ], o rimuovere solo le risorse di età superiore a 48 ore.
Filtra per Età
Per imprecare immagini e contenitori non utilizzati superiori a 24 ore:
docker system prune -af --filter "until=24h" --volumes
Il filtro funziona sia per immagini che per contenitori. Combinare con più volte per regole più complesse.
Escludere risorse specifiche
[LT] non ha una lista di ignorazione integrata, ma è possibile utilizzare le etichette per evitare la rimozione. Etichetta importanti contenitori o immagini (ad esempio, ), quindi utilizzare un filtro di etichette negativo (non ancora supportato in ).
Monitoraggio dello spazio su disco e pulizia
L'automazione è altrettanto buona come il monitoraggio. Impostare gli avvisi per monitorare l'utilizzo del disco dopo ogni pulizia.
- Correre in un lavoro di cron e registrare i risultati.
- Usando uno strumento come []] docker-sistema-resource-influx[][[]]]] per inviare metriche a InfluxDB o Prometheus.
- ]Datadog[[]] o [Nuova reliquia[]]] per visualizzare lo storage Docker nel tempo.
Se la pulizia viene eseguita ma l'utilizzo del disco rimane alto, indagare utilizzando [] per vedere dove lo spazio viene consumato. I colpevoli comuni includono la cache di costruzione in sistemi CI o grandi volumi che non vengono rimossi perché sono ancora richiamati da contenitori fermati.
Migliori Pratiche per l'Ambiente di Produzione
1. Utilizzare sempre un approccio a stadio
Iniziare con una settimana a secco con [] senza bandiera [] (per vedere cosa sarebbe stato rimosso).
2. Coordinare con CI/CD Pipelines
Se il sistema di costruzione crea molte immagini temporanee, programma di potatura dopo le costruzioni o durante le finestre a basso traffico, evitare di potatura mentre le costruzioni sono in esecuzione per evitare la rimozione accidentale di strati intermedi che sono ancora in uso.
3. Dati critici di backup
I volumi contenenti database o upload degli utenti devono essere supportati prima di qualsiasi potatura aggressiva del volume. Utilizzare strumenti di gestione del volume Docker come [] con ] per legare il montaggio di storage esterno che non sarà influenzato da prune.
4. Eseguire Pruning come utente non-Root
Per la sicurezza, evitare di eseguire i lavori di cron come root a meno che non sia necessario. Aggiungi l'utente al gruppo [] ed eseguire il lavoro senza []]. Tuttavia, si noti che qualsiasi utente del gruppo ha effettivamente accesso root all'host; valutare il rischio nel vostro ambiente.
5. Attività di pulizia del registro
Reindirizza l'output a un file di log invece di per l'auditing:
0 2 * * * /usr/bin/docker system prune -af --volumes >> /var/log/docker-cleanup.log 2>&1
Controlla regolarmente il registro per errori o rimozioni inaspettate.
Pitfalls comune e come evitare di loro
- ] Il messaggio ] rimuove tutte le immagini inutilizzate, inclusi gli strati intermedi che potrebbero essere necessari per le future costruzioni. Se si ricostruisce frequentemente, si consideri l'impostazione di un filtro o l'esecuzione ] senza ]] .
- Volumi contenenti stato importante[[]: Per impostazione predefinita, [[]] non rimuove i volumi a meno che non venga utilizzata la bandiera [].
- ]Rete di rete di rottura del contenitore di connettività[[[]: [] rimuove le reti non utilizzate. Se una rete personalizzata non è più richiamata da alcun contenitore, verrà rimosso, potenzialmente rompendo l'avvio futuro del contenitore.
- Problemi ambientali in Cron[[]: Docker potrebbe non essere nel PATH quando il cron corre.
Strumenti alternativi e approcci
Mentre i comandi nativi Docker coprono la maggior parte delle esigenze, diversi strumenti di terze parti forniscono funzionalità avanzate:
- []]Watchtower[[][[]] – Automatizza l'aggiornamento dei contenitori in esecuzione e può pulire le vecchie immagini dopo gli aggiornamenti.
- []Portainer[[[] – Un'interfaccia web per la gestione Docker che include una funzione di pulizia programmata.
- ]]] creatrice di docker prune[[[]] – Specificamente gli obiettivi costruiscono la cache, che può essere enorme in CI / CD pipeline.
Per gli ambienti Kubernetes, prendere in considerazione l'utilizzo ] della raccolta di rifiuti di Kubelet e strumenti come [Kured] o Descheduler] per la pulizia a livello nodo.
Conclusioni
Se si sceglie cron, timer systemd, o uno strumento di terze parti, la chiave è di eseguire la potatura regolarmente con una politica che bilancia il risparmio di disco contro il rischio di rimuovere i dati necessari. Iniziare conservativamente con filtri e registri, quindi stringere il programma come la vostra fiducia cresce. Integrando spazio automatizzato pulizia bottiglia nella routine operativa, si assicurano