In questo articolo esploriamo l’ambiente Docker, una piattaforma open source, realizzata in linguaggio Go, che consente di automatizzare il deployment, la gestione e l’esecuzione di applicazioni all’interno di container
Cos’è Docker
E’ una piattaforma open source, realizzata in linguaggio Go, che consente di automatizzare il deployment, la gestione e l’esecuzione di applicazioni all’interno di container portabili, leggeri, autosufficienti
Il motto di Docker è:
Configure once…run everywhere
cioè una volta configurato un container contenente file, librerie e dipendenze sono certo che possa funzionare ovunque indipendentemente dall’hardware sottostante
In un’architettura a microservizi, Docker consente di isolare ciascun microservizio all’interno di un proprio container, facilitando il rilascio, la scalabilità e la manutenzione delle singole componenti in modo indipendente. Inoltre, grazie alla sua portabilità, Docker assicura che lo stesso container possa essere eseguito identicamente su diverse piattaforme: dal computer di sviluppo al server di produzione o al cloud.
Benefici di Docker
- Deployment semplificato: impacchettando un’applicazione in un singolo componente distribuibile e configurabile da riga di comando, Docker permette di semplificare il deployment senza doversi preoccupare della configurazione dell’ambiente
- Disponibilità rapida: virtualizzando solo il kernel del sistema operativo e le componenti necessarie all’esecuzione dell’applicazione e non l’intera macchina, il container si avvia in pochi secondi rispetto ai lunghi tempi di avvio di una macchina virtuale
- Controllo granulare: consente di suddividere ulteriormente le risorse computazionali in microservizi garantendo un maggiore controllo sull’esecuzione delle applicazioni e un miglioramento complessivo dell’intero sistema
- Cicli di rilascio semplificati: basta pubblicare la nuova immagine Docker e ricaricare il container per avere tutto aggiornato
- Testing semplificato: testare un’applicazione in un container è più semplice poichè l’ambiente di testing è identico a quello di produzione
Componenti di Docker
Docker è composto da diversi elementi fondamentali:
Docker Engine
Il cuore della piattaforma, è il motore che gestisce la creazione, l’esecuzione e l’interazione con i container.
Docker Image
Un’immagine immutabile che rappresenta l’applicazione e il suo ambiente di esecuzione. Da questa immagine è possibile generare uno o più container.
Un’immagine Docker rappresenta la definizione di un container, la specifica di tutto ciò che serve al container per essere eseguito. Per fare una analogia, così come nel mondo della programmazione orientata agli oggetti:
- Una classe è una definizione astratta, un modello che descrive le proprietà e i comportamenti di un insieme di oggetti.
- Un oggetto è un’istanza concreta della classe, ovvero un’entità che esiste in memoria e che si comporta secondo la struttura definita dalla classe.
Analogamente, in Docker:
Un container è un’istanza in esecuzione di quell’immagine. È l’oggetto concreto derivato dall’immagine, dotato di uno spazio isolato, risorse proprie (rete, file system, memoria) e capace di interagire con il mondo esterno.
Una Docker image è un modello statico e immutabile che definisce un ambiente di esecuzione completo: include il sistema operativo base, il software da eseguire, le dipendenze e tutte le configurazioni necessarie.
Le immagini Docker sono costruite a partire da un’immagine di partenza e arricchite via via da metadati. Ogni modifica apportata ad un’immagine è contenuta in un layer ed è identificata da un ID e salvata sull’host. Se modifico un’immagine (aggiungo layer), per caricarla nel Docker registry non dovrò ricaricarla tutta ma caricherò solo i layer che rappresentano la modifica

Docker Container
un’istanza in esecuzione di una Docker Image. I container Docker contengono software, librerie e dipendenze, condividono il Kernel del S.O. host ma sono ambienti isolati tra loro.

Docker Volumes
Per loro natura i Container sono effimeri cioè non mantiene i propri dati e, una volta fermato; perde tutte le modifiche. Allora come fare per garantire la persistenza dei dati? Esempio: se avessi un database che lavora in un container come faccio a mantenere i dati salvati all’interno di esso quando fermo l’esecuzione del mio container?
Utilizzo i VOLUMI: un volume Docker è uno spazio di archiviazione gestito da Docker e utilizzato per conservare dati permanenti, separati dal ciclo di vita del container. I volumi possono essere condivisi tra più container e sono la soluzione consigliata per mantenere i dati persistenti.

Dockerfile
Un file di configurazione che definisce l’ambiente del container, includendo istruzioni su come costruirlo (ad esempio, quale sistema operativo base usare, quali pacchetti installare, ecc.).

