Programma
Quando ho iniziato a usare Docker, mi sono reso subito conto di quanto fosse potente. Immagina di configurare il tuo ambiente di sviluppo in pochi minuti invece che in ore, o di eseguire applicazioni su macchine diverse senza il classico problema del "sul mio funziona".
Docker semplifica il modo in cui costruiamo, distribuiamo ed eseguiamo le applicazioni, impacchettandole in container leggeri e portabili. Che tu sia uno sviluppatore, un data scientist o un amministratore di sistema, padroneggiare Docker può evitarti grattacapi e rendere i tuoi flussi di lavoro più efficienti.
In questo tutorial ti guiderò attraverso le basi: installare Docker, capire i concetti chiave ed eseguire la tua prima applicazione containerizzata. Alla fine non solo saprai come funziona Docker, ma avrai anche fatto pratica, ponendo solide basi per argomenti più avanzati. Iniziamo!
Che cos’è Docker?
Docker è una piattaforma open-source di containerizzazione che semplifica il deploy delle applicazioni impacchettando il software e le sue dipendenze in un'unità standard chiamata container. Diversamente dalle macchine virtuali tradizionali, i container Docker condividono il kernel del sistema operativo host, risultando più efficienti e leggeri.
I container garantiscono che un’applicazione venga eseguita nello stesso modo in ambienti di sviluppo, test e produzione. Questo riduce i problemi di compatibilità e migliora la portabilità su varie piattaforme. Grazie alla sua flessibilità e scalabilità, Docker è diventato uno strumento fondamentale nei flussi di lavoro DevOps moderni e nello sviluppo cloud-native.

Logo ufficiale di Docker.
Installare Docker
Docker può essere installato su vari sistemi operativi, tra cui Windows, macOS e Linux. Sebbene le funzionalità di base siano le stesse su tutte le piattaforme, il processo d'installazione differisce leggermente a seconda del sistema. Qui sotto trovi le istruzioni passo passo per installare Docker sul sistema operativo che preferisci.
Installare Docker su Windows
- Scarica Docker Desktop per Windows.

Scarica il programma di installazione di Docker Desktop per Windows
- Esegui l'installer e segui le istruzioni di configurazione.

Installazione di Docker Desktop per Windows
- Abilita l'integrazione con WSL 2 se richiesto.
- Verifica l'installazione eseguendo
docker –versionin PowerShell.

Verifica della versione di Docker dopo l'installazione tramite Powershell
5. Avvia l'app Docker Desktop dal menu Esegui.

Avvio dell'applicazione Docker Desktop su Windows
Installare Docker su macOS
- Scarica Docker Desktop per Mac.

