Tutorial su Docker: introduzione alla nota piattaforma basata su container

Nel nostro tutorial su Docker, ti spieghiamo la piattaforma di virtualizzazione Docker e ti mostriamo con istruzioni facili da seguire come utilizzarla sul tuo sistema Ubuntu 22.04.

Prova gratuita per VPS di IONOS

Prova subito un VPS gratis - Prova il tuo server virtuale per 30 giorni!

Risorse dedicate
Traffico illimitato
Consulente personale

Docker: struttura e funzioni

“Build, Ship and Run Any App, Anywhere”, è questo il motto con il quale la piattaforma open source basata su container promuove un’alternativa flessibile e che non richiede molte risorse per l’emulazione di componenti hardware, basata sulle macchine virtuali (VM, abbreviazione dall’inglese “Virtual Machine”).

Mentre la virtualizzazione hardware classica si basa sull’avvio di diversi sistemi guest su un sistema host comune, con Docker le applicazioni vengono eseguite grazie ai container come processi isolati su di uno stesso sistema. Nel caso di una virtualizzazione server basata su container si parla quindi di una virtualizzazione a livello del sistema operativo.

Macchine virtuali e container Docker a confronto
Mentre ogni macchina virtuale avvia un sistema operativo dedicato, i container di Docker condividono il kernel del sistema host.

Il grande vantaggio della virtualizzazione basata su container sta nel fatto che applicazioni con diversi requisiti possono essere eseguite isolatamente le une dalle altre, senza che sia necessario che venga messo a disposizione l’overhead di un sistema guest separato. Inoltre, le applicazioni possono essere distribuite con i container tra le varie piattaforme e in diverse infrastrutture senza dover essere adattate alle configurazioni hardware o software del sistema host.

Docker è il più popolare progetto software tra quelli che mettono a disposizione degli utenti una tecnologia di virtualizzazione basata su container. La piattaforma open source si basa su tre componenti fondamentali: 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 autonomamente.

Consiglio

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

Immagini Docker

Similarmente alle macchine virtuali, i container si basano sulle immagini Docker. Un’immagine è un modello non modificabile che contiene tutte le informazioni necessarie 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 Dockerfile. Se un container deve essere lanciato su un sistema, per prima cosa viene caricato un pacchetto con l’immagine corrispettiva, sempre che questa non sia già presente in locale. L’immagine caricata mette a disposizione il sistema di file necessario per il runtime, compresi tutti i parametri. Un container può essere considerato come processo in esecuzione di un’immagine.

Docker Hub

Docker Hub è un registry per i repository 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 possibilità di caricare immagini sviluppate autonomamente e di condividerle con la community. Qui sono a disposizione 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 accessibili pubblicamente, ma possono essere condivise ad esempio con i dipendenti della propria azienda o nei propri circoli di amici o conoscenti. Docker Hub è raggiungibile all’indirizzo hub.docker.com.

Docker Engine

La parte centrale del progetto Docker è Docker Engine. Si tratta di un’applicazione open source client-server, a disposizione di tutti gli utenti nella versione attuale su tutte le piattaforme più conosciute.

L’architettura di base di Docker Engine si può suddividere in tre componenti: un demone con funzioni di server, un’interfaccia di programmazione (API) basata sul paradigma REST (Representational State Transfer) e il terminale del sistema operativo (Command-Line Interface, CLI) come interfaccia utente (client).

  • Il demone Docker: su Docker Engine viene utilizzato un processo demone come server. Il demone viene eseguito in background 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 interfacce che permettono ad altri programmi di comunicare 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 interagisce con il demone Docker attraverso l’API REST e permette agli utenti di gestirla tramite gli script o i dati forniti dagli utenti.
Consiglio

Nel 2017, Docker Engine è stato rinominato in Docker Community Edition (abbreviato in Docker CE), ma la documentazione ufficiale e i repository Docker per lo più utilizzano ancora il vecchio nome. Oltre a Docker CE, esiste anche la Docker Enterprise Edition (Docker EE), che dispone di alcune funzionalità premium. Tuttavia, è a pagamento ed è più adatta alle aziende.