Il Dockerfile è un file di testo contenente una serie di istruzioni che permettono di costruire un’immagine Docker personalizzata in modo automatico e ripetibile.
In altre parole, è lo script che definisce come dev’essere costruita l’immagine: quali software installare, quali file copiare, quale comando eseguire all’avvio, ecc.
Le istruzioni scritte nel Dockerfile vengono interpretate dal comando docker build
per generare un’immagine.
Sintassi di base:
# Base image
FROM node:18
# Directory di lavoro
WORKDIR /app
# Copia dei file locali nel container
COPY . .
# Installazione delle dipendenze
RUN npm install
# Porta esposta
EXPOSE 3000
# Comando da eseguire all’avvio del container
CMD ["npm", "start"]
Docker Hub
Un registry pubblico (o privato) dove è possibile trovare, condividere e pubblicare immagini Docker.
Sono presenti immagini di Sistemi operativi, Web Server, Database
Oltre alle immagini ufficiali sono presenti immagini di utenti che possono caricare liberamente le proprie creazioni e condividerle con la community
Comandi Docker
Comandi per Immagini
- Visualizzare tutte le immagini presenti:
docker image ls
- Scaricare un’immagine da un registry:
docker pull <nome_immagine>
- Rimuovere un’immagine:
docker image rm <nome_immagine_o_ID>
- Rimuovere tutte le immagini non utilizzate da alcun container:
docker image prune
- Assegnare un tag ad una immagine (ad esempio indicare la versione di un’immagine):
docker tag <ID_immagine_o_nome> <nome_repository>:<tag>
Esempio pratico: Supponiamo di aver creato un’immagine localmente, che ha come IMAGE ID
:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> a1b2c3d4e5f6 2 minutes ago 120MB
Vogliamo assegnarle il nome mario/ecommerce-backend
con la tag v1.0
. Usiamo:
docker tag a1b2c3d4e5f6 mario/ecommerce-backend:v1.0
A questo punto, con docker images
vedremo anche:
REPOSITORY TAG IMAGE ID CREATED SIZE
mario/ecommerce-backend v1.0 a1b2c3d4e5f6 2 minutes ago 120MB
- Visualizzare la storia di un’immagine (permette di visualizzare la cronologia dei layer (strati) che compongono una determinata immagine Docker):
docker image history <nome_immagine_o_ID>
- Visualizzare il contenuto e la configurazione di un’immagine:
docker image inspect <nome_immagine_o_ID>
Restituisce metadati come: Autore, Data di creazione, Strati (layers), Comando di default, Variabili d’ambiente predefinite, Architettura del sistema per cui è stata costruita
Comandi per i Container
- Visualizzare i container attivi:
docker container ls
//oppure docker ps
- Visualizzare tutti i container:
docker container ls -a
//oppure docker ps -a
- Start di un container:
docker start <nome_container_o_ID>
- Stop di un container:
docker stop <nome_container_o_ID>
-
Creare ed eseguire un container a partire da un’immagine. In altre parole, con
docker run
si lancia un’applicazione containerizzata.
docker run [opzioni] <nome_immagine> [comando] [argomenti]
Il file docker-compose.yml
Il file docker-compose.yml
è un file di configurazione scritto in formato YAML (YAML acronimo di “YAML Ain’t Markup Language” è un linguaggio di serializzazione dei dati utilizzato per scrivere file di configurazione per il deployment dell’infrastruttura) che consente di definire, gestire e avviare più container Docker in maniera coordinata, come se fossero un’unica applicazione multi-servizio.
È uno strumento centrale per i progetti basati su architettura a microservizi, in cui ogni servizio (es. database, backend, frontend, API gateway) viene eseguito in un container separato.
Serve a:
- Definire più servizi Docker (contenitori) in un unico file.
- Specificare reti, volumi, variabili d’ambiente, porte esposte, dipendenze tra container.
- Lanciare l’intera applicazione con un solo comando:-
docker-compose up
Struttura di base
Ecco un esempio semplificato:
version: '3.8'
services:
web:
build: .
ports:
- "8080:80"
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: password
In questo esempio:
- Sono definiti due servizi:
web
(che viene costruito localmente) edb
(basato sull’immagine ufficiale MySQL). - Vengono esposte le porte e impostate le variabili d’ambiente.
I principali elementi del file docker-compose.yml
:
Elemento | Descrizione |
---|---|
version | Specifica la versione del formato del file (es. '3.8' ) |
services | Elenco dei container/servizi da avviare |
build | Indica la directory da cui costruire l’immagine (richiede un Dockerfile) |
image | Specifica un’immagine da scaricare dal Docker Hub |
ports | Mappa le porte tra host e container (host:container ) |
volumes | Mappa volumi per la persistenza dei dati |
environment | Imposta variabili d’ambiente per il container |
depends_on | Specifica le dipendenze tra i servizi (ordine di avvio) |
networks | Definisce le reti private tra container |
command | Sovrascrive il comando predefinito del container |
Lascia un commento