Scarica l'installer di Docker Desktop per Mac
- Apri il file
.dmgscaricato e trascina Docker nella cartella Applicazioni. - Avvia Docker e completa la configurazione.
- Verifica l'installazione usando
docker –versionnel terminale.
Installare Docker su Linux (Ubuntu)
- Aggiorna gli indici dei pacchetti:
sudo apt update - Installa le dipendenze:
sudo apt install apt-transport-https ca-certificates curl software-properties-common - Aggiungi la chiave GPG ufficiale di Docker:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - - Aggiungi il repository di Docker:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" - Installa Docker:
sudo apt install docker-ce - Verifica l'installazione:
docker –version
Concetti di base di Docker
Ora che hai installato Docker, potresti essere impaziente di iniziare subito a eseguire container. Ma prima, è importante capire alcuni concetti chiave che costituiscono le fondamenta del funzionamento di Docker. Questi concetti ti aiuteranno a orientarti meglio ed evitare gli errori più comuni dei principianti.
Al cuore di Docker ci sono le immagini, che fungono da blueprint per i container; i container, che sono le istanze in esecuzione di queste immagini; e Docker Hub, un repository centralizzato per condividere e gestire le immagini.
Esploriamo più in dettaglio ciascuno di questi concetti.
Immagini Docker
Le immagini Docker sono i mattoni fondamentali dei container. Sono template immutabili in sola lettura che contengono tutto il necessario per eseguire un’applicazione, incluso il sistema operativo, il codice dell’app, il runtime e le dipendenze.
Le immagini vengono create usando un Dockerfile, che definisce le istruzioni per costruire un’immagine strato dopo strato.
Le immagini possono essere salvate e recuperate da registry di container come Docker Hub.
Ecco alcuni comandi di esempio per lavorare con le immagini:
docker pull nginx: scarica l'ultima immagine di Nginx da Docker Hub.docker images: elenca tutte le immagini disponibili sulla macchina locale.docker rmi nginx: rimuove un’immagine dalla macchina locale.
Container Docker
Un container Docker è un'istanza in esecuzione di un’immagine Docker. I container forniscono un ambiente di runtime isolato in cui le applicazioni possono essere eseguite senza interferire tra loro o con il sistema host. Ogni container ha il proprio filesystem, networking e spazio dei processi, ma condivide il kernel dell’host.
I container seguono un ciclo di vita semplice che comprende creazione, avvio, arresto ed eliminazione. Ecco una panoramica dei comandi di gestione più comuni:
- Creare un container:
docker createodocker run - Avviare un container:
docker start - Arrestare un container:
docker stop - Riavviare un container:
docker restart - Eliminare un container:
docker rm
Vediamo un esempio pratico. Il comando seguente esegue un container Nginx in modalità detached (in background), mappando la porta 80 all'interno del container sulla porta 8080 della macchina host:
docker run -d -p 8080:80 nginx
Dopo aver eseguito questo comando, Docker scaricherà l'immagine di Nginx (se non è già disponibile), creerà un container e lo avvierà.
Per verificare tutti i container in esecuzione e arrestati:
docker ps -a
Verrà visualizzato un elenco di tutti i container con dettagli come stato e porte assegnate.
Docker Hub
Docker Hub è un servizio di registry cloud per cercare, archiviare e distribuire immagini di container. Gli utenti possono eseguire il push di immagini personalizzate su Docker Hub e condividerle pubblicamente o privatamente.
Ecco alcuni comandi per interagire con Docker Hub:
docker login: autentica su Docker Hub.docker push my-image: carica un’immagine personalizzata su Docker Hub.docker search ubuntu: cerca immagini ufficiali e della community.docker pull ubuntu: scarica un'immagine di Ubuntu da Docker Hub.
Nuovo alla containerizzazione? Metti basi solide con il corso Containerization and Virtualization Concepts.
Eseguire il tuo primo container Docker
Ora che abbiamo coperto i concetti base di Docker, è il momento di metterli in pratica! Iniziamo eseguendo il nostro primo container per assicurarci che Docker sia installato correttamente e funzioni come previsto.
Per testare l'installazione di Docker, apri PowerShell (Windows) o Terminale (Mac e Linux) ed esegui:
docker run hello-world
Questo scarica l'immagine hello-world da DockerHub e la esegue in un container.

Esempio dell'immagine Docker hello-world
Ora facciamo un passo in più e avviamo un'applicazione reale: un server web Nginx. Esegui il seguente comando:
docker run -d -p 8080:80 nginx
Il comando sopra fa quanto segue:
- Il flag
-desegue il container in modalità detached, cioè in background. - Il flag
-p 8080:80mappa la porta 80 all'interno del container sulla porta 8080 della tua macchina locale, permettendoti di accedere al server web.
Una volta eseguito con successo, apri un browser e visita: http://localhost:8080

Accesso al server web su localhost:8080
Dovresti vedere la pagina di benvenuto predefinita di Nginx, a conferma che il tuo server web sta girando dentro un container!
Vedrai anche un container in esecuzione nella tua Docker Desktop:

Container Nginx in esecuzione sulla porta 8080
Creare la tua prima immagine Docker
Finora abbiamo eseguito immagini preconfezionate da Docker Hub. Ma se ti serve un ambiente personalizzato su misura per la tua applicazione? È qui che entra in gioco la creazione di un’immagine Docker tutta tua.
Creare un’immagine Docker significa scrivere un Dockerfile, uno script che automatizza la build dell’immagine. Questo garantisce coerenza e portabilità tra diversi ambienti. Una volta creata, l'immagine può essere eseguita come container per far girare le applicazioni in un ambiente isolato.
In questa sezione impareremo le basi per scrivere un Dockerfile, creare un’immagine personalizzata ed eseguirla come container.
Basi del Dockerfile
Un Dockerfile è uno script che contiene una serie di istruzioni che definiscono come viene costruita un’immagine Docker. Automatizza il processo di creazione, garantendo coerenza tra gli ambienti. Ogni istruzione in un Dockerfile crea un nuovo layer nell’immagine. Ecco la scomposizione di un Dockerfile di esempio per una semplice app Python Flask:
# Base image containing Python runtime
FROM python:3.9
# Set the working directory inside the container
WORKDIR /app
# Copy the application files from the host to the container
COPY . /app
# Install the dependencies listed in requirements.txt
RUN pip install -r requirements.txt
# Define the command to run the Flask app when the container starts
CMD ["python", "app.py"]
Nel comando sopra:
-v my-volume:/app/datamonta lo storagemy-volumenella directory/app/dataall'interno del container.- Qualsiasi dato salvato in
/app/datapersisterà anche se il container si arresta o viene rimosso.
Scomponendo il Dockerfile sopra:
FROM python:3.9: specifica l'immagine di base con Python 3.9 preinstallato.WORKDIR /app: imposta/appcome directory di lavoro nel container.COPY . /app: copia tutti i file dalla directory corrente dell'host a/appnel container.RUN pip install -r requirements.txt: installa tutte le dipendenze richieste all'interno del container.CMD ["python", "app.py"]: definisce il comando da eseguire all'avvio del container.
Creare ed eseguire l'immagine
Una volta definito il Dockerfile, puoi creare ed eseguire l'immagine con i seguenti comandi:
Passo 1: crea l'immagine
docker build -t my-flask-app .
Il comando precedente:
- Usa la directory corrente (
.) come contesto di build. - Legge il
Dockerfileed esegue le sue istruzioni. - Assegna un tag (
-t) all'immagine risultante comemy-flask-app.
Passo 2: esegui l'immagine come container
docker run -d -p 5000:5000 my-flask-app
Il comando precedente:
- Esegue il container in modalità detached (
-d). - Mappa la porta 5000 all'interno del container sulla porta 5000 dell'host (
-p 5000:5000).
Una volta in esecuzione, puoi accedere all'app Flask andando su http://localhost:5000 nel browser.
Volumi Docker e persistenza
Per impostazione predefinita, i dati all'interno di un container Docker sono temporanei: quando il container si ferma o viene rimosso, i dati scompaiono. Per mantenere i dati tra i riavvii e condividerli tra più container, Docker fornisce i volumi, un meccanismo integrato per gestire in modo efficiente lo storage persistente.
A differenza dell'archiviazione dei dati nel filesystem del container, i volumi sono gestiti separatamente da Docker, risultando più efficienti, flessibili e facili da sottoporre a backup.
Nella prossima sezione vedremo come creare e usare i volumi Docker per garantire la persistenza dei dati nei tuoi container.
Creare e usare i volumi Docker
Passo 1: crea un volume
Prima di usare un volume, dobbiamo crearne uno. Esegui il seguente comando:
docker volume create my-volume
Questo crea un volume nominato chiamato my-volume, che Docker gestirà separatamente da qualsiasi container specifico.Passo 2: usa il volume in un container
Ora avviamo un container e montiamo il volume al suo interno:
docker run -d -v my-volume:/app/data my-app
Nel comando sopra:
-v my-volume:/app/datamonta lo storagemy-volumenella directory/app/dataall'interno del container.- Qualsiasi dato memorizzato in
/app/datapersisterà anche se il container si ferma o viene rimosso.
Docker Compose per applicazioni multi-container
Finora abbiamo lavorato con applicazioni a singolo container, ma molte applicazioni reali richiedono più container che lavorino insieme. Ad esempio, un'app web potrebbe aver bisogno di un server backend, un database e un livello di caching, ciascuno in un proprio container. Gestire questi container manualmente con comandi docker run separati può diventare rapidamente tedioso.
Ed è qui che entra in gioco Docker Compose.
Che cos’è Docker Compose?
Docker Compose è uno strumento che semplifica la gestione di applicazioni multi-container. Invece di eseguire più comandi docker run, puoi definire l'intero stack applicativo in un file docker-compose.yml e distribuirlo con un solo comando.
Scrivere un file Docker Compose
Ora creiamo un esempio reale: una semplice applicazione Node.js che si connette a un database MongoDB. Invece di gestire i due container separatamente, li definiremo in un file docker-compose.yml.
Ecco come definiamo il nostro setup multi-container in Docker Compose:
version: '3'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- database
database:
image: mongo
volumes:
- db-data:/data/db
volumes:
db-data:
Scomponendo il file sopra:
version: '3': specifica la versione di Docker Compose.services:: definisce i singoli servizi (container).web:: definisce l'applicazione web Node.js.database:: definisce il container del database MongoDB.volumes:: crea un volume nominato (db-data) per la persistenza dei dati di MongoDB.
Eseguire applicazioni multi-container
Una volta pronto il file docker-compose.yml, possiamo avviare l'intero stack applicativo con un unico comando:
docker-compose up -d
Il comando precedente avvia sia il container web sia quello del database in modalità detached (-d).
Per fermare tutti i servizi, usa:
docker-compose down
Questo arresta e rimuove tutti i container, preservando però volumi e impostazioni di rete.
Nozioni di base sul networking di Docker
Finora ci siamo concentrati sull'esecuzione dei container e sulla gestione dello storage, ma cosa succede quando i container devono comunicare tra loro? Nella maggior parte delle applicazioni reali, i container non operano in isolamento: devono scambiarsi dati, che si tratti di un web server che parla con un database o di microservizi che interagiscono fra loro.
Docker offre una gamma di opzioni di rete per soddisfare casi d'uso diversi, da reti interne isolate a configurazioni accessibili esternamente.
Pronto a fare un salto di livello con Docker? Iscriviti a Intermediate Docker per esplorare multi-stage build, networking avanzato e altro ancora!
Che cos’è il networking di Docker?
Il networking di Docker è una funzionalità integrata che consente ai container di comunicare tra loro, sia sullo stesso host sia su più host in un ambiente distribuito. Fornisce isolamento, segmentazione e opzioni di connettività adatte a diversi scenari di deploy.
Docker supporta vari tipi di rete, ciascuno per casi d'uso diversi:
- Bridge (predefinita): i container sullo stesso host comunicano tramite una rete virtuale interna. Ogni container ottiene un indirizzo IP privato all'interno della rete bridge e può raggiungere gli altri tramite i nomi dei container.
- Esempio:
docker network create my-bridge-network - Ideale per eseguire più container su un singolo host che devono comunicare in modo sicuro senza esporre i servizi all'esterno.
- Host: i container condividono lo stack di rete dell'host e usano direttamente l'indirizzo IP e le porte dell'host.
- Esempio:
docker run --network host nginx - Utile quando serve alta performance e non è richiesto l'isolamento di rete, ad esempio per agenti di monitoraggio o applicazioni a bassa latenza.
- Overlay: consente la comunicazione tra container su host diversi creando una rete distribuita.
- Esempio:
docker network create --driver overlay my-overlay-network - Progettata per deploy orchestrati come Docker Swarm, dove i servizi coprono più nodi.
- Macvlan: assegna un indirizzo MAC univoco a ciascun container, facendolo apparire come un dispositivo fisico sulla rete.
- Esempio:
docker network create -d macvlan --subnet=192.168.1.0/24 my-macvlan - Usata quando i container necessitano di accesso diretto alla rete, ad esempio integrando sistemi legacy o interagendo con reti fisiche.
Eseguire container su reti personalizzate
Vediamo come impostare e usare una rete bridge personalizzata per la comunicazione tra container.
Passo 1: crea una rete personalizzata
Prima di eseguire i container, creiamo una rete dedicata:
docker network create my-custom-network
Questo comando crea una rete isolata a cui i container possono collegarsi per comunicare tra loro.
Passo 2: esegui i container sulla rete
Ora avviamo due container e connettiamoli alla rete appena creata:
docker run -d --network my-custom-network --name app1 my-app
docker run -d --network my-custom-network --name app2 my-app
- Il flag
--network my-custom-networkcollega il container alla rete specificata. - Il flag
--nameassegna un nome univoco al container, rendendo più semplice farvi riferimento.
Ora app1 e app2 possono comunicare usando i rispettivi nomi di container. Puoi testare la connettività con il comando ping all'interno di uno dei container:
docker exec -it app1 ping app2
Se è tutto configurato correttamente, vedrai una risposta che conferma la comunicazione tra i container.
Ispezionare le reti Docker
Per verificare le configurazioni di rete e i container connessi, usa:
docker network inspect my-custom-network
Questo comando fornisce dettagli sulla rete, inclusi intervalli IP, container connessi e configurazioni.
Esporre e pubblicare porte
Quando esegui container che devono essere accessibili dall'esterno, puoi esporre porte specifiche.
Ad esempio, per eseguire un server web Nginx ed esporlo sulla porta 8080 della tua macchina locale, usa:
docker run -d -p 8080:80 nginx
Questo mappa la porta 80 all'interno del container sulla porta 8080 dell'host, rendendo il servizio accessibile tramite http://localhost:8080.
Best practice per il networking di Docker
- Usa reti personalizzate: evita la rete bridge predefinita in produzione per ridurre accessi indesiderati tra container.
- Sfrutta la discovery basata su DNS: invece di hardcodare gli indirizzi IP, usa i nomi dei container per abilitare la service discovery dinamica.
- Limita l'esposizione esterna: usa firewall o policy di rete per controllare l'accesso ai servizi.
- Monitora il traffico: utilizza strumenti come
docker network inspect, Wireshark o Prometheus per analizzare il traffico di rete e rilevare anomalie. - Ottimizza le reti overlay: se distribuisci in un setup distribuito, ottimizza le reti overlay per ridurre la latenza sfruttando opzioni di routing locale all'host.
Best practice Docker e prossimi passi
Ora che hai imparato le basi di Docker, è il momento di fare un salto di qualità e adottare best practice che ti aiuteranno a creare applicazioni containerizzate sicure, efficienti e manutenibili.
Le seguenti best practice ti aiuteranno a snellire i flussi di lavoro Docker ed evitare gli errori più comuni.
- Usa immagini base ufficiali: preferisci sempre immagini ufficiali e ben mantenute per garantire sicurezza e stabilità. Le immagini ufficiali sono ottimizzate, aggiornate regolarmente e meno inclini a vulnerabilità.
- Mantieni le immagini leggere: riduci le dimensioni scegliendo immagini base minimali (ad es.,
python:3.9-sliminvece dipython:3.9). Rimuovi dipendenze e file non necessari per ottimizzare spazio e tempi di pull. - Usa build multi-stage: ottimizza i Dockerfile separando dipendenze di build e di runtime. Le multi-stage build includono nel risultato finale solo gli artefatti necessari, riducendo dimensioni e superficie d'attacco.
- Tagga correttamente le immagini: usa sempre tag versionati (ad es.,
my-app:v1.0.0) invece dilatestper evitare aggiornamenti imprevisti durante il pull. - Analizza le immagini per vulnerabilità: usa strumenti di scansione come
docker scan,TrivyoClairper identificare e correggere vulnerabilità prima del deploy. - Gestisci in modo sicuro le variabili d'ambiente: evita di archiviare credenziali sensibili nelle immagini. Usa Docker secrets, variabili d'ambiente o strumenti esterni di gestione segreti come AWS Secrets Manager o HashiCorp Vault.
- Usa file .dockerignore: escludi file non necessari (ad es.,
.git, node_modules,venv) per ridurre la dimensione del contesto di build e prevenire l'inclusione accidentale di file sensibili nelle immagini. - Abilita logging e monitoraggio: utilizza strumenti come Prometheus, Grafana e Fluentd per i log e il monitoraggio dei container. Ispeziona i log con
docker logse abilita il logging strutturato per una migliore osservabilità.
Una volta padroneggiate le basi di Docker, ci sono molti argomenti avanzati da esplorare. Ecco alcune aree su cui vale la pena proseguire:
- Docker Swarm & Kubernetes: esplora Docker Swarm (clustering integrato) e Kubernetes (orchestrazione di livello enterprise con autoscaling e service discovery) per un'orchestrazione di livello produttivo.
- Best practice di sicurezza dei container: per mettere in sicurezza le applicazioni containerizzate, segui le linee guida CIS Docker Benchmark e implementa il controllo degli accessi basato sui ruoli (RBAC).
- Pipeline CI/CD con Docker: automatizza build di immagini, scansioni di sicurezza e deploy usando GitHub Actions, GitLab CI o Jenkins.
- Sviluppo cloud-native: sfrutta Docker con piattaforme cloud come AWS ECS, Azure Container Instances e Google Cloud Run per deploy scalabili e gestiti.
- Strategie di persistenza dei dati: per una gestione ottimale dello storage, comprendi le differenze tra volumi Docker, bind mount e tmpfs.
Conclusione
Docker ha rivoluzionato il modo in cui gli sviluppatori costruiscono, distribuiscono ed eseguono le applicazioni, rendendolo uno strumento essenziale per lo sviluppo software moderno.
In questo tutorial abbiamo visto:
- Che cos'è Docker e perché è importante
- Come installarlo ed eseguire il tuo primo container
- Concetti chiave come immagini, container e networking
- Storage persistente con i volumi Docker
- Applicazioni multi-container con Docker Compose
- Best practice per sicurezza, performance e scalabilità
Ma questo è solo l'inizio! Se vuoi approfondire la tua competenza su Docker, puoi seguire un corso per principianti Introduction to Docker. Per una conoscenza più approfondita, puoi seguire un corso Intermediate Docker che copre multi-stage build, strumenti di rete Docker e Docker Compose. Infine, puoi anche puntare alla certificazione Docker: dai un'occhiata a The Complete Docker Certification (DCA) Guide for 2025 se ti interessa!
FAQs
In cosa Docker è diverso da una macchina virtuale (VM)?
I container Docker condividono il kernel del sistema operativo host, risultando leggeri e più veloci, mentre le macchine virtuali (VM) richiedono un intero sistema operativo guest, risultando più pesanti e lente. I container sono più adatti ai microservizi e alla scalabilità rapida, mentre le VM sono indicate per eseguire ambienti OS diversi sullo stesso hardware.
Qual è la differenza tra Docker CE e Docker EE?
Docker Community Edition (CE) è la versione gratuita e open-source, adatta a singoli sviluppatori e piccoli progetti. Docker Enterprise Edition (EE) è una versione a pagamento con funzionalità aggiuntive di sicurezza, gestione e supporto, ideale per deployment enterprise su larga scala.
Docker può essere eseguito su Windows senza usare WSL 2?
Sì, Docker Desktop per Windows offre due modalità: backend basato su WSL 2 (consigliato) e backend Hyper-V. Il backend WSL 2 offre prestazioni e integrazione migliori con Windows, mentre Hyper-V è un'alternativa se WSL 2 non è disponibile.
Cosa sono le immagini Docker multi-arch?
Le immagini multi-arch consentono a un'unica immagine Docker di supportare più architetture (ad es., x86, ARM). Ciò garantisce che la stessa immagine possa essere eseguita su piattaforme hardware diverse senza modifiche, risultando utile per dispositivi IoT e ambienti cloud.
Come gestisce la sicurezza Docker?
Docker migliora la sicurezza tramite isolamento dei namespace, control group (cgroups) e profili seccomp. Inoltre, le best practice includono eseguire i container come utenti non root, usare immagini base minimali, abilitare il content trust per la verifica delle immagini e analizzare le immagini alla ricerca di vulnerabilità con strumenti come docker scan o Trivy.