Con i comandi Docker gli utenti hanno la possibilità di avviare i container direttamente dal terminale. Il dialogo con il demone avviene attraverso 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 alternativa, è possibile anche eseguire un demone Docker su un altro sistema. In base a quale tipo di connessione debba essere stabilita, la comunicazione tra client e server avviene attraverso l’API REST, attraverso i socket UNIX o un’interfaccia di rete.

Il grafico seguente mostra l’interazione delle singole componenti Docker, prendendo ad esempio i comandi docker build, docker pull e docker run:

Rappresentazione schematica dell’architettura di Docker, server (demone Docker) e registry (Docker Hub).“)

Il comando docker build dà istruzione al demone Docker di creare un’immagine (linea punteggiata). Per fare ciò deve essere presente un Dockerfile corrispondente. Se invece di essere creata, l’immagine dovesse essere caricata da un repository nel Docker Hub, allora si dovrebbe utilizzare il comando docker pull (linea tratteggiata). Se il demone Docker viene istruito di avviare un container tramite docker run, per prima cosa il programma in background verifica la presenza dell’immagine corrispondente 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 automaticamente un “pulling” dal repository.

Server dedicati di IONOS

L’hardware incontra il cloud: server dedicato con cloud integrato e fatturazione al minuto. Consulente personale incluso!

Supporto 24/7
Traffico illimitato
Certificato SSL

Lavorare con Docker

A questo punto è arrivato il momento di iniziare a familiarizzare con le possibilità di utilizzo della piattaforma container. Se non hai ancora installato Docker Engine, puoi farlo tramite il terminale Linux. Trovi le istruzioni al riguardo nel nostro articolo “Come installare Docker su Ubuntu 22.04”. Scopri qui come gestire Docker Engine attraverso il terminale, quali possibilità ti offre Docker Hub e perché i container di Docker potrebbero rivoluzionare il lavoro con le applicazioni.

Consiglio

Se desideri installare Docker su un’altra distribuzione Linux o su Windows, sono disponibili le seguenti istruzioni:

Come gestire Docker Engine

A partire dalla versione 16.04 Ubuntu utilizza il programma in background systemd(forma abbreviata di “System daemon”) per la gestione dei processi. Il programmasystemdè un processo init adoperato anche per altre distribuzioni Linux come RHEL, CentOS o Fedora. Solitamentesystemdriceve l’ID di processo 1. Come primo processo del sistema, il demone è responsabile dell’avviamento, della supervisione e della terminazione di tutti gli altri processi. Nelle versioni precedenti di Ubuntu (14.10 e più datate) si occupa di questa funzione il programma in backgroundupstart.

Anche il demone Docker può essere gestito attraverso systemd. Nell’installazione standard la piattaforma container è configurata in modo tale che il demone venga avviato automaticamente al boot del sistema. Questa preimpostazione può essere regolata individualmente attraverso lo strumento della riga di comando systemctl.

Con systemctl invii comandi a systemd al fine di amministrare un processo o per interrogarne lo stato. La sintassi di un comando di questo tipo corrisponde al seguente schema:

systemctl [OPZIONE] [COMANDO]
bash

Alcuni comandi si basano su determinate risorse (come ad esempio Docker). Nella terminologia systemd questi vengono descritti come Units (unità). In questo caso il comando deriva dalla disposizione e dal nome dell’unità, ai quali bisogna far riferimento.

Se desideri attivare (enable) o disattivare (disable) l’avvio automatico 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 interrogare lo stato di un’unità:

sudo systemctl status docker
bash

Se Docker Engine è attivo sul tuo sistema Ubuntu, sul terminale dovrebbe comparire una comunicazione corrispondente al seguente screenshot:

L’interrogazione per mezzo di systemctl mostra che Docker Engine è attivo (running)
Messaggio positivo in risposta all’interrogazione 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 manualmente per eseguire i container.

L’interrogazione per mezzo di systemctl mostra che Docker Engine è inattivo (dead)
Messaggio in risposta all’interrogazione per mezzo di systemctl: Docker Engine è inattivo (dead).

Se desideri avviare, interrompere o riavviare manualmente Docker Engine devi comunicarlo a systemd con uno dei seguenti comandi.

