Vai al contenuto principale
Categorie articolo: Code

Come containerizzare un’applicazione con Docker

27 Novembre 2025 - 4 minuti di lettura

Ricordo un progetto universitario realizzato insieme a un compagno di corso: utilizzavamo lo stesso codice, ma il programma si comportava in modo diverso sui nostri computer.

Non riuscendo a capire quale delle due macchine stesse eseguendo correttamente l’applicazione, abbiamo deciso di creare un container Docker e di eseguire al suo interno il nostro progetto.
Questa scelta ci ha permesso di continuare lo sviluppo e consegnare l’elaborato nei tempi previsti, senza perdere ore preziose a individuare la causa delle discrepanze tra i due ambienti.

Solo in seguito abbiamo scoperto che il problema era dovuto a una versione differente di una libreria di sistema.
Da quell’esperienza ho compreso quanto la containerizzazione possa semplificare lo sviluppo e la distribuzione delle applicazioni, rendendo i progetti più coerenti e affidabili.

Eccomi quindi con questo articolo in cui vi condividerò i principi fondamentali per iniziare a utilizzare Docker e trarne il massimo beneficio nei vostri progetti.

Concetti base di Docker

Partiamo dalla teoria per capire passo passo quali elementi sono necessari per conteinerizzare un’applicazione con Docker.

Docker

Docker è una piattaforma open source che consente di sviluppare, distribuire ed eseguire applicazioni in modo rapido ed efficiente.
Rispetto alle classiche macchine virtuali, i container Docker sono molto più leggeri e sono più efficienti sia in termini di performance sia in termini di risorse, poiché condividono il kernel del sistema operativo host invece di emulare un intero sistema operativo.
Docker inoltre consente l’isolamento delle applicazioni dall’infrastruttura sottostante: non devi preoccuparti di dove esegui il deploy, il container garantisce la coerenza su tutti gli ambienti in cui è eseguito.
Ultimo vantaggio, ma non meno importante, Docker rende più semplice scalare le applicazioni, permettendo di gestire facilmente carichi di lavoro intensi.

Dockerfile

Il Dockerfile è un file di testo che contiene una serie di istruzioni che Docker utilizza per costruire un’immagine.
Ogni Dockerfile inizia con l’istruzione FROM, che definisce l’immagine di base da cui partire.
Questa può essere un sistema operativo leggero, come Alpine, oppure un’immagine specifica più adatta al progetto in corso (tutte le immagini di base sono disponibili su DockerHub).

Le istruzioni successive consentono di personalizzare l’immagine di partenza e creare una configurazione ottimizzata per le proprie esigenze.
Tra le istruzioni più comuni troviamo:

  • RUN: esegue comandi all’interno dell’immagine durante la fase di build.
  • COPY: copia file e directory dal contesto di build all’interno dell’immagine.
  • WORKDIR: imposta la directory di lavoro per le istruzioni successive.
  • EXPOSE: specifica le porte su cui l’applicazione sarà in ascolto.
  • ENTRYPOINT: definisce l’eseguibile che riceve i comandi passati al container Docker.
  • CMD: stabilisce il comando eseguito di default quando il container Docker viene avviato.

Immagine

Le immagini Docker sono pacchetti completi che contengono tutto il necessario per eseguire un’applicazione all’interno di un container Docker: codice, runtime, librerie e strumenti di sistema, oltre alle relative configurazioni. Derivano dall’elaborazione di un Dockerfile e possono essere distribuite ed eseguite in modo portabile su qualsiasi ambiente che supporti Docker, garantendo coerenza e affidabilità tra sviluppo, test e produzione.

Container

Un container Docker è un’istanza attiva e in esecuzione di un’immagine Docker. Mentre l’immagine rappresenta un pacchetto statico che include tutto il necessario per avviare un’applicazione, il container è l’ambiente isolato in cui l’applicazione viene realmente eseguita.
I container Docker consentono di isolare applicazioni e dipendenze dal sistema operativo della macchina host, garantendo coerenza e affidabilità. In questo modo il software funziona sempre nello stesso modo, indipendentemente dall’ambiente in cui viene distribuito: sviluppo locale, server on-premise o infrastruttura cloud.

Hands-on tutorial: un esempio pratico con Docker

  1. Clonare il seguente repository di una semplice pagina HTML:
    git clone https://gist.github.com/685b4002511a2cc87e5718e0634c9ac1.git
  2. Entrare nella cartella del progetto:
    cd 685b4002511a2cc87e5718e0634c9ac1
  3. Creare un file chiamato `Dockerfile` con il seguente contenuto:
    FROM nginx
    COPY index.html /usr/share/nginx/html/index.html
    CMD sh -c "echo '##### Hello from Intré Docker image example #####' && nginx -g 'daemon off;'"
  4. Eseguire il comando per costruire l’immagine Docker:
    docker build -t nginx-intre-example .
  5. Avviare un container Docker dalla nuova immagine:
    docker run -d -p 8080:80 nginx-intre-example
    Nota: si possono avviare più container dalla stessa immagine a patto di cambiare la porta esposta (ad esempio usando `-p 8081:80`, `-p 8082:80`, ecc.) per evitare conflitti.
  6. Aprire una scheda del browser e digitare l’indirizzo http://localhost:8080 per vedere la pagina HTML che si trova all’interno del container precedentemente avviato.

Conclusione

Racchiudere un’applicazione in un container Docker consente di condividere i progetti in modo uniforme, senza preoccuparsi delle differenze tra gli ambienti in cui vengono eseguiti: funziona sempre allo stesso modo, ovunque.

Questo approccio semplifica il passaggio dallo sviluppo alla produzione, garantendo coerenza tra i vari ambienti: ciò che funziona in locale funzionerà anche sul server.
Inoltre, testare nuove funzionalità o correggere bug diventa più rapido ed efficiente, grazie alla possibilità di avviare in pochi istanti un ambiente pulito e isolato.

Docker ha trasformato il modo in cui distribuiamo le applicazioni, rendendo i processi più stabili, scalabili e veloci. Oggi la sua conoscenza rappresenta una competenza fondamentale per ogni sviluppatore.

Articolo scritto da