Amo Docker, ma all’inizio il suo utilizzo non è stato così immediato. Uno degli errori che ho commesso quando ho iniziato a lavorare con i container è stato quello di non adottare fin da subito uno strumento di gestione contenitori dedicato. Oggi utilizzo Portainer quotidianamente, ma la mia prima esperienza con Docker si è svolta quasi interamente attraverso il terminale.
Nelle fasi iniziali ogni container sembrava una piccola rivoluzione: un ambiente isolato, le dipendenze già incluse e pochi comandi per installare, aggiornare o rimuovere un’applicazione. Tutto appariva semplice e intuitivo. I problemi, però, hanno iniziato a emergere quando il numero dei servizi è aumentato e il mio homelab è diventato più articolato.

I limiti di “docker run” e la svolta con Docker Compose
Avviare singoli container attraverso il comando docker run può funzionare bene all’inizio, soprattutto quando si stanno sperimentando nuove applicazioni. Con il tempo, però, questo metodo può diventare fragile e difficile da gestire.
Bisogna ricordare le porte esposte, i volumi collegati, le variabili d’ambiente, le reti, le policy di riavvio e tutti i mount utilizzati durante la creazione del container. Se il comando originale non è stato salvato, ricostruire la configurazione dopo alcune settimane può diventare complicato.
Lavorando quotidianamente con tre, quattro o più container attivi, ho iniziato a incontrare problemi concreti: spazio sul disco che diminuiva rapidamente, servizi che non si avviavano correttamente e container che, dopo un aggiornamento, non rispondevano più come previsto.
Un altro aspetto poco intuitivo per chi comincia è che la rimozione di un container non comporta automaticamente l’eliminazione dell’immagine, dei volumi o di tutti i dati associati. La pulizia delle risorse obsolete diventa quindi un’attività separata, che deve essere effettuata consapevolmente.
Docker Compose risolve gran parte di questi problemi perché permette di salvare la configurazione di uno o più servizi all’interno di un file YAML. Porte, volumi, variabili d’ambiente, reti e dipendenze restano documentati e possono essere riutilizzati in qualsiasi momento.
In questo modo diventa molto più semplice ricreare un’applicazione, aggiornarla, spostarla su un altro server o ripristinarla dopo un problema.
docker compose up -d
Con un file compose.yaml ben organizzato non è più necessario ricordare lunghi comandi eseguiti mesi prima. La configurazione diventa ripetibile, più facile da controllare e, se necessario, può anche essere conservata all’interno di un repository Git privato.
Per questo motivo, anche senza utilizzare un’interfaccia grafica, Docker Compose rappresenta uno dei primi strumenti che consiglierei di imparare a chi vuole costruire un homelab ordinato.
La manutenzione dello spazio: pulizia di cache, immagini e volumi
Docker può accumulare nel tempo numerose risorse non più utilizzate. Tra queste rientrano container arrestati, immagini senza riferimenti, reti inutilizzate e cache generate durante la compilazione delle immagini.
Nel mio caso, controllando periodicamente lo stato del sistema, ho trovato diverse immagini ormai inutili e container inattivi che occupavano spazio senza offrire alcun beneficio.
Per avere una panoramica dell’occupazione del disco è possibile utilizzare:
docker system df
Per rimuovere alcune risorse inutilizzate si può invece eseguire:
docker system prune
Il comando elimina normalmente container arrestati, reti non utilizzate, immagini dangling e cache di build inutilizzata. Prima di confermare l’operazione è comunque importante leggere attentamente il riepilogo mostrato nel terminale.
Una pulizia completa può liberare molto spazio in pochi minuti, ma non dovrebbe essere eseguita in modo automatico o senza prima verificare quali risorse verranno coinvolte.
I volumi Docker rappresentano una delle aree più delicate nella gestione di Docker. Possono contenere database, configurazioni, librerie multimediali, dati applicativi e informazioni che devono sopravvivere alla rimozione o alla ricreazione di un container.
La gestione errata dei volumi può provocare una perdita permanente dei dati. Per questo motivo bisogna distinguere chiaramente tra volumi realmente inutilizzati e volumi che appartengono a servizi temporaneamente arrestati.
Per visualizzare l’elenco dei volumi presenti nel sistema si può utilizzare:
docker volume ls
Per individuare soltanto quelli che Docker considera non collegati ad alcun container:
docker volume ls -f dangling=true
La rimozione dei volumi inutilizzati può essere effettuata con:
docker volume prune
Questo comando deve essere utilizzato con particolare cautela. Prima di procedere è consigliabile verificare il contenuto dei volumi, controllare i file Docker Compose e assicurarsi di disporre di un backup aggiornato dei dati importanti.
In passato ho utilizzato anche uno script per individuare e ripulire i volumi orfani, ma una procedura automatizzata non elimina la necessità di controllare ciò che verrà cancellato.
Portainer: l’interfaccia grafica per la gestione quotidiana
L’introduzione di Portainer ha trasformato il mio modo di gestire Docker. Attraverso l’interfaccia web posso visualizzare rapidamente tutti i container, verificare se sono in esecuzione, controllarne lo stato di salute e capire a quale Stack appartengono.
Nella schermata dedicata ai container è possibile consultare informazioni che, da terminale, richiederebbero diversi comandi: immagini utilizzate, indirizzi IP, reti collegate, volumi montati, policy di riavvio e porte pubblicate sull’host.
Una delle funzioni che utilizzo maggiormente è proprio il controllo delle porte. Quando vengono eseguiti molti servizi contemporaneamente, individuare subito quale porta è già occupata permette di evitare conflitti e modifiche inutili ai file di configurazione.
Lo stato dei container è un’informazione fondamentale. Portainer consente di capire a colpo d’occhio quali servizi sono attivi, quali sono arrestati e quali presentano problemi durante i controlli di salute.
Questa panoramica è utile anche prima di effettuare una pulizia. Un container non in esecuzione, infatti, non è necessariamente inutile: potrebbe essere stato arrestato temporaneamente oppure essere necessario per un’attività periodica.
Eliminare automaticamente tutti i container fermi può quindi comportare la perdita di configurazioni importanti. Controllare lo stato attraverso l’interfaccia grafica aiuta a prendere una decisione più informata.
Nel linguaggio Docker il termine Stack viene spesso associato a Docker Swarm, dove identifica un insieme di servizi distribuiti e gestiti attraverso file Compose.
In Portainer, tuttavia, la sezione Stacks viene utilizzata anche nei normali ambienti Docker standalone come interfaccia grafica per distribuire e amministrare configurazioni basate su Docker Compose. Non è quindi necessario utilizzare Docker Swarm per sfruttare questa funzione.
Attraverso gli Stack è possibile incollare o caricare un file Compose, avviare tutti i servizi collegati, modificarne la configurazione e controllare se i relativi container sono in esecuzione oppure presentano errori.
Una rapida occhiata alla sezione consente di capire quali applicazioni sono state distribuite tramite Compose e quali container, invece, sono stati creati singolarmente.
Portainer permette di leggere i log dei container direttamente dal browser, senza dover ricordare ogni volta il comando da utilizzare o il nome esatto del servizio.
Dal terminale, lo stesso controllo può essere eseguito con:
docker logs nome_container
Per seguire i messaggi in tempo reale:
docker logs -f nome_container
L’interfaccia di Portainer rende questa operazione più immediata e consente anche di aprire una console all’interno del container. In questo modo è possibile controllare file, processi e configurazioni senza accedere direttamente al terminale del server.
La console web non sostituisce completamente la riga di comando, ma è molto utile per effettuare controlli veloci o intervenire quando non si ha a disposizione una sessione SSH.
La sezione dedicata ai volumi permette di consultare l’elenco completo delle risorse presenti, verificare il driver utilizzato e creare o rimuovere nuovi volumi attraverso pochi clic.
L’interfaccia grafica riduce il rischio di confondere nomi simili, ma non protegge automaticamente dalla cancellazione di dati importanti. Anche in Portainer è indispensabile controllare quali container utilizzano un determinato volume prima di eliminarlo.
Per le applicazioni più importanti, come database, piattaforme fotografiche, sistemi di automazione o servizi cloud personali, è sempre opportuno predisporre una strategia di backup separata.
Il confronto: Portainer o Lazydocker?
Portainer non è l’unico strumento disponibile per gestire Docker. Un’alternativa molto apprezzata è Lazydocker, un’interfaccia testuale che viene eseguita direttamente nel terminale.
Non ho ancora utilizzato Lazydocker in modo approfondito, ma il progetto offre un’interfaccia pulita e un approccio più leggero rispetto a una piattaforma web completa. Può essere particolarmente interessante per chi lavora spesso tramite SSH e preferisce restare all’interno del terminale.
Portainer è invece più adatto a chi desidera una dashboard accessibile dal browser, una gestione visuale degli Stack e una panoramica immediata di container, immagini, reti e volumi.
Le due soluzioni non sono necessariamente concorrenti. Possono essere utilizzate anche insieme, scegliendo di volta in volta lo strumento più adatto al tipo di intervento da effettuare.
L’importanza delle competenze di base per un homelab ordinato
Utilizzare Portainer o Lazydocker non significa poter ignorare completamente i comandi Docker. Conoscere almeno le operazioni fondamentali resta indispensabile per comprendere cosa sta facendo l’interfaccia e intervenire quando qualcosa non funziona.
Comandi come docker ps, docker logs, docker inspect, docker system df e docker compose continuano a essere strumenti essenziali per la diagnostica. La GUI dovrebbe quindi essere considerata un livello aggiuntivo di controllo e semplificazione, non un sostituto completo della riga di comando.
Dopo aver installato diversi container utili per le mie attività quotidiane, ho iniziato a cercare strumenti che rendessero l’intero ambiente più ordinato e semplice da controllare.
La prima settimana trascorsa senza un gestore Docker è stata sufficiente per farmi capire quanto velocemente immagini, container, cache e volumi possano accumularsi e rendere più complessa la manutenzione del sistema.
Oggi non consiglierei di iniziare un progetto Docker senza utilizzare almeno Docker Compose. Per un homelab con numerosi servizi, aggiungerei anche un gestore come Portainer o Lazydocker.
Portainer, in particolare, mi permette di controllare rapidamente lo stato dei servizi, individuare le porte utilizzate, consultare i log, gestire gli Stack e accedere ai container attraverso una console web. I vantaggi dell’approccio grafico, soprattutto nella gestione quotidiana, sono per me evidenti.
Il principio più importante resta comunque lo stesso: prima di eliminare immagini, container o volumi bisogna sapere esattamente quali dati contengono e quali servizi potrebbero dipendere da essi. Un’interfaccia ordinata aiuta, ma attenzione, backup e conoscenza della configurazione restano indispensabili.