Per avviare il demone attualmente disattivato utilizza systemctl in combinazione con il comando start:

sudo systemctl start docker
bash

Per terminare il demone di Docker va utilizzato allora il comando stop:

sudo systemctl stop docker
bash

Riavvii l’Engine con il comando restart:

sudo systemctl restart docker
bash

Come utilizzare Docker Hub

Se Docker Engine rappresenta il cuore della piattaforma container, allora Docker Hub è certamente 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’installazione di Docker.

Il servizio online offre diversi repository ufficiali con più di 100.000 app gratuite. Gli utenti hanno la possibilità di creare il proprio archivio di immagini e di utilizzarlo insieme ai propri gruppi di lavoro. Oltre al supporto professionale 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 è disponibile su GitHub.

Schermata di registrazione di Docker Hub
Crea gratuitamente il tuo ID Docker personale con una semplice registrazione; fonte: hub.docker.com

Registrazione a Docker Hub

La registrazione a Docker Hub è completamente gratuita. Gli utenti necessitano unicamente di un indirizzo e-mail e dell’ID Docker che hanno scelto in precedenza. Questo funziona come namespace del repository 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 selezionati. Inoltre, l’ID Docker permette anche di accedere al centro assistenza Docker così come al Docker Success Portal e a tutti i forum di Docker.

Il processo di registrazione avviene in cinque passaggi:

  1. Scegliere un ID Docker: durante la registrazione scegli un nome utente, che fungerà successivamente da ID Docker personale.
  2. Indicare il proprio indirizzo e-mail: fornisci il tuo indirizzo e-mail attuale, poiché dovrai confermare la tua richiesta di registrazione 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 registrazione. Se il formulario è stato correttamente e interamente compilato, Docker ti invia un link per la verifica dell’indirizzo e-mail alla casella postale da te indicata.
  5. Confermare l’indirizzo e-mail: conferma il tuo indirizzo e-mail attraverso un clic sul link di verifica.

Terminata la registrazione con successo, avrai accesso immediato dal browser a tutti i servizi online del progetto Docker. Qui crei repository e gruppi di lavoro o cerchi le risorse pubbliche presenti su Docker Hub attraverso la funzione “Explore”.

Dashboard di Docker Hub
Attraverso la dashboard di Docker Hub gestisci i repository e i gruppi di lavoro; fonte: hub.docker.com

In alternativa puoi registrarti attraverso il terminale del tuo sistema operativo grazie a docker login. Trovi una descrizione dettagliata del comando da eseguire nella documentazione di Docker.

A livello teorico Docker Hub è disponibile anche senza account e ID Docker. In questo caso, tuttavia, sarà possibile caricare esclusivamente immagini dai repository pubblici. Un upload (push) delle proprie immagini, invece, non è possibile senza ID Docker.

Creare repository su Docker Hub

L’account gratuito di Docker Hub contiene un repository privato e ti offre la possibilità di creare un numero illimitato di repository pubblicamente accessibili. Se hai bisogno di ulteriori repository privati, puoi ottenerli effettuando l’upgrade a pagamento.

Qui di seguito riportiamo i passaggi necessari per la creazione di un repository:

  1. Scegliere il namespace: ai nuovi repository viene attribuito in automatico il tuo ID Docker. In alternativa, hai la possibilità di indicare l’ID di un’organizzazione di cui fai parte.
  2. Rinominare il repository: dai un nome al repository appena creato.
  3. Aggiungere una descrizione: aggiungi una descrizione per il repository.
  4. Impostare la visibilità: decidi se il tuo repository deve essere visibile pubblicamente (public) o se invece preferisci che sia accessibile solamente a te o alla tua organizzazione (private).

Conferma tutti i campi cliccando su “Create”.

La maschera di immissione della creazione di un repository su Docker Hub
I tuoi repository vengono creati automaticamente all’interno del namespace del tuo ID Docker; fonte: hub.docker.com

Creare team e organizzazioni

