Guida Comandi Docker per Principianti

Nel seguente post andremo a vedere i comandi principali di Docker con le relative descrizioni e esempi pratici. Docker è diventato uno strumento indispensabile per sviluppatori e professionisti del settore, permettendo di gestire applicazioni attraverso container leggeri e portabili. Conoscere i comandi fondamentali è essenziale per sfruttare al meglio questa tecnologia.

Introduzione a Docker

Docker è uno strumento che utilizza la tecnologia dei container per creare, distribuire ed eseguire applicazioni in ambienti isolati e riproducibili. Un container Docker è come una scatola che contiene tutto ciò che serve per far funzionare un’applicazione: il codice, le librerie, le dipendenze e le configurazioni. Questo approccio risolve il classico problema “funziona sulla mia macchina” perché garantisce che l’applicazione si comporti allo stesso modo ovunque venga eseguita.

I comandi Docker si dividono principalmente in diverse categorie: gestione delle immagini, gestione dei container, networking, volumi per la persistenza dei dati, e strumenti di monitoraggio e manutenzione del sistema.

Gestione delle Immagini Docker

Le immagini Docker sono come dei modelli o template che contengono tutto il necessario per eseguire un’applicazione. Prima di poter creare e avviare un container, è necessario avere l’immagine corrispondente.

docker pull

docker pull nginx:latest
docker pull ubuntu:20.04

Descrizione: Questo comando scarica un’immagine Docker dal image registry (solitamente Docker Hub) e la salva sul tuo computer locale. È come scaricare un’app prima di poterla utilizzare. Quando specifichi una versione (come :20.04), ottieni esattamente quella versione. Se non specifichi nulla o usi :latest, otterrai l’ultima versione disponibile. È sempre meglio specificare una versione precisa per evitare sorprese negli aggiornamenti futuri.

docker images

docker images
docker images --filter "dangling=true"  # Mostra solo immagini orfane

Descrizione: Questo comando ti mostra tutte le immagini Docker che hai scaricato e che sono attualmente presenti sul tuo computer. È come guardare una lista di tutte le app installate. Per ogni immagine vedrai informazioni utili come il nome del repository, il tag della versione, un ID univoco, quando è stata creata e quanto spazio occupa. L’opzione --filter "dangling=true" è particolarmente utile per trovare immagini “orfane” (senza tag) che spesso si creano durante il processo di build e che puoi eliminare per liberare spazio.

docker build

docker build -t myapp:1.0 .
docker build -t myapp:latest -f Dockerfile.prod .
docker build --no-cache -t myapp:1.0 .

Descrizione: Questo comando costruisce una nuova immagine Docker personalizzata partendo da un file di istruzioni chiamato Dockerfile. È come compilare il tuo codice per creare un’applicazione eseguibile. Il parametro -t ti permette di dare un nome e una versione alla tua immagine (molto utile per riconoscerla facilmente). Il punto . alla fine indica a Docker di cercare il Dockerfile nella cartella corrente e di utilizzare tutti i file presenti come contesto per la costruzione. L’opzione --no-cache forza Docker a ricostruire tutto da capo senza utilizzare parti già costruite in precedenza, utile quando vuoi essere sicuro che tutto sia aggiornato.

docker rmi

docker rmi nginx:latest
docker rmi $(docker images -q)  # Rimuove tutte le immagini
docker image prune  # Rimuove immagini inutilizzate

Descrizione: Questo comando rimuove definitivamente una o più immagini Docker dal tuo computer, liberando spazio su disco. È come disinstallare un’app che non usi più. Puoi specificare il nome dell’immagine oppure il suo ID univoco. Il secondo esempio mostra come eliminare tutte le immagini in una sola volta (molto potente, da usare con attenzione!). Il comando docker image prune è più sicuro perché rimuove solo le immagini che non sono attualmente utilizzate da nessun container, permettendoti di fare pulizia senza rischiare di compromettere applicazioni in funzione.

2. Gestione dei Container

I container sono istanze in esecuzione delle immagini Docker. Qui troviamo i comandi per crearli, avviarli, fermarli e gestirli durante il loro ciclo di vita.

