Nel nostro tutorial su Docker, ti spie­ghia­mo la piat­ta­for­ma di vir­tua­liz­za­zio­ne Docker e ti mostriamo con istru­zio­ni facili da seguire come uti­liz­zar­la sul tuo sistema Ubuntu 22.04.

Novità: offerta VPS
Il tuo server virtuale a prezzi im­bat­ti­bi­li

Prova il nostro VPS. I primi 30 giorni sono in omaggio e se allo scadere del periodo di prova non sarai convinto, ti rim­bor­se­re­mo tutte le spese sostenute.

Docker: struttura e funzioni

“Build, Ship and Run Any App, Anywhere”, è questo il motto con il quale la piat­ta­for­ma open source basata su container promuove un’al­ter­na­ti­va fles­si­bi­le e che non richiede molte risorse per l’emu­la­zio­ne di com­po­nen­ti hardware, basata sulle macchine virtuali (VM, ab­bre­via­zio­ne dall’inglese “Virtual Machine”).

Mentre la vir­tua­liz­za­zio­ne hardware classica si basa sull’avvio di diversi sistemi guest su un sistema host comune, con Docker le ap­pli­ca­zio­ni vengono eseguite grazie ai container come processi isolati su di uno stesso sistema. Nel caso di una vir­tua­liz­za­zio­ne server basata su container si parla quindi di una vir­tua­liz­za­zio­ne a livello del sistema operativo.

Immagine: Macchine virtuali e container Docker a confronto
Mentre ogni macchina virtuale avvia un sistema operativo dedicato, i container di Docker con­di­vi­do­no il kernel del sistema host.

Il grande vantaggio della vir­tua­liz­za­zio­ne basata su container sta nel fatto che ap­pli­ca­zio­ni con diversi requisiti possono essere eseguite iso­la­ta­men­te le une dalle altre, senza che sia ne­ces­sa­rio che venga messo a di­spo­si­zio­ne l’overhead di un sistema guest separato. Inoltre, le ap­pli­ca­zio­ni possono essere di­stri­bui­te con i container tra le varie piat­ta­for­me e in diverse in­fra­strut­tu­re senza dover essere adattate alle con­fi­gu­ra­zio­ni hardware o software del sistema host.

Docker è il più popolare progetto software tra quelli che mettono a di­spo­si­zio­ne degli utenti una tec­no­lo­gia di vir­tua­liz­za­zio­ne basata su container. La piat­ta­for­ma open source si basa su tre com­po­nen­ti fon­da­men­ta­li: per eseguire un container gli utenti hanno bisogno solamente di un Docker Engine e delle speciali Immagini Docker, che si ottengono da Docker Hub o possono essere create au­to­no­ma­men­te.

Consiglio

I container e le immagini Docker sono per lo più generici, ma possono anche essere per­so­na­liz­za­ti a seconda delle necessità. Per saperne di più, consulta il nostro articolo sui container Docker.

Immagini Docker

Si­mi­lar­men­te alle macchine virtuali, i container si basano sulle immagini Docker. Un’immagine è un modello non mo­di­fi­ca­bi­le che contiene tutte le in­for­ma­zio­ni ne­ces­sa­rie a Docker Engine per creare un container. Come copia portabile di un container un’immagine Docker viene descritta come un file di testo, si parla quindi di un Doc­ker­fi­le. Se un container deve essere lanciato su un sistema, per prima cosa viene caricato un pacchetto con l’immagine cor­ri­spet­ti­va, sempre che questa non sia già presente in locale. L’immagine caricata mette a di­spo­si­zio­ne il sistema di file ne­ces­sa­rio per il runtime, compresi tutti i parametri. Un container può essere con­si­de­ra­to come processo in ese­cu­zio­ne di un’immagine.

Docker Hub

Docker Hub è un registry per i re­po­si­to­ry di software, una sorta di libreria delle immagini Docker. Il servizio online si suddivide tra pubblico e privato. La sezione pubblica offre agli utenti la pos­si­bi­li­tà di caricare immagini svi­lup­pa­te au­to­no­ma­men­te e di con­di­vi­der­le con la community. Qui sono a di­spo­si­zio­ne un grande numero di immagini ufficiali del team di sviluppo di Docker e di affermati progetti open source. Le immagini che vengono caricate nella sezione privata del registry non sono ac­ces­si­bi­li pub­bli­ca­men­te, ma possono essere condivise ad esempio con i di­pen­den­ti della propria azienda o nei propri circoli di amici o co­no­scen­ti. Docker Hub è rag­giun­gi­bi­le all’indirizzo hub.docker.com.

Docker Engine

La parte centrale del progetto Docker è Docker Engine. Si tratta di un’ap­pli­ca­zio­ne open source client-server, a di­spo­si­zio­ne di tutti gli utenti nella versione attuale su tutte le piat­ta­for­me più co­no­sciu­te.

L’ar­chi­tet­tu­ra di base di Docker Engine si può sud­di­vi­de­re in tre com­po­nen­ti: un demone con funzioni di server, un’in­ter­fac­cia di pro­gram­ma­zio­ne (API) basata sul paradigma REST (Re­pre­sen­ta­tio­nal State Transfer) e il terminale del sistema operativo (Command-Line Interface, CLI) come in­ter­fac­cia utente (client).

  • Il demone Docker: su Docker Engine viene uti­liz­za­to un processo demone come server. Il demone viene eseguito in back­ground sul sistema host e serve per la gestione centrale di Docker Engine. Con questa funzione esso crea e gestisce tutte le immagini, i container e le reti.
  • API REST: l’API REST determina una serie di in­ter­fac­ce che per­met­to­no ad altri programmi di co­mu­ni­ca­re con il demone Docker e di dargli delle direttive. Uno di questi programmi è il terminale del sistema operativo.
  • Il terminale: come programma client Docker utilizza il terminale del sistema operativo. Questo in­te­ra­gi­sce con il demone Docker at­tra­ver­so l’API REST e permette agli utenti di gestirla tramite gli script o i dati forniti dagli utenti.
