Corso
Docker è diventato uno strumento di riferimento per sviluppatori e professionisti dei dati che devono creare, condividere ed eseguire applicazioni in modo coerente tra ambienti diversi. Che tu stia avviando container per lo sviluppo locale o distribuendo microservizi in produzione, padroneggiare i comandi Docker è essenziale.
In questa guida ti mostrerò 18 comandi Docker fondamentali—per immagini, container, networking, volumi e Compose—che miglioreranno il tuo flusso di lavoro e renderanno l’uso di Docker più fluido ed efficiente.
Che cos’è Docker?
Docker è una piattaforma per sviluppare, distribuire ed eseguire applicazioni. Ti permette di separare la tua app dall’infrastruttura sottostante, abilitando consegne più rapide del software e gestendo la configurazione allo stesso modo in cui gestisci le tue applicazioni.
Docker esegue le app in ambienti isolati usando pacchetti leggeri chiamati container, che includono tutto ciò che serve all’app per funzionare, come dipendenze e installazioni, aiutandoti a risparmiare risorse di sistema. Possiamo condividere facilmente i container con i colleghi, eseguirne diversi in parallelo e gestirli tutti con gli strumenti e la piattaforma di Docker.
Possiamo usare Docker per molte cose, tra cui:
- Distribuzione e scalabilità reattive.
- Esecuzione di più carichi di lavoro sullo stesso hardware.
- Consegna rapida e coerente delle applicazioni.
Quando usiamo Docker, lavoriamo con diversi oggetti Docker come immagini, container, network, plugin e volumi. Questi sono i mattoni del setup Docker. Sotto il cofano, Docker usa funzionalità del kernel Linux per far funzionare il tutto. Interagiamo con esso tramite semplici comandi da terminale, e ogni comando Docker inizia con docker.
> Se stai iniziando ora, il corso Introduction to Docker offre una base pratica per imparare i fondamentali della containerizzazione.
Comandi Docker di base
Ora che abbiamo visto cos’è Docker e come funziona, diamo un’occhiata ad alcuni dei comandi più comuni. Ti aiuteranno a creare, eseguire e gestire i container nel lavoro quotidiano.
docker --version e docker info
Nei comandi Docker, tutto ciò che inizia con -- è chiamato flag.
Per esempio, --version è un flag che mostra la versione della CLI di Docker che stai usando. Puoi anche usare docker version (senza flag) per ottenere informazioni dettagliate sulle versioni di tutti i componenti Docker.
L’output è diviso in due parti:
- Client mostra informazioni sulla CLI Docker e sugli strumenti correlati.
- Server mostra dettagli sul Docker Engine e su cosa lo esegue.
Puoi anche formattare questo output usando il flag --format con un template personalizzato.
Il comando docker info ti offre una panoramica completa del tuo setup Docker. È lo stesso di eseguire docker system info, solo con un nome più corto. Vedrai dettagli come la versione del kernel, il numero di container e immagini, e altre informazioni a livello di sistema.
A seconda del driver di storage, potresti vedere anche informazioni come nomi dei pool e file di dati. Come per docker version, puoi formattare l’output usando --format o -f.
docker pull <image>
Il comando pull scarica un’immagine Docker da un registry, di solito Docker Hub, una libreria pubblica di immagini preconfigurate che puoi usare senza dover impostare nulla da zero. Puoi eseguirlo come docker pull <image> o docker pull, e in entrambi i casi farà la stessa cosa.
- La sintassi completa è:
docker image pull [OPTIONS] NAME[:TAG|@DIGEST]
Se non specifichi un tag, Docker userà :latest per impostazione predefinita. Per esempio: docker image pull debian scarica l’immagine debian:latest.
Puoi anche aggiungere opzioni dopo il comando per personalizzare come viene scaricata l’immagine, ad esempio limitando la banda o saltando la verifica dell’immagine. L’immagine qui sotto mostra tutte le opzioni disponibili e le loro funzioni.