docker run

# Esecuzione base
docker run hello-world

# Esecuzione interattiva
docker run -it ubuntu:20.04 /bin/bash

# Esecuzione in background con porta mappata
docker run -d -p 8080:80 --name myweb nginx

# Con variabili d'ambiente e volume
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mypassword -v /data:/var/lib/mysql mysql:8.0

# Con limite di risorse
docker run -d --memory="1g" --cpus="0.5" nginx

Descrizione: Questo è uno dei comandi più importanti di Docker. Crea un nuovo container a partire da un’immagine e lo avvia immediatamente. È come avviare un’applicazione, ma in un ambiente completamente isolato. Le opzioni disponibili sono tantissime e permettono di personalizzare completamente il comportamento del container. L’opzione -d fa funzionare il container in background (detached), così puoi continuare a usare il terminale. -it invece apre una sessione interattiva che ti permette di “entrare” nel container e usarlo come se fosse un computer separato. Con -p puoi collegare le porte del container a quelle del tuo computer (utile per i servizi web). -e serve per passare variabili d’ambiente, -v per condividere cartelle tra il tuo computer e il container. Le opzioni --memory e --cpus ti permettono di limitare le risorse che il container può utilizzare.

docker ps

docker ps              # Container in esecuzione
docker ps -a            # Tutti i container (anche fermati)
docker ps -l            # Ultimo container creato
docker ps --filter "status=exited"  # Solo container terminati

Descrizione: Questo comando ti mostra una lista di tutti i container presenti sul tuo sistema, simile a quando guardi i processi in esecuzione sul tuo computer. Per default, docker ps mostra solo i container che sono attualmente in funzione, con informazioni utili come l’ID, l’immagine di origine, quando sono stati creati, il loro stato attuale e i nomi assegnati. L’opzione -a (all) è molto utile perché ti fa vedere anche tutti i container che hai fermato in precedenza, permettendoti di riavviarli se necessario. -l ti mostra solo l’ultimo container che hai creato, pratico quando stai sperimentando. I filtri ti permettono di cercare container in stati specifici, per esempio solo quelli terminati con errori.

docker start / stop / restart

docker start container_name
docker stop container_name
docker restart container_name

# Operazioni su più container
docker start $(docker ps -aq)  # Avvia tutti i container
docker stop $(docker ps -aq)   # Ferma tutti i container

Descrizione: Questi comandi ti permettono di controllare il ciclo di vita dei tuoi container, proprio come faresti con qualsiasi altra applicazione sul tuo computer. docker start riavvia un container che avevi fermato in precedenza - tutti i dati e le configurazioni rimangono intatti. docker stop ferma gentilmente un container in esecuzione, dando tempo all’applicazione di chiudersi correttamente e salvare i propri dati. docker restart è una combinazione dei due precedenti: ferma il container e lo riavvia immediatamente. Gli esempi con $(docker ps -aq) sono molto potenti perché ti permettono di operare su tutti i container contemporaneamente - utile per fare manutenzione o per spegnere tutto rapidamente.

docker exec

# Accesso shell interattivo
docker exec -it container_name /bin/bash
docker exec -it container_name sh

# Esecuzione comando singolo
docker exec container_name ls -la /app
docker exec -u root container_name apt-get update

Descrizione: Questo comando è estremamente utile perché ti permette di “entrare” in un container che sta già funzionando ed eseguire comandi al suo interno. È come aprire una finestra di terminale dentro l’applicazione containerizzata. Con -it apri una sessione interattiva che ti permette di navigare e lavorare dentro il container come se fosse un computer separato - questo è perfetto per il debugging o per apportare modifiche temporanee. Puoi anche eseguire singoli comandi senza aprire una sessione interattiva, utile per automazione o controlli rapidi. L’opzione -u ti permette di specificare con quale utente eseguire il comando, molto utile quando hai bisogno di privilegi amministrativi all’interno del container.

docker logs

docker logs container_name
docker logs -f container_name           # Segue i log in tempo reale
docker logs --tail 50 container_name    # Mostra solo le ultime 50 righe
docker logs --since "2023-01-01" container_name  # Log da una data specifica