Con il suo hub, Docker offre anche una piattaforma basata su cloud, tramite la quale è possibile gestire le immagini create personalmente e condividerle con i propri gruppi di lavoro. Tali gruppi vengono chiamati organizzazioni nella terminologia di Docker. Esattamente come gli account utente le organizzazioni ottengono ID individuali, attraverso i quali possono scaricare e mettere a disposizione le immagini. I permessi e i ruoli all’interno di un’organizzazione possono essere assegnati attraverso “Teams”. Così, ad esempio, solamente gli utenti con lo stato di “Owners” (proprietari) possono creare nuovi repository, sia privati che pubblici, e assegnare internamente i permessi di accesso.

Anche i gruppi di lavoro vengono creati e gestiti attraverso la dashboard. Trovi ulteriori informazioni sul funzionamento delle organizzazioni e dei team nella documentazione di Docker.

Come lavorare con immagini e container

In quanto primo punto di riferimento per le risorse ufficiali di Docker, Docker Hub rappresenta il punto di partenza della nostra introduzione all’utilizzo delle immagini e dei container. A questo scopo il team di sviluppo mette a disposizione l’immagine demo whalesay, che utilizziamo come base per il tutorial di Docker presentato qui.

Scaricare le immagini Docker

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

La funzione di ricerca di Docker Hub
Esplora Docker Hub attraverso 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 richiamare il repository pubblico per questa immagine.

I repository di Docker sono sempre costruiti secondo lo stesso modello: nell’intestazione della pagina gli utenti trovano il nome dell’immagine, la categoria alla quale appartiene il repository e la data dell’ultimo aggiornamento (last pushed).

Visualizzazione di un repository di Docker
Solitamente in un repository gli utenti trovano tutte le informazioni necessarie per utilizzare l’immagine; fonte: hub.docker.com

Inoltre, ogni repository di Docker offre un box con le seguenti informazioni:

  • Description: descrizione approfondita, solitamente contenente anche le indicazioni sul suo utilizzo
  • Docker Pull Command: istruzione per la riga di comando per scaricare l’immagine dal repository (pull)
  • Owner: informazione relativa a chi ha creato il repository
  • Comments: sezione alla fine della pagina dedicata ai commenti

Dal box informativo del repository è possibile desumere che whalesay non è altro che una modifica di cosway, script open source in linguaggio Perl. Il programma sviluppato da Tony Monroe nel 1999 genera nella sua forma originale un grafico ASCII sotto forma di mucca che appare nel terminale dell’utente accompagnato 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 repository, stabilita da te, indicandone 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 identificazione univoci (@DIGEST), che permettono di scaricare una determinata versione dell’immagine.

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

docker pull docker/whalesay
bash