Opzioni per il comando docker pull. Fonte: Docker docs
docker run <image>
Il comando docker run <image> crea e avvia un nuovo container da un’immagine specificata, ovvero esegue l’immagine in un container nuovo. È una forma abbreviata di docker container run, e funzionano allo stesso modo.
- Ecco la sintassi di base:
docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
Se hai già eseguito un container e vuoi riavviarlo con tutte le modifiche precedenti, usa: docker start <container>.
Il comando run offre molte opzioni per personalizzare come viene eseguito il tuo container. Vediamo alcune delle più comuni con esempi:
|
Flag |
Esempio di comando |
Descrizione |
|
|
|
L’identificatore personalizzato specificato per il container chiamato test che usa l’immagine |
|
|
|
Esegue il comando all’interno della directory specificata, in questo esempio |
|
|
|
Per impostazione predefinita, tutti i container hanno abilitato lo spazio dei nomi PID, che fornisce separazione dei processi. L’esempio esegue un container alpine con l’opzione |
|
|
|
Crea un container e stampa un test sulla console Il flag |
docker stop <container> e docker start <container>:
Il comando docker start <container> avvia uno o più container arrestati. Per esempio, in docker start my_container, my_container è il nome del container che vogliamo avviare. Possiamo anche usare il suo alias: docker container start.
- La sintassi completa è:
docker container start [OPTIONS] CONTAINER [CONTAINER...]
Allo stesso modo, docker stop arresta uno o più container in esecuzione. Per esempio, in docker stop my_container, my_container è il nome di un container in esecuzione.
Ha anche un alias: docker container stop.
- La sintassi completa è:
docker container stop [OPTIONS] CONTAINER [CONTAINER...]
Come start, anche il comando stop ha opzioni per personalizzare come vengono arrestati i container. Ne evidenziamo alcune utili qui sotto:

Opzioni per docker stop. Fonte: Docker docs
Lavorare con le immagini Docker
Le immagini sono la base di ogni container. In questa sezione vedremo come creare, gestire e ispezionare le immagini Docker usando i suoi comandi più comuni.
docker build
Il comando docker build è una delle funzionalità più usate di Docker. Anche se fa parte di un ecosistema più ampio che supporta casi d’uso avanzati, qui ci concentriamo su come usarlo per creare un’immagine da un semplice Dockerfile.
Un Dockerfile è un file di testo semplice (senza estensione) che contiene istruzioni passo passo che Docker usa per costruire un’immagine. Ecco come crearne uno:
- Nella directory root della tua app, crea un file chiamato
Dockerfilecon il seguente contenuto:
# syntax=docker/dockerfile:1
FROM node:lts-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
Questo Dockerfile parte da un’immagine base leggera che include Node.js e Yarn. Copia il codice sorgente della tua app nell’immagine, installa le dipendenze e definisce come avviare l’app.
- Ora crea l’immagine usando il comando seguente:
docker build -t getting-started.
Il flag -t ti permette di taggare l’immagine. In questo caso, l’abbiamo chiamata getting-started. Il . finale dice a Docker di cercare il Dockerfile nella directory corrente.
docker images
Il comando docker images elenca tutte le immagini di primo livello, il relativo repository, i tag e le dimensioni. Puoi anche usare i suoi alias:
docker image listdocker image ls
La sintassi è: docker image ls [OPTIONS] [REPOSITORY[:TAG]]
Questo comando supporta diverse opzioni. Per esempio, per mostrare tutte le immagini, comprese quelle intermedie, puoi aggiungere il flag -a o --all così: docker images -a.
docker rmi <image>
Il comando docker rmi <image> rimuove una o più immagini dal tuo sistema. Se un’immagine ha più tag, eseguire questo comando con un tag specifico rimuoverà solo quel tag. Ma se il tag è l’unico collegato all’immagine, verranno rimossi sia il tag che l’immagine.
Puoi anche usare uno di questi alias:
docker image removedocker image rm
La sintassi è: docker image rm [OPTIONS] IMAGE [IMAGE...]
Se devi rimuovere un’immagine ancora usata da un container in esecuzione, dovrai forzare l’operazione aggiungendo l’opzione -f o --force.
Gestione dei container Docker
Spesso dobbiamo gestire i container — avviarli, arrestarli, ispezionarli o rimuoverli man mano che la nostra app evolve. Quindi, ti guiderò tra i comandi Docker più utili per gestire i container nel lavoro di tutti i giorni.
docker exec <container> <command>
Il comando docker exec ti consente di eseguire un comando all’interno di un container in esecuzione senza riavviarlo. È particolarmente utile per il debug o per verificare manualmente qualcosa dentro il container. Puoi anche usare il suo alias: docker container exec.
Il comando funziona solo se il processo principale del container (PID 1) è in esecuzione. Non viene rieseguito automaticamente se il container si riavvia.
La sua sintassi è: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Ci sono diversi flag opzionali che puoi usare. Per esempio, --privileged concede al comando permessi estesi all’interno del container. Per l’elenco completo delle opzioni, dai un’occhiata alla documentazione ufficiale.
Ecco un esempio per eseguire un comando nel container:
docker exec -d mycontainer touch /tmp/execWorks
Il comando touch crea un nuovo file /tmp/execWorks all’interno del container in esecuzione mycontainer, in background.
docker logs <container>
Il comando docker logs ti permette di visualizzare i log di uno specifico container e mostra tutto ciò che è stato stampato su standard output ed error al momento dell’esecuzione. Puoi anche usare il suo alias: docker container logs
La sua sintassi è: docker container logs [OPTIONS] CONTAINER
Ci sono diverse opzioni utili che puoi aggiungere. Per esempio:
--detailsmostra attributi extra come variabili d’ambiente ed etichette.--untilti permette di recuperare i log fino a un punto temporale specifico.docker logs -f --until=2s testsegue l’output dei log del containerteste si ferma dopo aver mostrato gli ultimi due secondi di log.
Ecco tutte le opzioni che possiamo usare con docker logs:

Opzioni per docker log <container>. Fonte: Docker docs
docker rm <container>
Il comando docker rm <container> rimuove uno o più container dal tuo sistema. Puoi anche usare i suoi alias:
docker container removedocker container rm
La sua sintassi è: docker container rm [OPTIONS] CONTAINER [CONTAINER...]
Questo comando ha alcuni flag opzionali che puoi usare. Eccone alcuni:

Opzioni per docker rm <container>. Fonte: Docker docs
Per esempio, puoi usare docker rm /redis per rimuovere il container identificato dal link /redis. Nota però che questo comando rimuove solo i container in esecuzione.
Se vuoi rimuovere i container arrestati, devi usare docker container prune. Per mantenere pulito il tuo ambiente, scopri come rimuovere in sicurezza le risorse Docker inutilizzate con questo tutorial su Docker prune.
docker restart <container>
Il comando docker restart <container> arresta e poi riavvia uno o più container. Puoi anche usare il suo alias: docker container restart.
La sintassi è: docker restart [OPTIONS] CONTAINER [CONTAINER...]
Il comando restart ha diverse opzioni utili per personalizzare i riavvii dei container. Di seguito entrambe le opzioni, con esempi.
|
Opzione |
Descrizione |
Esempio |
|
-s, --signal |
Segnale da inviare al container. |
|
|
-t, --timeout |
Secondi da attendere prima di terminare il container. |
|
> Per fare pratica, esplora queste idee di progetti Docker che vanno dal livello principiante all’avanzato.
Docker Networking
Il networking dei container abilita la comunicazione tra container e carichi di lavoro esterni. Per impostazione predefinita, i container hanno il networking abilitato e possono effettuare connessioni in uscita, ma non sanno automaticamente su che tipo di rete si trovano o a quali altri carichi di lavoro sono connessi.
A meno che tu non usi il driver di rete none (che disabilita il networking), i container possono interagire con elementi di rete come indirizzi IP, gateway e DNS.
Vediamo alcuni comandi di rete Docker comuni che puoi usare.
docker network ls
Il comando docker network ls elenca tutte le reti note al Docker Engine, incluse quelle su più host in un cluster. Il suo alias è: docker network list.
- Ecco la sintassi:
docker network ls [OPTIONS]
Puoi usare varie opzioni con questo comando, come mostrato nell’immagine qui sotto:
Per impostazione predefinita, questo comando mostra per ogni rete:
- ID
- Nome
- Driver
- Scope
Puoi usare dei flag per personalizzare l’output. Per esempio, il flag --no-trunc mostra gli ID completi della rete invece delle versioni abbreviate. Ecco come usare questo comando:
docker network ls --no-trunc
docker network create <network-name>
Il comando docker network create crea una nuova rete Docker. Per impostazione predefinita, usa il driver bridge a meno che tu non ne specifichi un altro usando il flag --driver (o -d).
Docker supporta driver di rete integrati come:
bridgeper reti su singolo host.overlayper reti multi-host in modalità Swarm.
Puoi anche usare driver di terze parti o personalizzati se necessario.
- Ecco la sintassi di base:
docker network create [OPTIONS] NETWORK
Il comando offre molte opzioni per vari scopi. Consulta la loro documentazione ufficiale per vedere l’elenco completo delle opzioni.
Ecco un esempio di creazione di una rete bridge:
docker network create -d bridge my-bridge-network
Le reti bridge sono limitate a un singolo Docker Engine, quindi non connettono container su host diversi.
Una volta abilitata la modalità Swarm, puoi creare una rete che si estende su più host Docker:
docker network create --scope=swarm --attachable -d overlay my-multihost-network
> Ti incuriosisce il confronto tra Docker e Kubernetes? Questo riepilogo di Kubernetes vs Docker copre differenze chiave e casi d’uso.
Volumi Docker
I volumi Docker vengono usati per archiviare dati che devono persistere anche quando un container si arresta o viene rimosso. Puoi crearli esplicitamente o lasciare che Docker li crei automaticamente all’avvio di un container.
I volumi sono archiviati sul sistema host ma sono isolati dai file core dell’host. Vengono montati nei container in modo simile ai bind mount, ma con migliore portabilità e sicurezza.
Vediamo alcuni comandi rilevanti per i volumi Docker:
docker volume ls
Il comando docker volume ls elenca tutti i volumi conosciuti da Docker. Puoi anche usare il suo alias: docker volume list.
- La sintassi è:
docker volume ls [OPTIONS]
Questo comando supporta alcuni flag opzionali per aiutarti a filtrare o formattare l’output — ecco quali sono:

Opzioni per il comando docker volume ls. Fonte: Docker docs
docker volume create <volume-name>
Il comando docker volume create crea un nuovo volume per l’archiviazione di dati persistenti. Se non fornisci un nome, Docker ne genererà automaticamente uno per te.
Creare volumi è un passaggio comune quando vuoi che i dati persistano oltre la vita di un singolo container.
- Ecco la sintassi:
docker volume create [OPTIONS] [VOLUME_NAME]
Vediamo un esempio di creazione di un volume e di configurazione di un container per usarlo:
docker volume create hello
docker run -d -v hello:/world busybox ls /world
In questo esempio, viene creato un volume chiamato hello. Poi viene montato in un container nel percorso /world. Ciò consente al container di scrivere o leggere dati da quel volume.
Più container possono usare lo stesso volume, utile se uno deve scrivere dati mentre un altro li legge.
Nota: i nomi dei volumi devono essere unici tra i driver. Non puoi usare lo stesso nome di volume in due driver di storage differenti.
Comandi Docker Compose
Docker Compose rende semplice gestire applicazioni multi-container usando un semplice file YAML. Supporta diversi ambienti come sviluppo, test, staging, produzione e CI. Con un solo comando puoi controllare i servizi, configurare le reti e gestire i volumi — tutto in un unico posto.
Vediamo alcuni comandi comuni di Compose:
docker-compose up
Il comando docker compose up builda, (ri)crea, avvia e si collega ai container per un servizio. Se i container non sono ancora in esecuzione, avvia automaticamente anche i servizi collegati.
- Ecco la sintassi:
docker compose up [OPTIONS] [SERVICE...]
Per impostazione predefinita, questo comando combina l’output di tutti i container. Se vuoi concentrarti su servizi specifici, puoi:
- Usare il flag
--attachper collegarti a determinati servizi - Usare il flag
--no-attachper escluderne altri
Per esempio, docker compose up --no-attach <service-name> avvia tutti i servizi tranne quello che hai escluso dai log.
Quando il comando termina, anche i container si fermano. Per mantenerli in esecuzione in background, usa il flag --detach:
docker compose up --detach
Prima di eseguire questo comando, assicurati di essere entrato (cd) nella directory in cui si trova il file docker-compose.yml.
docker-compose down
Il comando docker compose down arresta i container e rimuove container, immagini, reti e volumi creati da docker compose up.
- La sintassi è:
docker compose down [OPTIONS] [SERVICES]
Puoi usarlo con varie opzioni, tra cui le seguenti:

Opzioni per il comando docker compose down. Fonte: Docker docs.
Per impostazione predefinita, il comando rimuove:
- I container dei servizi definiti nel file Compose.
- Le reti definite nella sezione networks del file Compose.
- La rete predefinita, se presente.
I seguenti elementi non vengono rimossi per impostazione predefinita:
- Reti e volumi definiti come esterni.
- Volumi anonimi, cioè i volumi che non hanno un nome.
I volumi anonimi non vengono montati automaticamente quando esegui di nuovo docker compose up perché non hanno nomi. Se ti serve archiviazione persistente, è meglio usare volumi nominali o bind mount.
Best practice per usare i comandi Docker
Docker è un modo potente per creare, distribuire ed eseguire applicazioni in container. Ma per usarlo bene e assicurarti che il tuo setup sia efficiente e facilmente scalabile, è importante seguire alcune best practice.
Usa i volumi Docker per i dati persistenti
Per impostazione predefinita, i file del container sono memorizzati in un livello scrivibile che va perso quando il container viene rimosso! Questo livello è unico per ogni container e non è facilmente accessibile. Docker usa diversi tipi di mount per rendere i dati persistenti, uno dei quali sono i volumi, gestiti dal demone Docker e archiviati sull’host.
I volumi ci permettono di:
- Mantenere i dati anche dopo l’eliminazione di un container.
- Archiviare dati critici per le prestazioni con velocità a livello host.
- Gestire facilmente lo storage tramite Docker.
Sono ideali per dati a lungo termine o quando più container devono condividere l’accesso. Tieni solo presente che, se devi accedere ai file direttamente dall’host, i bind mount potrebbero essere più adatti, poiché i volumi sono gestiti interamente da Docker.
Automatizza con Docker Compose
Gestire manualmente più container può diventare impegnativo. Docker Compose semplifica le cose permettendoti di definire tutto in un unico file YAML, così puoi concentrarti sullo sviluppo.
Ecco perché è una best practice da seguire:
- Un solo comando semplice: avvia, arresta, scala o ricostruisci i tuoi servizi in un colpo solo.
- Coerenza per tutti: che tu stia lavorando in sviluppo, test o produzione, Compose mantiene gli ambienti allineati così non rimarrai bloccato con i problemi del tipo “funziona sul mio computer”.
- Networking integrato: Compose crea una rete condivisa così i tuoi servizi possono comunicare facilmente usando i nomi dei servizi invece degli IP.
- Scalabilità semplice: puoi scalare rapidamente i servizi verso l’alto o il basso con il flag
--scale, ottimo per testare come la tua app gestisce carichi diversi. - Configurazione chiara e collaborativa: l’intera configurazione, inclusi container, reti e volumi, è versionata e leggibile.
Conclusione
Docker può sembrare tanto all’inizio, ma una volta che prendi confidenza con i comandi principali, apre molte possibilità. Dall’esecuzione del tuo primo container alla gestione di reti, volumi e servizi, ora sei più attrezzato per creare ed eseguire applicazioni containerizzate con sicurezza.
E se hai voglia di continuare a imparare, ecco alcune ottime risorse da esplorare:
- Containerization and Virtualization Concepts – un corso perfetto per costruire delle solide basi concettuali.
- Introduction to Docker – un corso adatto ai principianti per iniziare.
- Intermediate Docker – corso per quando sei pronto a fare un passo in più.
- Containerization and Virtualization with Docker and Kubernetes – skill track per espanderti a Kubernetes e all’orchestrazione reale.
FAQ
Quali sono i comandi Docker più usati?
Alcuni dei comandi Docker più comuni includono docker run, docker ps, docker build, docker pull e docker-compose up.
In cosa differiscono i volumi Docker dai bind mount?
I volumi Docker sono gestiti da Docker e sono ideali per portabilità e persistenza dei dati, mentre i bind mount collegano un percorso file specifico sul sistema host.
Posso eseguire più container con un solo comando?
Sì, usando docker-compose up con un file docker-compose.yml puoi eseguire più servizi contemporaneamente.
Qual è la differenza tra docker start e docker run?
docker run crea e avvia un nuovo container, mentre docker start riavvia un container esistente e fermo.
Come elenco tutti i container arrestati?
Usa docker ps -a per vedere tutti i container, inclusi quelli arrestati.
A cosa serve il comando docker exec?
Ti consente di eseguire comandi all’interno di un container in esecuzione, spesso usato per il debug o per verifiche manuali.
Docker è solo per sistemi basati su Linux?
No, Docker supporta anche macOS e Windows, usando macchine virtuali leggere per abilitare la containerizzazione.
Cosa fa il comando docker-compose down?
Arresta e rimuove container, reti e volumi creati da docker-compose up.
Come rimuovo le immagini Docker dangling?
Esegui docker image prune per ripulire le immagini inutilizzate e liberare spazio su disco.
Docker può essere usato in ambienti di produzione?
Assolutamente. Docker è ampiamente usato in produzione per distribuire applicazioni scalabili e riproducibili in ambienti cloud e on-prem.
Sono una content strategist: mi piace semplificare argomenti complessi. Ho aiutato aziende come Splunk, Hackernoon e Tiiny Host a creare contenuti coinvolgenti e informativi per il loro pubblico.