Descrizione: I log sono fondamentali per capire cosa sta succedendo dentro i tuoi container, specialmente quando qualcosa non funziona come dovrebbe. Questo comando ti mostra tutti i messaggi che l’applicazione nel container ha generato, inclusi errori, avvisi e informazioni di debug. L’opzione -f (follow) è particolarmente utile perché mantiene aperta la visualizzazione dei log e ti mostra in tempo reale tutti i nuovi messaggi che vengono generati - perfetto per monitorare un’applicazione in funzione. --tail 50 ti mostra solo le ultime righe, evitando di essere sommerso da migliaia di messaggi vecchi. L’opzione --since ti permette di filtrare i log per data, molto utile quando stai indagando su un problema specifico che è successo in un momento preciso.

docker rm

docker rm container_name
docker rm -f container_name              # Forza rimozione anche se in esecuzione
docker rm $(docker ps -aq)              # Rimuove tutti i container
docker container prune                   # Rimuove container fermati

Descrizione: Quando non hai più bisogno di un container, questo comando ti permette di rimuoverlo definitivamente dal sistema, liberando spazio su disco. È importante notare che normalmente puoi rimuovere solo container che sono stati fermati - se provi a rimuovere un container in esecuzione, Docker ti darà un errore. L’opzione -f (force) ti permette di forzare la rimozione anche di container in esecuzione, ma è da usare con attenzione perché può causare perdita di dati. Il comando con $(docker ps -aq) è molto potente perché rimuove tutti i container presenti nel sistema in una sola volta. docker container prune è più sicuro perché rimuove automaticamente solo i container che sono stati fermati, permettendoti di fare pulizia senza rischiare di eliminare container importanti che stanno funzionando.

3. Gestione delle Reti Docker

Docker gestisce automaticamente la connettività di rete dei container, ma spesso è utile creare reti personalizzate per controllare meglio la comunicazione tra i servizi.

docker network

# Lista reti disponibili
docker network ls

# Crea una rete personalizzata
docker network create mynetwork
docker network create --driver bridge --subnet=192.168.1.0/24 mynetwork

# Ispeziona una rete
docker network inspect bridge

# Connette/disconnette container a una rete
docker network connect mynetwork container_name
docker network disconnect mynetwork container_name

# Rimuove una rete
docker network rm mynetwork

Descrizione: Le reti in Docker sono come le connessioni di rete nel mondo reale - permettono ai tuoi container di comunicare tra loro e con l’esterno. Docker crea automaticamente alcune reti di base, ma spesso è utile crearne di personalizzate per avere maggiore controllo. Quando crei una rete personalizzata, i container collegati ad essa possono comunicare tra loro usando semplicemente i loro nomi invece di dover conoscere indirizzi IP specifici - molto più pratico! Il comando docker network inspect ti mostra tutti i dettagli di una rete, inclusi quali container sono collegati. Puoi collegare e scollegare container dalle reti dinamicamente, anche mentre stanno funzionando. Questo è particolarmente utile per isolare gruppi di container o per creare architetture complesse dove alcuni servizi devono comunicare tra loro ma non con altri.

4. Gestione dei Volumi e Persistenza Dati

I volumi sono essenziali per mantenere i dati anche quando i container vengono eliminati. Senza volumi, tutti i dati vengono persi quando un container termina.

docker volume

# Lista volumi
docker volume ls

# Crea un volume
docker volume create myvolume

# Ispeziona un volume
docker volume inspect myvolume

# Rimuove volume inutilizzati
docker volume prune

# Usa volume in un container
docker run -d -v myvolume:/data nginx
docker run -d -v /host/path:/container/path nginx  # Bind mount

Descrizione: I volumi sono la soluzione di Docker per gestire i dati in modo persistente. Normalmente, quando elimini un container, tutti i dati al suo interno vengono persi per sempre. I volumi invece permettono di salvare i dati in una posizione sicura che sopravvive anche quando il container viene eliminato. Ci sono due tipi principali di volumi: quelli “named” (con nome) che vengono gestiti completamente da Docker, e i “bind mount” che collegano direttamente una cartella del tuo computer a una cartella del container. I volumi named sono generalmente più sicuri e portabili, mentre i bind mount sono utili quando hai bisogno di accedere ai file sia dall’interno che dall’esterno del container. Il comando docker volume prune ti aiuta a fare pulizia eliminando volumi che non sono più utilizzati da nessun container.