Consiglio

Nel 2017, Docker Engine è stato ri­no­mi­na­to in Docker Community Edition (ab­bre­via­to in Docker CE), ma la do­cu­men­ta­zio­ne ufficiale e i re­po­si­to­ry Docker per lo più uti­liz­za­no ancora il vecchio nome. Oltre a Docker CE, esiste anche la Docker En­ter­pri­se Edition (Docker EE), che dispone di alcune fun­zio­na­li­tà premium. Tuttavia, è a pagamento ed è più adatta alle aziende.

Con i comandi Docker gli utenti hanno la pos­si­bi­li­tà di avviare i container di­ret­ta­men­te dal terminale. Il dialogo con il demone avviene at­tra­ver­so il comando docker e altri come build (crea), pull (scarica) o run (avvia). Il client e il server si possono trovare sullo stesso sistema. In al­ter­na­ti­va, è possibile anche eseguire un demone Docker su un altro sistema. In base a quale tipo di con­nes­sio­ne debba essere stabilita, la co­mu­ni­ca­zio­ne tra client e server avviene at­tra­ver­so l’API REST, at­tra­ver­so i socket UNIX o un’in­ter­fac­cia di rete.

Il grafico seguente mostra l’in­te­ra­zio­ne delle singole com­po­nen­ti Docker, prendendo ad esempio i comandi docker build, docker pull e docker run:

Immagine: Rappresentazione schematica dell’architettura di Docker
L’ar­chi­tet­tu­ra di Docker si basa sull’in­te­ra­zio­ne tra client (terminale

Il comando docker build dà istru­zio­ne al demone Docker di creare un’immagine (linea pun­teg­gia­ta). Per fare ciò deve essere presente un Doc­ker­fi­le cor­ri­spon­den­te. Se invece di essere creata, l’immagine dovesse essere caricata da un re­po­si­to­ry nel Docker Hub, allora si dovrebbe uti­liz­za­re il comando docker pull (linea trat­teg­gia­ta). Se il demone Docker viene istruito di avviare un container tramite docker run, per prima cosa il programma in back­ground verifica la presenza dell’immagine cor­ri­spon­den­te nel container. Se questo è il caso, il container viene eseguito (linea continua). Invece, nel caso in cui il demone non riesca a trovare l’immagine, questo avvia au­to­ma­ti­ca­men­te un “pulling” dal re­po­si­to­ry.

Server dedicati
Per­for­man­ce e in­no­va­zio­ne
  • Pro­ces­so­ri al­l'a­van­guar­dia di ultima ge­ne­ra­zio­ne
  • Hardware dedicato ad alte pre­sta­zio­ni
  • Data center cer­ti­fi­ca­ti ISO

Lavorare con Docker

A questo punto è arrivato il momento di iniziare a fa­mi­lia­riz­za­re con le pos­si­bi­li­tà di utilizzo della piat­ta­for­ma container. Se non hai ancora in­stal­la­to Docker Engine, puoi farlo tramite il terminale Linux. Trovi le istru­zio­ni al riguardo nel nostro articolo “Come in­stal­la­re Docker su Ubuntu 22.04”. Scopri qui come gestire Docker Engine at­tra­ver­so il terminale, quali pos­si­bi­li­tà ti offre Docker Hub e perché i container di Docker po­treb­be­ro ri­vo­lu­zio­na­re il lavoro con le ap­pli­ca­zio­ni.

Consiglio

Se desideri in­stal­la­re Docker su un’altra di­stri­bu­zio­ne Linux o su Windows, sono di­spo­ni­bi­li le seguenti istru­zio­ni:

Come gestire Docker Engine

A partire dalla versione 16.04 Ubuntu utilizza il programma in back­ground systemd(forma ab­bre­via­ta di “System daemon”) per la gestione dei processi. Il programmasystemdè un processo init adoperato anche per altre di­stri­bu­zio­ni Linux come RHEL, CentOS o Fedora. So­li­ta­men­tesystemdriceve l’ID di processo 1. Come primo processo del sistema, il demone è re­spon­sa­bi­le dell’av­via­men­to, della su­per­vi­sio­ne e della ter­mi­na­zio­ne di tutti gli altri processi. Nelle versioni pre­ce­den­ti di Ubuntu (14.10 e più datate) si occupa di questa funzione il programma in back­groundupstart.

Anche il demone Docker può essere gestito at­tra­ver­so systemd. Nell’in­stal­la­zio­ne standard la piat­ta­for­ma container è con­fi­gu­ra­ta in modo tale che il demone venga avviato au­to­ma­ti­ca­men­te al boot del sistema. Questa pre­im­po­sta­zio­ne può essere regolata in­di­vi­dual­men­te at­tra­ver­so lo strumento della riga di comando systemctl.

Con systemctl invii comandi a systemd al fine di am­mi­ni­stra­re un processo o per in­ter­ro­gar­ne lo stato. La sintassi di un comando di questo tipo cor­ri­spon­de al seguente schema:

systemctl [OPZIONE] [COMANDO]
bash

Alcuni comandi si basano su de­ter­mi­na­te risorse (come ad esempio Docker). Nella ter­mi­no­lo­gia systemd questi vengono descritti come Units (unità). In questo caso il comando deriva dalla di­spo­si­zio­ne e dal nome dell’unità, ai quali bisogna far ri­fe­ri­men­to.

Se desideri attivare (enable) o di­sat­ti­va­re (disable) l’avvio au­to­ma­ti­co del demone Docker, utilizza lo strumento della riga di comando systemctl come segue:

sudo systemctl enable docker
sudo systemctl disable docker
bash

Lo strumento della riga di comando systemctl ti permette inoltre di in­ter­ro­ga­re lo stato di un’unità:

sudo systemctl status docker
bash

Se Docker Engine è attivo sul tuo sistema Ubuntu, sul terminale dovrebbe comparire una co­mu­ni­ca­zio­ne cor­ri­spon­den­te al seguente screen­shot:

Immagine: L’interrogazione per mezzo di systemctl mostra che Docker Engine è attivo (running)
Messaggio positivo in risposta all’in­ter­ro­ga­zio­ne per mezzo di systemctl: Docker Engine è attivo (running).

Se invece Docker Engine è disattivo, sarà allora indicato come inactive (dead). In questo caso allora devi avviare il demone Docker ma­nual­men­te per eseguire i container.

Immagine: L’interrogazione per mezzo di systemctl mostra che Docker Engine è inattivo (dead)
Messaggio in risposta all’in­ter­ro­ga­zio­ne per mezzo di systemctl: Docker Engine è inattivo (dead).

Se desideri avviare, in­ter­rom­pe­re o riavviare ma­nual­men­te Docker Engine devi co­mu­ni­car­lo a systemd con uno dei seguenti comandi.

Per avviare il demone at­tual­men­te di­sat­ti­va­to utilizza systemctl in com­bi­na­zio­ne con il comando start:

sudo systemctl start docker
bash

Per terminare il demone di Docker va uti­liz­za­to allora il comando stop:

sudo systemctl stop docker
bash

Riavvii l’Engine con il comando restart:

sudo systemctl restart docker
bash

Come uti­liz­za­re Docker Hub

Se Docker Engine rap­pre­sen­ta il cuore della piat­ta­for­ma container, allora Docker Hub è cer­ta­men­te l’anima del progetto open source, essendo infatti il luogo virtuale di incontro per la sua community. Nel registry basato su cloud gli utenti trovano tutto ciò di cui hanno bisogno per terminare con successo l’in­stal­la­zio­ne di Docker.

Il servizio online offre diversi re­po­si­to­ry ufficiali con più di 100.000 app gratuite. Gli utenti hanno la pos­si­bi­li­tà di creare il proprio archivio di immagini e di uti­liz­zar­lo insieme ai propri gruppi di lavoro. Oltre al supporto pro­fes­sio­na­le da parte del team di sviluppo, qui le persone meno esperte si mettono in contatto con la comunità degli utenti. Un forum per il supporto da parte della community è di­spo­ni­bi­le su GitHub.

Immagine: Schermata di registrazione di Docker Hub
Crea gra­tui­ta­men­te il tuo ID Docker personale con una semplice re­gi­stra­zio­ne; fonte: hub.docker.com

Re­gi­stra­zio­ne a Docker Hub

La re­gi­stra­zio­ne a Docker Hub è com­ple­ta­men­te gratuita. Gli utenti ne­ces­si­ta­no uni­ca­men­te di un indirizzo e-mail e dell’ID Docker che hanno scelto in pre­ce­den­za. Questo funziona come namespace del re­po­si­to­ry personale e permette l’accesso a tutti i servizi Docker. Al momento l’offerta comprende accanto a Docker Hub anche Docker Cloud, Docker Store e altri programmi beta se­le­zio­na­ti. Inoltre, l’ID Docker permette anche di accedere al centro as­si­sten­za Docker così come al Docker Success Portal e a tutti i forum di Docker.

Il processo di re­gi­stra­zio­ne avviene in cinque passaggi:

  1. Scegliere un ID Docker: durante la re­gi­stra­zio­ne scegli un nome utente, che fungerà suc­ces­si­va­men­te da ID Docker personale.
  2. Indicare il proprio indirizzo e-mail: fornisci il tuo indirizzo e-mail attuale, poiché dovrai con­fer­ma­re la tua richiesta di re­gi­stra­zio­ne a Docker Hub.
  3. Scegliere la password: scegli una password segreta.
  4. Inviare la richiesta: clicca su “sign up” per inoltrare la tua richiesta di re­gi­stra­zio­ne. Se il for­mu­la­rio è stato cor­ret­ta­men­te e in­te­ra­men­te compilato, Docker ti invia un link per la verifica dell’indirizzo e-mail alla casella postale da te indicata.
  5. Con­fer­ma­re l’indirizzo e-mail: conferma il tuo indirizzo e-mail at­tra­ver­so un clic sul link di verifica.

Terminata la re­gi­stra­zio­ne con successo, avrai accesso immediato dal browser a tutti i servizi online del progetto Docker. Qui crei re­po­si­to­ry e gruppi di lavoro o cerchi le risorse pubbliche presenti su Docker Hub at­tra­ver­so la funzione “Explore”.

Immagine: Dashboard di Docker Hub
At­tra­ver­so la dashboard di Docker Hub gestisci i re­po­si­to­ry e i gruppi di lavoro; fonte: hub.docker.com

In al­ter­na­ti­va puoi re­gi­strar­ti at­tra­ver­so il terminale del tuo sistema operativo grazie a docker login. Trovi una de­scri­zio­ne det­ta­glia­ta del comando da eseguire nella do­cu­men­ta­zio­ne di Docker.

A livello teorico Docker Hub è di­spo­ni­bi­le anche senza account e ID Docker. In questo caso, tuttavia, sarà possibile caricare esclu­si­va­men­te immagini dai re­po­si­to­ry pubblici. Un upload (push) delle proprie immagini, invece, non è possibile senza ID Docker.

Creare re­po­si­to­ry su Docker Hub

L’account gratuito di Docker Hub contiene un re­po­si­to­ry privato e ti offre la pos­si­bi­li­tà di creare un numero il­li­mi­ta­to di re­po­si­to­ry pub­bli­ca­men­te ac­ces­si­bi­li. Se hai bisogno di ulteriori re­po­si­to­ry privati, puoi ottenerli ef­fet­tuan­do l’upgrade a pagamento.

Qui di seguito ri­por­tia­mo i passaggi necessari per la creazione di un re­po­si­to­ry:

  1. Scegliere il namespace: ai nuovi re­po­si­to­ry viene at­tri­bui­to in au­to­ma­ti­co il tuo ID Docker. In al­ter­na­ti­va, hai la pos­si­bi­li­tà di indicare l’ID di un’or­ga­niz­za­zio­ne di cui fai parte.
  2. Ri­no­mi­na­re il re­po­si­to­ry: dai un nome al re­po­si­to­ry appena creato.
  3. Ag­giun­ge­re una de­scri­zio­ne: aggiungi una de­scri­zio­ne per il re­po­si­to­ry.
  4. Impostare la vi­si­bi­li­tà: decidi se il tuo re­po­si­to­ry deve essere visibile pub­bli­ca­men­te (public) o se invece pre­fe­ri­sci che sia ac­ces­si­bi­le solamente a te o alla tua or­ga­niz­za­zio­ne (private).

Conferma tutti i campi cliccando su “Create”.

Immagine: La maschera di immissione della creazione di un repository su Docker Hub
I tuoi re­po­si­to­ry vengono creati au­to­ma­ti­ca­men­te all’interno del namespace del tuo ID Docker; fonte: hub.docker.com

Creare team e or­ga­niz­za­zio­ni

Con il suo hub, Docker offre anche una piat­ta­for­ma basata su cloud, tramite la quale è possibile gestire le immagini create per­so­nal­men­te e con­di­vi­der­le con i propri gruppi di lavoro. Tali gruppi vengono chiamati or­ga­niz­za­zio­ni nella ter­mi­no­lo­gia di Docker. Esat­ta­men­te come gli account utente le or­ga­niz­za­zio­ni ottengono ID in­di­vi­dua­li, at­tra­ver­so i quali possono scaricare e mettere a di­spo­si­zio­ne le immagini. I permessi e i ruoli all’interno di un’or­ga­niz­za­zio­ne possono essere assegnati at­tra­ver­so “Teams”. Così, ad esempio, solamente gli utenti con lo stato di “Owners” (pro­prie­ta­ri) possono creare nuovi re­po­si­to­ry, sia privati che pubblici, e assegnare in­ter­na­men­te i permessi di accesso.

Anche i gruppi di lavoro vengono creati e gestiti at­tra­ver­so la dashboard. Trovi ulteriori in­for­ma­zio­ni sul fun­zio­na­men­to delle or­ga­niz­za­zio­ni e dei team nella do­cu­men­ta­zio­ne di Docker.

Come lavorare con immagini e container

In quanto primo punto di ri­fe­ri­men­to per le risorse ufficiali di Docker, Docker Hub rap­pre­sen­ta il punto di partenza della nostra in­tro­du­zio­ne all’utilizzo delle immagini e dei container. A questo scopo il team di sviluppo mette a di­spo­si­zio­ne l’immagine demo whalesay, che uti­liz­zia­mo come base per il tutorial di Docker pre­sen­ta­to qui.

Scaricare le immagini Docker

Trovi l’immagine whalesay andando sulla pagina iniziale di Docker Hub e im­met­ten­do “whalesay” nella barra di ricerca a sinistra vicino al logo di Docker.

Immagine: La funzione di ricerca di Docker Hub
Esplora Docker Hub at­tra­ver­so la funzione di ricerca o il pulsante “Explore”; fonte: hub.docker.com

Tra i risultati di ricerca clicca su quello con il nome di docker/whalesay, così da ri­chia­ma­re il re­po­si­to­ry pubblico per questa immagine.

I re­po­si­to­ry di Docker sono sempre costruiti secondo lo stesso modello: nell’in­te­sta­zio­ne della pagina gli utenti trovano il nome dell’immagine, la categoria alla quale ap­par­tie­ne il re­po­si­to­ry e la data dell’ultimo ag­gior­na­men­to (last pushed).

Immagine: Visualizzazione di un repository di Docker
So­li­ta­men­te in un re­po­si­to­ry gli utenti trovano tutte le in­for­ma­zio­ni ne­ces­sa­rie per uti­liz­za­re l’immagine; fonte: hub.docker.com

Inoltre, ogni re­po­si­to­ry di Docker offre un box con le seguenti in­for­ma­zio­ni:

  • De­scrip­tion: de­scri­zio­ne ap­pro­fon­di­ta, so­li­ta­men­te con­te­nen­te anche le in­di­ca­zio­ni sul suo utilizzo
  • Docker Pull Command: istru­zio­ne per la riga di comando per scaricare l’immagine dal re­po­si­to­ry (pull)
  • Owner: in­for­ma­zio­ne relativa a chi ha creato il re­po­si­to­ry
  • Comments: sezione alla fine della pagina dedicata ai commenti

Dal box in­for­ma­ti­vo del re­po­si­to­ry è possibile desumere che whalesay non è altro che una modifica di cosway, script open source in lin­guag­gio Perl. Il programma svi­lup­pa­to da Tony Monroe nel 1999 genera nella sua forma originale un grafico ASCII sotto forma di mucca che appare nel terminale dell’utente ac­com­pa­gna­to da un messaggio,.

Per scaricare docker/whalesay utilizza il comando docker pull secondo il seguente schema:

docker pull [OPTIONS] NAME [:TAG|@DIGEST]
bash

Il comando docker pull indica al demone di caricare un’immagine dal re­po­si­to­ry, stabilita da te, in­di­can­do­ne il nome (NAME). Inoltre, puoi indicare a Docker come dovrebbe eseguire tale comando (OPTIONS). Ancora, hai l’opzione di scegliere in merito ai tag (:TAG) e i numeri di iden­ti­fi­ca­zio­ne univoci (@DIGEST), che per­met­to­no di scaricare una de­ter­mi­na­ta versione dell’immagine.

Ottieni una copia locale dell’immagine docker/whalesay grazie al seguente comando:

docker pull docker/whalesay
bash

So­li­ta­men­te questo passaggio può essere saltato. Se infatti desideri avviare un container, il demone di Docker si occupa di scaricare au­to­ma­ti­ca­men­te le immagini dal re­po­si­to­ry, che non trova sul sistema locale.

Avviare le immagini Docker come container

Per avviare un’immagine Docker utilizza il comando docker run secondo lo schema seguente:

docker run [OPTIONS] IMAGE [:TAG|@DIGEST] [CMD] [ARG...]
bash

L’unica com­po­nen­te ob­bli­ga­to­ria del comando docker run è la de­scri­zio­ne dell’immagine Docker de­si­de­ra­ta. Anche quando avvii container hai la pos­si­bi­li­tà di definire le opzioni fa­col­ta­ti­ve, i TAG e i DIGEST. Inoltre, il comando docker run può essere combinato con altri comandi che vengono eseguiti non appena il container viene avviato. In questo caso il CMD (COMMAND, un comando che viene eseguito au­to­ma­ti­ca­men­te all’avvio del container) definito dallo svi­lup­pa­to­re dell’immagine viene so­vra­scrit­to. Ulteriori opzioni di con­fi­gu­ra­zio­ne possono essere definite tramite argomenti ag­giun­ti­vi (ARG…). Questi, ad esempio, per­met­to­no di ag­giun­ge­re utenti o di tra­smet­te­re variabili am­bien­ta­li (En­vi­ron­ment-Variables).

Utilizza la riga di comando

docker run docker/whalesay cowsay boo
bash

per scaricare l’immagine come script Perl ed eseguirla in un container. Vedrai come whalesay si dif­fe­ren­zia dallo script originale in un punto es­sen­zia­le.

Immagine: Risposta sul terminale del container docker/whalesay: la balena dice “boo”
Eseguendo “docker/whalesay” con il comando standard, la balena di Docker si limita a un semplice “boo”

Eseguendo l’immagine docker/whalesay, lo script fornisce un grafico ASCII sotto forma di una balena e un messaggio di testo “boo”, esat­ta­men­te come accade con il comando cowsay.

Come nella fase di test, ini­zial­men­te il demone cerca l’immagine de­si­de­ra­ta nella directory dei file in locale. Dato che in questo caso non si trova alcun pacchetto omonimo, viene avviato un pulling dal re­po­si­to­ry di Docker. Suc­ces­si­va­men­te il demone fa partire il programma cowsay mo­di­fi­ca­to. A con­clu­sio­ne di questo processo, il container termina au­to­ma­ti­ca­men­te.

Esat­ta­men­te come cowsay, anche whalesay di Docker offre la pos­si­bi­li­tà di in­ter­ve­ni­re durante l’ese­cu­zio­ne del programma per in­fluen­za­re l’output del testo nel terminale. Metti alla prova questa funzione so­sti­tuen­do il “boo” del comando standard con una suc­ces­sio­ne di caratteri a scelta, ad esempio con quella che potrebbe cor­ri­spon­de­re a una battuta pro­nun­cia­ta dalla balena.

sudo docker run docker/whalesay cowsay What did the shark say to the whale? What are you blubbering about?
bash
Immagine: Output del container docker/whalesay: una balena con messaggio di testo personalizzato
Fai dire alla tua balena Docker le esatte parole che vorresti sentire da lei

Mostrare tutte le immagini Docker sul sistema locale

Se non hai la certezza di aver scaricato una de­ter­mi­na­ta immagine, puoi ottenere una pa­no­ra­mi­ca di tutte le immagini sul tuo sistema locale. Per farlo utilizza la seguente riga di comando:

sudo docker images
bash

Il comando docker images (al­ter­na­ti­va: docker image ls) ti fornisce tutte le immagini locali com­pren­si­ve delle di­men­sio­ni dei file, dell’ID e del tag.

Immagine: Panoramica di tutte le immagini sul sistema locale
La pa­no­ra­mi­ca mostra le immagini “hello-world” e “docker/whalesay”.

Avviando un container l’immagine che ne sta alla base viene scaricata come copia dal re­po­si­to­ry e salvata per­ma­nen­te­men­te sul tuo computer. In questo modo ri­spar­mie­rai tempo nel caso in cui in futuro ti ri­tro­ve­rai a dover riu­ti­liz­za­re quella stessa immagine. Un nuovo download viene avviato soltanto se la fonte dell’immagine è cambiata, ad esempio se nel re­po­si­to­ry è di­spo­ni­bi­le una versione ag­gior­na­ta.

Mostrare tutti i container sul sistema locale

Se desideri ottenere una pa­no­ra­mi­ca di tutti i container at­tual­men­te in ese­cu­zio­ne sul tuo sistema o che lo sono stati in passato, utilizza l’istru­zio­ne della riga di comando docker ps in com­bi­na­zio­ne con l’opzione --all (in breve: -a):

sudo docker ps -a
bash
Immagine: Panoramica di tutti i container sul sistema locale
La pa­no­ra­mi­ca mostra tutti i container che sono stati eseguiti su Docker Engine

Il terminale riporta in­for­ma­zio­ni come l’ID del container, l’immaginesu cui si basa, il comando dato all’avvio del container, la data in cui è stato avviato il container e lo stato attuale.

Se desideri che ti siano mostrati solamente i container at­tual­men­te in ese­cu­zio­ne sul tuo sistema, utilizza docker ps senza ulteriori opzioni:

sudo docker ps
bash

At­tual­men­te non dovrebbe esserci alcun container in ese­cu­zio­ne sul tuo sistema.

Creare delle immagini Docker

Fin qui hai imparato come trovare le immagini su Docker Hub, come sca­ri­car­le e come eseguirle sul sistema che pre­fe­ri­sci, sul quale è stato pre­ce­den­te­men­te in­stal­la­to Docker Engine. Con Docker non disponi però solo dell’ampia offerta di app del registry, ma la piat­ta­for­ma ti offre anche molte pos­si­bi­li­tà di creare delle immagini e di con­di­vi­der­le con altri svi­lup­pa­to­ri.

Già nei capitoli in­tro­dut­ti­vi di questo tutorial ti abbiamo il­lu­stra­to che ogni immagine Docker si basa su un Doc­ker­fi­le. I Doc­ker­fi­le possono pre­sen­tar­si come una sorta di istru­zio­ni per il montaggio delle immagini. Si tratta di semplici file di testo con­te­nen­ti tutte le in­di­ca­zio­ni delle quali Docker ha bisogno per creare un’immagine. Nei prossimi passaggi scoprirai come scrivere un Doc­ker­fi­le e come istruire Docker a uti­liz­zar­lo come base per la tua immagine.

  1. Creare una nuova directory: il team di sviluppo di Docker consiglia di creare una nuova directory per ogni Doc­ker­fi­le. Con Linux puoi creare nuove directory fa­cil­men­te at­tra­ver­so il terminale. Utilizza i seguenti comandi per creare una directory con il nome my­doc­ker­build:
mkdir mydockerbuild
bash
Immagine: Terminale di Ubuntu: il comando mkdir
Utilizza il comando “mkdir” per creare nuove directory.
  1. Navigare nella nuova directory: utilizza il comando cd per navigare nella nuova directory.
cd mydockerbuild
bash
Immagine: Terminale di Ubuntu: il comando cd
Con l’aiuto del comando “cd” passi a un’altra directory.
  1. Creare un nuovo file di testo: il terminale ti serve anche per creare co­mo­da­men­te file di testo. A questo scopo utilizza un editor come Nano o Vim. Crea un file di testo con il nome di Doc­ker­fi­le nella directory my­doc­ker­build.
nano Dockerfile
bash
Immagine: Terminale di Ubuntu: creare file di testo con Nano
L’editor di testo Nano è pre­in­stal­la­to su tutte le versioni di Ubuntu.
  1. Scrivere un Doc­ker­fi­le: i file di testo creati servono come modello per le immagini che hai creato. Invece di pro­gram­ma­re l’immagine da zero, in questo tutorial uti­liz­zia­mo l’immagine demo docker/whalesay come modello di partenza. Questa può essere collegata al tuo Doc­ker­fi­le per mezzo del comando FROM. Utilizza il tag :latest per uti­liz­za­re l’ultima versione dell’immagine.
FROM docker/whalesay:latest

Fino a questo momento docker/whalesay opera in maniera tale che sei tu a scegliere le parole che dovrà dire la balena. Nel terminale compare, infatti, il testo che hai pre­ce­den­te­men­te immesso in com­bi­na­zio­ne con il comando per avviare il container. Sarebbe di certo ancora più in­te­res­san­te se lo script fosse in grado di generare dei testi sempre nuovi in maniera del tutto au­to­ma­ti­ca. Questo può essere rea­liz­za­to con l’aiuto del programma fortunes, di­spo­ni­bi­le su ogni sistema Linux. La funzione di base di Fortunes consiste nel generare aforismi per i biglietti della fortuna e frasi di­ver­ten­ti. Utilizza il seguente comando per ag­gior­na­re il tuo pacchetto index e per in­stal­la­re fortunes:

RUN apt-get -y update && apt-get install -y fortunes

Suc­ces­si­va­men­te definisci il CMD Statement. Questo viene eseguito dopo il comando RUN, purché non sia stato pre­ce­den­te­men­te so­vra­scrit­to (docker run image CMD). Utilizza il seguente comando per eseguire il programma fortunes con l’opzione -a (“Scegli tra tutti i database”) e vi­sua­liz­za­re l’output tramite il programma cowsay nel terminale:

CMD /usr/games/fortune -a | cowsay

Il tuo Doc­ker­fi­le dovrebbe apparire come segue:

FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay

Fai at­ten­zio­ne: i comandi all’interno di un Doc­ker­fi­le non sono più lunghi di una riga e iniziano sempre con una parola chiave. La sintassi che vi sta alla base è “case-in­sen­si­ti­ve”, il che significa che non fa dif­fe­ren­za se scrivi in maiuscolo o minuscolo. Tuttavia, con il tempo è diventata la prassi scrivere le parole chiave con le lettere maiuscole.

Immagine: Nano, l’editor di testo, nel terminale di Ubuntu
Utilizza le com­bi­na­zio­ni di tasti nel piè di pagina per con­trol­la­re l’editor di testo Nano.
  1. Salvare i file di testo: salva sempre le modifiche apportate. Nel caso in cui dovessi uti­liz­za­re l’editor Nano, utilizza la com­bi­na­zio­ne di tasti [CTRL] + [O] e conferma premendo [Invio]. Nano ti informerà che sono state tra­scrit­te tre righe nel file se­le­zio­na­to. Chiudi l’editor con la com­bi­na­zio­ne di tasti [CTRL] + [X].
  2. Creare un’immagine da un Doc­ker­fi­le: per creare un’immagine da un Doc­ker­fi­le, naviga per prima cosa nella directory in cui hai creato il file di testo. Il primo passo nella creazione di un’immagine è il comando docker build. Se desideri ri­no­mi­na­re per­so­nal­men­te l’immagine o dotarla di un tag utilizza l’opzione -t e suc­ces­si­va­men­te la com­bi­na­zio­ne di caratteri de­si­de­ra­ta e il tag. Il formato standard è name:tag.

Nell’esempio qui riportato deve essere creata un’immagine con il nome docker-whale:

docker build -t docker-whale .
bash

Il punto suc­ces­si­vo mostra che il Doc­ker­fi­le che sta alla base si trova nella directory se­le­zio­na­ta. Al­ter­na­ti­va­men­te hai la pos­si­bi­li­tà di indicare un percorso file o un URL che conduca ai file di origine.

Il processo build inizia non appena hai con­fer­ma­to il comando premendo il tasto [Invio]. Per prima cosa il demone Docker verifica se tutti i dati necessari per la creazione dell’immagine siano presenti o meno. Nella ter­mi­no­lo­gia di Docker questi dati prendono il nome di “Context”.

In seguito viene lo­ca­liz­za­ta l’immagine docker/whalesay grazie al tag :latest:

Se l’intero Context ne­ces­sa­rio per la creazione dell’immagine è presente, il demone Docker avvia i modelli di immagine legati tramite FROM all’interno di un container tem­po­ra­neo e passa poi al comando suc­ces­si­vo contenuto nel Doc­ker­fi­le. Nel nostro esempio si tratta di un comando RUN, fi­na­liz­za­to all’in­stal­la­zio­ne del programma fortunes.

Al termine di ogni passaggio per la creazione di un’immagine, Docker ti fornisce un ID per il livello cor­ri­spon­den­te (layer), creato durante il passaggio in questione. Dunque, all’interno del Doc­ker­fi­le ogni riga cor­ri­spon­de a un livello dell’immagine creata su di esso.

Terminato il comando RUN, il demone Docker arresta il container ap­po­si­ta­men­te creato, lo elimina e avvia un nuovo container tem­po­ra­neo per il livello del CMS Statement. Al termine del processo di creazione, anche questo container tem­po­ra­nea­men­te avviato viene in­ter­rot­to e can­cel­la­to. A questo punto Docker ti fornisce l’ID di una nuova immagine:

Successfully built a8f2048c9ab8
Immagine: Il terminale di Ubuntu: messaggio di stato durante la creazione di un’immagine
Le immagini Docker vengono create su più livelli (layers

Trovi la tua immagine appena creata nella pa­no­ra­mi­ca delle immagini ar­chi­via­te in locale, con il nome di docker-whale.

sudo docker images
bash
Immagine: Terminale di Ubuntu: panoramica di tutte le immagini
L’immagine appena creata nella pa­no­ra­mi­ca delle immagini.

Per avviare un container dall’immagine che hai appena creato, utilizza il comando sudo docker run in com­bi­na­zio­ne con il nome dell’immagine:

sudo docker run docker-whale
bash

Se l’immagine è stata creata senza errori dal Doc­ker­fi­le, la tua balena dovrebbe essere tutta bella pimpante e pro­nun­cia­re massime più o meno sagge. Fai at­ten­zio­ne al fatto che ogni volta che riavvii il container, viene generato un nuovo aforisma.

Immagine: La risposta di un container basato su docker-whale nel terminale di Ubuntu
Grazie a “fortunes” la balena ASCII fornisce solo buoni aforismi.

Assegnare tag alle immagini Docker e caricarle su Docker Hub

Se desideri caricare l’immagine creata docker-whale sull’hub così da metterla a di­spo­si­zio­ne per tutta la community o per un de­ter­mi­na­to gruppo di lavoro, devi in­nan­zi­tut­to col­le­gar­la a un re­po­si­to­ry con lo stesso nome, all’interno del tuo namespace personale. Questo passaggio prende il nome di tagging nella ter­mi­no­lo­gia di Docker.

Qui di seguito ti guidiamo durante la pub­bli­ca­zio­ne di un’immagine su Docker Hub:

  1. Creare il re­po­si­to­ry: accedi a Docker Hub con il tuo ID Docker e la password personale e crea un re­po­si­to­ry pubblico con il nome di docker-whale.
Immagine: La maschera di Docker Hub per la creazione di un repository
Crea un re­po­si­to­ry per la tua immagine; fonte: hub.docker.com
  1. In­di­vi­dua­re l’ID dell’immagine: individua l’ID dell’immagine docker whale che hai creato con il comando docker images.
Immagine: Panoramica nel terminale di Ubuntu di tutte le immagini locali
Il comando “docker images” elenca tutte le immagini salvate nel tuo sistema.

Nel nostro caso l’ID dell’immagine è a8f2048c9ab8, ne­ces­sa­rio per il tagging nel prossimo passaggio.

  1. Assegnare tag all’immagine: assegna i tag all’immagine docker-whale grazie all’aiuto del comando docker tag secondo lo schema pre­sen­ta­to qui di seguito:
sudo docker tag [Image-ID][Docker-ID]/[Image-Name]:[TAG]
bash

Secondo l’esempio riportato, il comando per il tagging figura in questo modo:

sudo docker tag 4419af61d32d myfreedockerid/docker-whale:latest
bash

Per ve­ri­fi­ca­re se i tag alla tua immagine sono stati assegnati cor­ret­ta­men­te, controlla tramite docker images. Il nome del re­po­si­to­ry dovrebbe contenere dunque il tuo ID Docker.

Immagine: La panoramica delle immagini prima e dopo il tagging sul terminale di Ubuntu
Con il comando “docker tag” colleghi le immagini al tuo ID Docker.
  1. Caricare un’immagine: per caricare un’immagine devi in­nan­zi­tut­to re­gi­strar­ti su Docker Hub uti­liz­zan­do il comando docker login.
sudo docker login
bash

A questo punto il terminale ti chiede di inserire il nome utente, cor­ri­spon­den­te all’ID Docker, e la ri­spet­ti­va password.

Immagine: Registrazione su Docker Hub tramite il terminale di Ubuntu
Prima di poter caricare un’immagine su Docker Hub, devi re­gi­strar­ti.

Se la re­gi­stra­zio­ne è avvenuta con successo, utilizza il comando docker push per caricare l’immagine nel re­po­si­to­ry appena creato.

sudo docker push [Namespace]/docker-whale
bash

Il processo di ca­ri­ca­men­to non dovrebbe durare più di qualche secondo. Lo stato attuale ti viene co­mu­ni­ca­to tramite il terminale.

Immagine: Comunicazione di stato sul terminale di Ubuntu dopo l’upload dell’immagine
Terminato il ca­ri­ca­men­to, l’immagine è di­spo­ni­bi­le sotto il tag “latest” su Docker Hub.

Re­gi­stra­ti su Docker Hub tramite il browser così da vedere l’immagine caricata.

Immagine: Docker Hub: vista dettagliata del repository [namespace]/docker-whale
L’ultimo ag­gior­na­men­to del re­po­si­to­ry ti viene mostrato det­ta­glia­ta­men­te; fonte: hub-docker.com

Se desideri caricare più di un’immagine per re­po­si­to­ry, utilizza diversi tag, così da offrire le tue immagini in diverse versioni. Ad esempio:

[Namespace]/docker-whale:latest
[Namespace]/docker-whale:version1
[Namespace]/docker-whale:version2

Per vi­sua­liz­za­re un riepilogo delle varie versioni di un’immagine, fai clic sulla scheda “Tags” sul re­po­si­to­ry di Docker Hub.

Immagine: Docker Hub: screenshot della scheda “Tags”
Nella scheda “Tags” trovi tutte le versioni di un’immagine; fonte: hub.docker.com

Le immagini di progetti diversi do­vreb­be­ro invece essere offerte in re­po­si­to­ry separati.

Se l’upload è avvenuto con successo, l’immagine che hai creato è di­spo­ni­bi­le in tutto il mondo per ogni utente Docker at­tra­ver­so il re­po­si­to­ry pubblico.

  1. Fase di test: verifica se l’upload è andato a buon fine provando a scaricare l’immagine caricata.

Fai at­ten­zio­ne che va però prima can­cel­la­ta la versione locale dell’immagine per poterne scaricare una copia con lo stesso tag. Al­tri­men­ti Docker ti comunica che l’immagine de­si­de­ra­ta è già presente nella versione ag­gior­na­ta.

Immagine: Messaggio di stato “Image is up to date” (“La copia locale è aggiornata”)
Se un’immagine è presente in locale, il comando pull viene in­ter­rot­to.

Per can­cel­la­re le immagini Docker locali utilizza il comando docker rmi in com­bi­na­zio­ne con il cor­ri­spet­ti­vo ID dell’immagine. Così facendo indichi tale immagine come già posseduta at­tra­ver­so docker images. Nel caso in cui Docker ti informi di conflitti in corso, ad esempio perché un ID dell’immagine viene uti­liz­za­to su diversi re­po­si­to­ry o da un container, puoi raf­for­za­re il tuo comando con l’opzione --force (in breve: -f) e forzare così il processo.

sudo docker rmi -f a8f2048c9ab8
bash
Immagine: Comando docker rmi in combinazione con l’opzione -f (force)
Utilizza il comando “docker rmi” in com­bi­na­zio­ne con l’opzione “-f” per forzare un processo di can­cel­la­zio­ne.

Richiedi che ti venga mostrata di nuovo una pa­no­ra­mi­ca di tutte le immagini locali:

sudo docker Images
bash

Gli elementi can­cel­la­ti non do­vreb­be­ro più comparire nella lista del terminale. Utilizza il comando pull presente nel re­po­si­to­ry per scaricare una nuova copia dell’immagine da Docker Hub:

sudo docker pull [Namespace]/docker-whale
bash
Immagine: Terminale di Ubuntu: download da Docker Hub
L’immagine pre­ce­den­te­men­te pub­bli­ca­ta è stata scaricata con successo.

Altri argomenti e tutorial legati a Docker

L’universo Docker è ampio. Con il tempo si è svi­lup­pa­to di­ven­tan­do un eco­si­ste­ma co­sti­tui­to da diversi strumenti Docker. Questa piat­ta­for­ma container risulta par­ti­co­lar­men­te in­te­res­san­te per gli am­mi­ni­stra­to­ri e le am­mi­ni­stra­tri­ci nel caso in cui debbano gestire ap­pli­ca­zio­ni complesse in parallelo su più container su diversi sistemi. In tal caso Docker offre diverse funzioni per l’or­che­stra­zio­ne di un cluster di questo tipo. Trovi maggiori in­for­ma­zio­ni al riguardo nell’articolo dedicato all’or­che­stra­zio­ne di Docker con Swarm e Compose.

Nella Digital Guide trovi altri tutorial per lavorare con Docker:

Inoltre, Docker è adatto a vari scenari ap­pli­ca­ti­vi. Nella Digital Guide ci sono i seguenti articoli:

Docker non è sempre la scelta migliore per ogni ap­pli­ca­zio­ne. Pertanto, ti in­di­chia­mo le al­ter­na­ti­ve a Docker più im­por­tan­ti. Inoltre, abbiamo con­fron­ta­to in dettaglio alcune al­ter­na­ti­ve con Docker:

Vai al menu prin­ci­pa­le