Solitamente questo passaggio può essere saltato. Se infatti desideri avviare un container, il demone di Docker si occupa di scaricare automaticamente le immagini dal repository, 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 componente obbligatoria del comando docker run è la descrizione dell’immagine Docker desiderata. Anche quando avvii container hai la possibilità di definire le opzioni facoltative, 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 automaticamente all’avvio del container) definito dallo sviluppatore dell’immagine viene sovrascritto. Ulteriori opzioni di configurazione possono essere definite tramite argomenti aggiuntivi (ARG…). Questi, ad esempio, permettono di aggiungere utenti o di trasmettere variabili ambientali (Environment-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 differenzia dallo script originale in un punto essenziale.

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”, esattamente come accade con il comando cowsay.

Come nella fase di test, inizialmente il demone cerca l’immagine desiderata nella directory dei file in locale. Dato che in questo caso non si trova alcun pacchetto omonimo, viene avviato un pulling dal repository di Docker. Successivamente il demone fa partire il programma cowsay modificato. A conclusione di questo processo, il container termina automaticamente.

Esattamente come cowsay, anche whalesay di Docker offre la possibilità di intervenire durante l’esecuzione del programma per influenzare l’output del testo nel terminale. Metti alla prova questa funzione sostituendo il “boo” del comando standard con una successione di caratteri a scelta, ad esempio con quella che potrebbe corrispondere a una battuta pronunciata dalla balena.

sudo docker run docker/whalesay cowsay What did the shark say to the whale? What are you blubbering about?
bash
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 determinata immagine, puoi ottenere una panoramica di tutte le immagini sul tuo sistema locale. Per farlo utilizza la seguente riga di comando:

sudo docker images
bash

Il comando docker images (alternativa: docker image ls) ti fornisce tutte le immagini locali comprensive delle dimensioni dei file, dell’ID e del tag.

Panoramica di tutte le immagini sul sistema locale
La panoramica mostra le immagini “hello-world” e “docker/whalesay”.

Avviando un container l’immagine che ne sta alla base viene scaricata come copia dal repository e salvata permanentemente sul tuo computer. In questo modo risparmierai tempo nel caso in cui in futuro ti ritroverai a dover riutilizzare quella stessa immagine. Un nuovo download viene avviato soltanto se la fonte dell’immagine è cambiata, ad esempio se nel repository è disponibile una versione aggiornata.

Mostrare tutti i container sul sistema locale

Se desideri ottenere una panoramica di tutti i container attualmente in esecuzione sul tuo sistema o che lo sono stati in passato, utilizza l’istruzione della riga di comando docker ps in combinazione con l’opzione --all (in breve: -a):

sudo docker ps -a
bash
Panoramica di tutti i container sul sistema locale
La panoramica mostra tutti i container che sono stati eseguiti su Docker Engine

Il terminale riporta informazioni 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 attualmente in esecuzione sul tuo sistema, utilizza docker ps senza ulteriori opzioni:

sudo docker ps
bash

Attualmente non dovrebbe esserci alcun container in esecuzione sul tuo sistema.

Creare delle immagini Docker

Fin qui hai imparato come trovare le immagini su Docker Hub, come scaricarle e come eseguirle sul sistema che preferisci, sul quale è stato precedentemente installato Docker Engine. Con Docker non disponi però solo dell’ampia offerta di app del registry, ma la piattaforma ti offre anche molte possibilità di creare delle immagini e di condividerle con altri sviluppatori.

Già nei capitoli introduttivi di questo tutorial ti abbiamo illustrato che ogni immagine Docker si basa su un Dockerfile. I Dockerfile possono presentarsi come una sorta di istruzioni per il montaggio delle immagini. Si tratta di semplici file di testo contenenti tutte le indicazioni delle quali Docker ha bisogno per creare un’immagine. Nei prossimi passaggi scoprirai come scrivere un Dockerfile e come istruire Docker a utilizzarlo 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 Dockerfile. Con Linux puoi creare nuove directory facilmente attraverso il terminale. Utilizza i seguenti comandi per creare una directory con il nome mydockerbuild:
mkdir mydockerbuild
bash
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
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 comodamente file di testo. A questo scopo utilizza un editor come Nano o Vim. Crea un file di testo con il nome di Dockerfile nella directory mydockerbuild.
nano Dockerfile
bash
Terminale di Ubuntu: creare file di testo con Nano
L’editor di testo Nano è preinstallato su tutte le versioni di Ubuntu.
  1. Scrivere un Dockerfile: i file di testo creati servono come modello per le immagini che hai creato. Invece di programmare l’immagine da zero, in questo tutorial utilizziamo l’immagine demo docker/whalesay come modello di partenza. Questa può essere collegata al tuo Dockerfile per mezzo del comando FROM. Utilizza il tag :latest per utilizzare 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 precedentemente immesso in combinazione con il comando per avviare il container. Sarebbe di certo ancora più interessante se lo script fosse in grado di generare dei testi sempre nuovi in maniera del tutto automatica. Questo può essere realizzato con l’aiuto del programma fortunes, disponibile su ogni sistema Linux. La funzione di base di Fortunes consiste nel generare aforismi per i biglietti della fortuna e frasi divertenti. Utilizza il seguente comando per aggiornare il tuo pacchetto index e per installare fortunes:

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

Successivamente definisci il CMD Statement. Questo viene eseguito dopo il comando RUN, purché non sia stato precedentemente sovrascritto (docker run image CMD). Utilizza il seguente comando per eseguire il programma fortunes con l’opzione -a (“Scegli tra tutti i database”) e visualizzare l’output tramite il programma cowsay nel terminale:

CMD /usr/games/fortune -a | cowsay

Il tuo Dockerfile 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 attenzione: i comandi all’interno di un Dockerfile non sono più lunghi di una riga e iniziano sempre con una parola chiave. La sintassi che vi sta alla base è “case-insensitive”, il che significa che non fa differenza se scrivi in maiuscolo o minuscolo. Tuttavia, con il tempo è diventata la prassi scrivere le parole chiave con le lettere maiuscole.

Nano, l’editor di testo, nel terminale di Ubuntu
Utilizza le combinazioni di tasti nel piè di pagina per controllare l’editor di testo Nano.
  1. Salvare i file di testo: salva sempre le modifiche apportate. Nel caso in cui dovessi utilizzare l’editor Nano, utilizza la combinazione di tasti [CTRL] + [O] e conferma premendo [Invio]. Nano ti informerà che sono state trascritte tre righe nel file selezionato. Chiudi l’editor con la combinazione di tasti [CTRL] + [X].
  2. Creare un’immagine da un Dockerfile: per creare un’immagine da un Dockerfile, 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 rinominare personalmente l’immagine o dotarla di un tag utilizza l’opzione -t e successivamente la combinazione di caratteri desiderata 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 successivo mostra che il Dockerfile che sta alla base si trova nella directory selezionata. Alternativamente hai la possibilità di indicare un percorso file o un URL che conduca ai file di origine.

Il processo build inizia non appena hai confermato 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 terminologia di Docker questi dati prendono il nome di “Context”.

In seguito viene localizzata l’immagine docker/whalesay grazie al tag :latest:

Se l’intero Context necessario per la creazione dell’immagine è presente, il demone Docker avvia i modelli di immagine legati tramite FROM all’interno di un container temporaneo e passa poi al comando successivo contenuto nel Dockerfile. Nel nostro esempio si tratta di un comando RUN, finalizzato all’installazione del programma fortunes.

Al termine di ogni passaggio per la creazione di un’immagine, Docker ti fornisce un ID per il livello corrispondente (layer), creato durante il passaggio in questione. Dunque, all’interno del Dockerfile ogni riga corrisponde a un livello dell’immagine creata su di esso.

Terminato il comando RUN, il demone Docker arresta il container appositamente creato, lo elimina e avvia un nuovo container temporaneo per il livello del CMS Statement. Al termine del processo di creazione, anche questo container temporaneamente avviato viene interrotto e cancellato. A questo punto Docker ti fornisce l’ID di una nuova immagine:

Successfully built a8f2048c9ab8

Il terminale di Ubuntu: messaggio di stato durante la creazione di un’immagine.“)