5. Monitoraggio e Ispezione

Questi comandi ti aiutano a capire cosa sta succedendo nei tuoi container e nel sistema Docker in generale.

docker stats

docker stats                        # Statistiche tutti container in esecuzione
docker stats container_name         # Statistiche specifico container
docker stats --no-stream           # Snapshot singolo invece di aggiornamento continuo

Descrizione: Questo comando è come aprire il task manager per i tuoi container Docker. Ti mostra in tempo reale quanto CPU, memoria, rete e spazio su disco sta utilizzando ogni container in esecuzione. È estremamente utile per monitorare le performance delle tue applicazioni e per identificare container che potrebbero avere problemi di performance o che stanno consumando più risorse del previsto. Per default, il comando continua ad aggiornare le statistiche in tempo reale, permettendoti di vedere come cambiano i consumi nel tempo. L’opzione --no-stream ti dà invece una fotografia istantanea delle risorse utilizzate in quel momento specifico, utile quando vuoi integrare queste informazioni in script o automazioni.

docker inspect

docker inspect container_name       # Dettagli completi container
docker inspect image_name          # Dettagli completi immagine
docker inspect --format='{{.NetworkSettings.IPAddress}}' container_name

Descrizione: Questo comando è come un’analisi forense approfondita di qualsiasi oggetto Docker. Restituisce un JSON dettagliatissimo con ogni singola informazione tecnica disponibile su container, immagini, volumi o reti. È particolarmente utile quando stai facendo debugging di problemi complessi o quando hai bisogno di informazioni specifiche per automazione e scripting. Per esempio, puoi scoprire l’indirizzo IP esatto di un container, le variabili d’ambiente configurate, i volumi montati, le porte esposte, e molto altro. L’opzione --format ti permette di estrarre solo le informazioni che ti interessano invece di vedere tutto il JSON completo, molto utile quando devi integrare questi dati in script o per controlli automatici.

6. Manutenzione del Sistema Docker

Docker può accumulare molti dati nel tempo. Questi comandi ti aiutano a mantenere il sistema pulito ed efficiente.

docker system

# Informazioni generali sistema Docker
docker system info
docker system df                    # Utilizzo spazio disco

# Pulizia completa sistema
docker system prune                 # Rimuove risorse inutilizzate
docker system prune -a              # Rimozione aggressiva (include immagini non usate)
docker system prune --volumes       # Include anche volumi anonimi

Descrizione: Questi comandi ti danno una visione d’insieme del tuo ambiente Docker e ti aiutano a mantenerlo pulito ed efficiente. docker system info è come aprire il pannello di controllo del sistema - ti mostra informazioni dettagliate sulla configurazione Docker, quanti container e immagini hai, quanto spazio stai utilizzando, e molto altro. docker system df è particolarmente utile perché ti mostra esattamente quanto spazio su disco stanno occupando i vari componenti di Docker (immagini, container, volumi). Il comando docker system prune è uno strumento di manutenzione potentissimo che elimina automaticamente tutte le risorse non utilizzate: container fermati, reti non collegate, immagini orfane e cache di build. L’opzione -a rende la pulizia ancora più aggressiva includendo anche immagini che non sono attualmente utilizzate da nessun container. Attenzione: questi comandi di pulizia sono irreversibili!

7. Comandi Utili per File e Backup

Questi comandi avanzati ti permettono di gestire file dei tuoi container.

docker cp

# Copia file da container a host
docker cp container_name:/path/to/file /host/path/

# Copia file da host a container
docker cp /host/path/file container_name:/path/to/

