Guida Docker: Creare ambienti isolati e portabili con Dockerfile

Docker ha rivoluzionato il modo in cui sviluppatori e amministratori di sistema gestiscono, distribuiscono e scalano le applicazioni. Grazie alla sua innovativa tecnologia di containerizzazione, Docker permette di creare ambienti isolati e portabili che garantiscono coerenza tra sviluppo, test e produzione. Con Docker, la complessità delle dipendenze e delle configurazioni viene drasticamente ridotta, favorendo una maggiore efficienza e velocità nel ciclo di sviluppo del software. La sua flessibilità e potenza hanno rapidamente reso Docker uno strumento indispensabile nell’arsenale di ogni professionista IT, aprendo la strada a nuove possibilità nel mondo del DevOps e della Continuous Integration/Continuous Deployment (CI/CD). In questo articolo, esploreremo le caratteristiche che rendono Docker una piattaforma eccezionale, analizzando come essa possa trasformare radicalmente il modo di lavorare di team e aziende in tutto il mondo.

Prime convenzioni

Un ambiente isolato è definito in gergo tecnico “container”. Per crearne uno bisogna avvalersi di un set di istruzioni raggruppate in un file di testo che prende il nome di Dockerfile.

Altri due termini che si danno per scontati in ambito Docker sono Guest e Host.

  • Host è il sistema su cui risulta installato Docker e sul quale verranno fatti girare i container.
  • Guest è il container, l’ambiente isolato che viene eseguito al di sopra dell’Host.

Struttura di un Dockerfile

Un Dockerfile è assimilabile ad uno script bash semplificato che descrive una serie di istruzioni da svolgere in sequenza per creare l’ambiente di esecuzione.

Possiamo immaginare che ciascuna istruzione di questo file sia come un mattoncino da impilare, ciascuno con la sua forma e che tutti insieme daranno vita all’ambiente isolato desiderato.

La sintassi di un dockerfile prevede una parola chiave, seguita da una serie di parametri.

Per semplificare i concetti, le direttive trattate in questo articolo saranno:

  • FROM
  • RUN
  • WORKDIR
  • COPY
  • CMD

Con sole queste 5 direttive è possibile creare un’immagine completa di tutto e pronta all’uso.

La direttiva FROM

La prima direttiva, FROM, descrive da quale base di partenza si vuole partire. Per chi non conoscesse Docker e ha bisogno di un’analogia, possiamo paragornarlo ad una macchina virtuale e il from indica il sistema operativo di base dal quale partire, con la sua configurazione di partenza. Tale base di partenza è denominata immagine.

L’elenco delle immagini di base sono disponibili sul repository ufficiale delle immagini Docker, ce ne sono per qualsiasi necessità e per le più disparate architetture.

Di ciascuna immagine troveremo un gran numero di varianti, ciascuna opportunamente etichettata, ovvero il tag.

Ad un’immagine di partenza ci si riferisce solitamente con il nome dell’immagine seguita dal tag di riferimento a cui si interpone il carattere “:”. Per esempio: php:latest.

Quindi la prima istruzione che si troverà in un Dockerfile sarà, per esempio:

FROM php:latest

Questo comando indicherà che il container che si sta preparando è derivato dall’immagine php con tag latest.

Per convenzione latest, corrisponde alla versione più recente disponibile nel repository, il builder di Docker riconosce questo tag speciale e genererà un’immagine con l’ultima versione di PHP.

La direttiva RUN

Questa direttiva permette di eseguire un comando bash nell’immagine in corso di creazione.

Per esempio il seguente comando creerà la directory my-workspace nel container.

RUN mkdir /my-workspace

Il comando run non è limitato alla sola creazione delle cartelle ma può svolgere compiti più complessi, come per esempio il download di asset da internet, clonare un repository GIT o l’installazione di pacchetti e librerie nel sistema operativo del container.

Per lo scopo introduttivo di questo articolo, è sufficiente la creazione di una directory.

Sia ben chiaro però che un utilizzo consapevole di questa direttiva può ottimizzare significativamente lo spazio ed il tempo necessario per la creazione di un’immagine.

La direttiva WORKDIR

La direttiva WORKDIR, permette di contestualizzare tutte le operazioni successive ad una precisa directory del container.

Eseguendo quindi il comando a seguire, le successive direttive del Dockerfile verranno influenzate.

WORKDIR /my-workspace

Se dopo aver eseguito questo comando si eseguisse un nuovo comando RUN mkdir example, il risultato ottenuto sarà una cartella example dentro my-workspace.

La direttiva COPY

Questa direttiva permette di trasferire dei file da un contesto all’immagine che si sta costruendo.

La sintassi è

COPY <sorgente> <destinazione guest>

Sostituire <sorgente> con un percorso del sistema Host, relativo al contesto di esecuzione o assoluto (inizierà con /). Inoltre <sorgente> può essere un URL, quindi è possibile copiare una risorsa remota.

Sostituire <destinazione> con un percorso nell’immagine Guest.

Supponendo di dover copiare il contenuto integrale della directory in cui si trova il Dockerfile, all’interno della directory precedentemente creata my-workspace, il comando da eseguire sarà.

COPY . /my-workspace/

O, considerando la precente istruzione WORKDIR, sarà sufficiente riportare come “.”

COPY . .

La direttiva CMD

Questa direttiva descrive il comando da eseguire non appena il container viene avviato.

Terminata l’esecuzione di questo comando, il container sarà a sua volta terminato.

La sintassi della direttiva CMD, prevede un insieme di parametri sotto forma di array in formato JSON che verranno ricongiunti in un’unica stringa prima di essere eseguita nel terminale del sistema guest.

CMD ["php", "/my-workspace/hello.php"]

Il Dockerfile completo

Mettendo insieme tutti i pezzi si otterrà il seguente dockerfile.

FROM php:latest
RUN mkdir /my-workspace
WORKDIR /my-workspace
COPY . .
CMD ["php", "/my-workspace/hello.php"]

Per eseguirlo sarà sufficiente posizionarsi nella directory in cui è presente il Dockerfile e compilare l’immagine attraverso il comando:

docker build -t php_hello_world .

Quindi avviarlo con il comando

docker run php_hello_world

Supponendo di avere un file nella medesima directory del Dockerfile denominato hello.php con il seguente codice:

<?php
echo "Hello Docker!";

L’output ottenuto dall’esecuzione del comando di poco più sopra, sarà:

Hello Docker!

Conclusioni

Questo articolo è una base di partenza per approfondire numerosi aspetti, come il controllo dei layer, la parametrizzazione del Dockerfile, le immagini temporanee, la non meno importante hardenizzazione delle immagini e tanti altri aspetti che quotidianamente in Axio Studio, l’Azienda in cui lavoro, curiamo per i nostri Partner.


Commenti

2 risposte a “Guida Docker: Creare ambienti isolati e portabili con Dockerfile”

  1. […] ho già avuto modo di scrivere nel precedente articolo presente su questo blog, Docker permette di creare ambienti coerenti e consistenti nei vari […]

  2. […] il comando docker build -t php_hello_world . dalla directory di progetto, così come descritto anche nel precedente articolo sarà creato il container, ovvero l’insieme dei layer che danno forma all’ambiente […]