Trovi la tua immagine appena creata nella panoramica delle immagini archiviate in locale, con il nome di docker-whale.

sudo docker images
bash
Terminale di Ubuntu: panoramica di tutte le immagini
L’immagine appena creata nella panoramica delle immagini.

Per avviare un container dall’immagine che hai appena creato, utilizza il comando sudo docker run in combinazione con il nome dell’immagine:

sudo docker run docker-whale
bash

Se l’immagine è stata creata senza errori dal Dockerfile, la tua balena dovrebbe essere tutta bella pimpante e pronunciare massime più o meno sagge. Fai attenzione al fatto che ogni volta che riavvii il container, viene generato un nuovo aforisma.

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 disposizione per tutta la community o per un determinato gruppo di lavoro, devi innanzitutto collegarla a un repository con lo stesso nome, all’interno del tuo namespace personale. Questo passaggio prende il nome di tagging nella terminologia di Docker.

Qui di seguito ti guidiamo durante la pubblicazione di un’immagine su Docker Hub:

  1. Creare il repository: accedi a Docker Hub con il tuo ID Docker e la password personale e crea un repository pubblico con il nome di docker-whale.
La maschera di Docker Hub per la creazione di un repository
Crea un repository per la tua immagine; fonte: hub.docker.com
  1. Individuare l’ID dell’immagine: individua l’ID dell’immagine docker whale che hai creato con il comando docker images.
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, necessario 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 presentato 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 verificare se i tag alla tua immagine sono stati assegnati correttamente, controlla tramite docker images. Il nome del repository dovrebbe contenere dunque il tuo ID Docker.

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 innanzitutto registrarti su Docker Hub utilizzando il comando docker login.
sudo docker login
bash