Descrizione: Questo comando è come un ponte per trasferire file tra il tuo computer e i container in esecuzione. È estremamente utile quando hai bisogno di estrarre file di log, file di configurazione, o risultati generati dall’applicazione nel container. Funziona in entrambe le direzioni: puoi copiare file dal container al tuo computer (per esempio per analizzare log di errore) oppure dal tuo computer al container (per inserire temporaneamente file di configurazione o patch). A differenza dei volumi, che sono collegamenti permanenti, questo comando esegue una copia puntuale dei file. È particolarmente utile per il debugging quando hai bisogno di ispezionare file generati dall’applicazione o per fare backup rapidi di dati importanti.

docker export / import

# Esporta container in arquivo tar
docker export container_name > backup.tar

# Importa arquivo tar come nuova immagine
docker import backup.tar new_image_name:tag

Descrizione: Questi comandi ti permettono di creare backup completi dei tuoi container o di trasferire container tra sistemi diversi. docker export crea un archivio tar che contiene tutto il filesystem del container, inclusi tutti i file, le modifiche e le configurazioni. È come fare una fotografia completa dello stato attuale del container. Questo è utile per creare backup prima di fare modifiche importanti o per migrare container su altri server. docker import fa l’operazione inversa: prende un archivio tar creato con export e lo trasforma in una nuova immagine Docker che puoi utilizzare per creare nuovi container. È importante notare che questo processo conserva i file ma perde alcuni metadati come la cronologia delle modifiche e alcune configurazioni avanzate.

Best Practices e Consigli Utili

Ottimizzazione e Sicurezza

Quando lavori con Docker, ci sono alcune pratiche fondamentali che ti aiuteranno ad evitare problemi e a mantenere un ambiente sicuro ed efficiente. Prima di tutto, evita sempre di usare il tag :latest in produzione - specifica sempre versioni precise delle immagini per garantire che la tua applicazione funzioni sempre allo stesso modo. Utilizza le build multi-stage per creare immagini più piccole e sicure, includendo solo ciò che è strettamente necessario per far funzionare l’applicazione. Mai eseguire container come utente root a meno che non sia strettamente necessario - crea sempre un utente dedicato nel Dockerfile. Imposta sempre limiti di CPU e memoria per evitare che un container possa consumare tutte le risorse del sistema.

Pulizia e Manutenzione Periodica

Docker può accumulare molti dati inutilizzati nel tempo: immagini vecchie, container fermati, volumi orfani e cache di build. È importante fare pulizia regolarmente per evitare di riempire il disco. Ecco un comando utile per una pulizia completa (da usare con molta attenzione):

# Script pulizia completa (da usare con cautela)
docker system prune -a --volumes
docker network prune
docker volume prune

Monitoraggio e Debugging

Per tenere sotto controllo i tuoi container e diagnosticare problemi, impara ad utilizzare regolarmente docker stats per monitorare l’utilizzo delle risorse, docker logs per controllare cosa stanno facendo le applicazioni, e docker inspect per ottenere informazioni dettagliate quando qualcosa non funziona come dovrebbe.

Conclusione: Padroneggiare i Comandi Docker

Questa guida completa ai comandi Docker ti ha fornito tutti gli strumenti essenziali per gestire efficacemente container, immagini, reti e volumi. La padronanza di questi comandi Docker fondamentali è cruciale per sviluppatori, DevOps engineer e sistemisti che lavorano con la containerizzazione moderna.

Punti Chiave per l’Uso di Docker in Produzione:

  • Testing: Testa sempre i comandi Docker in ambiente di sviluppo
  • Sicurezza: Mantieni aggiornate le immagini Docker per prevenire vulnerabilità
  • Ottimizzazione: Utilizza file .dockerignore per build più efficienti
  • Documentazione: Documenta sempre le configurazioni Docker nei progetti

Risorse per Approfondire Docker

Docker continua ad evolversi con nuove funzionalità e miglioramenti. Questa guida fornisce una base solida, ma per rimanere aggiornati sulle ultime novità Docker e le best practice più recenti, consulta sempre la documentazione ufficiale.

Con questi comandi Docker essenziali hai ora tutti gli strumenti per implementare soluzioni di containerizzazione professionali e gestire ambienti Docker complessi in modo efficiente e sicuro.