A questo punto il terminale ti chiede di inserire il nome utente, corrispondente all’ID Docker, e la rispettiva password.

Registrazione su Docker Hub tramite il terminale di Ubuntu
Prima di poter caricare un’immagine su Docker Hub, devi registrarti.

Se la registrazione è avvenuta con successo, utilizza il comando docker push per caricare l’immagine nel repository appena creato.

sudo docker push [Namespace]/docker-whale
bash

Il processo di caricamento non dovrebbe durare più di qualche secondo. Lo stato attuale ti viene comunicato tramite il terminale.

Comunicazione di stato sul terminale di Ubuntu dopo l’upload dell’immagine
Terminato il caricamento, l’immagine è disponibile sotto il tag “latest” su Docker Hub.

Registrati su Docker Hub tramite il browser così da vedere l’immagine caricata.

Docker Hub: vista dettagliata del repository [namespace]/docker-whale
L’ultimo aggiornamento del repository ti viene mostrato dettagliatamente; fonte: hub-docker.com

Se desideri caricare più di un’immagine per repository, 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 visualizzare un riepilogo delle varie versioni di un’immagine, fai clic sulla scheda “Tags” sul repository di Docker Hub.

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 dovrebbero invece essere offerte in repository separati.

Se l’upload è avvenuto con successo, l’immagine che hai creato è disponibile in tutto il mondo per ogni utente Docker attraverso il repository pubblico.

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

Fai attenzione che va però prima cancellata la versione locale dell’immagine per poterne scaricare una copia con lo stesso tag. Altrimenti Docker ti comunica che l’immagine desiderata è già presente nella versione aggiornata.

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

Per cancellare le immagini Docker locali utilizza il comando docker rmi in combinazione con il corrispettivo ID dell’immagine. Così facendo indichi tale immagine come già posseduta attraverso docker images. Nel caso in cui Docker ti informi di conflitti in corso, ad esempio perché un ID dell’immagine viene utilizzato su diversi repository o da un container, puoi rafforzare il tuo comando con l’opzione --force (in breve: -f) e forzare così il processo.

sudo docker rmi -f a8f2048c9ab8
bash
Comando docker rmi in combinazione con l’opzione -f (force)
Utilizza il comando “docker rmi” in combinazione con l’opzione “-f” per forzare un processo di cancellazione.

Richiedi che ti venga mostrata di nuovo una panoramica di tutte le immagini locali:

sudo docker Images
bash

Gli elementi cancellati non dovrebbero più comparire nella lista del terminale. Utilizza il comando pull presente nel repository per scaricare una nuova copia dell’immagine da Docker Hub:

sudo docker pull [Namespace]/docker-whale
bash
Terminale di Ubuntu: download da Docker Hub
L’immagine precedentemente pubblicata è stata scaricata con successo.

Altri argomenti e tutorial legati a Docker

L’universo Docker è ampio. Con il tempo si è sviluppato diventando un ecosistema costituito da diversi strumenti Docker. Questa piattaforma container risulta particolarmente interessante per gli amministratori e le amministratrici nel caso in cui debbano gestire applicazioni complesse in parallelo su più container su diversi sistemi. In tal caso Docker offre diverse funzioni per l’orchestrazione di un cluster di questo tipo. Trovi maggiori informazioni al riguardo nell’articolo dedicato all’orchestrazione di Docker con Swarm e Compose.

Nella Digital Guide trovi altri tutorial per lavorare con Docker:

Inoltre, Docker è adatto a vari scenari applicativi. Nella Digital Guide ci sono i seguenti articoli:

Docker non è sempre la scelta migliore per ogni applicazione. Pertanto, ti indichiamo le alternative a Docker più importanti. Inoltre, abbiamo confrontato in dettaglio alcune alternative con Docker:

Per offrirti una migliore esperienza di navigazione online questo sito web usa dei cookie, propri e di terze parti. Continuando a navigare sul sito acconsenti all’utilizzo dei cookie. Scopri di più sull’uso dei cookie e sulla possibilità di modificarne le impostazioni o negare il consenso.