Il software open source Docker è diventato lo standard per la vir­tua­liz­za­zio­ne dei container di ap­pli­ca­zio­ni. La vir­tua­liz­za­zio­ne dei container co­sti­tui­sce un ulteriore passaggio nel progresso dello sviluppo delle macchine virtuali, ma con una dif­fe­ren­za so­stan­zia­le: invece di simulare un sistema operativo completo, la singola ap­pli­ca­zio­ne viene vir­tua­liz­za­ta in un container.

Docker viene con­trol­la­to sul sistema locale tramite un’in­ter­fac­cia a riga di comando. I relativi comandi risultano quindi es­sen­zia­li per lavorare con la piat­ta­for­ma. Vi spie­ghia­mo come fun­zio­na­no i comandi Docker e vi pre­sen­tia­mo quelli più im­por­tan­ti.

Cosa sono i comandi Docker?

Per capire meglio cosa sono i comandi Docker e come fun­zio­na­no, è ne­ces­sa­rio spiegare bre­ve­men­te la struttura di Docker. L’in­stal­la­zio­ne di Docker su un host locale si basa sul Docker Engine. Il Docker Engine consiste di tre com­po­nen­ti prin­ci­pa­li:

  1. Il Docker Daemon, che gira come dockerd sull’host.
  2. La Docker API, fornita dal Docker Deamon, che viene in­di­riz­za­to e con­trol­la­to tramite l’API stessa.
  3. L’in­ter­fac­cia della riga di comando (CLI), uti­liz­za­ta per co­mu­ni­ca­re con la Docker API at­tra­ver­so i comandi Docker.

Per con­trol­la­re Docker, l’utente inserisce i comandi Docker sulla riga di comando. I comandi vengono ricevuti ed elaborati dalla CLI Docker. Dai comandi vengono generate le chiamate API cor­ri­spon­den­ti al Docker Deamon, in­ca­ri­ca­to di svolgere il lavoro effettivo.

Consiglio

Il modo migliore per imparare a uti­liz­za­re i comandi Docker è prendere con­fi­den­za con il software. Il nostro tutorial di Docker vi aiuta a capire i concetti più im­por­tan­ti.

Come sono strut­tu­ra­ti i comandi Docker?

A causa degli sviluppi storici di Docker, si sono affermati due tipologie di comandi Docker.

In primo luogo, abbiamo una manciata di comandi stan­da­lo­ne, ovvero in­di­pen­den­ti. Questi, di solito composti da verbi, eseguono un’azione specifica quando vengono ri­chia­ma­ti. Tra gli esempi più noti troviamo 'docker pull' e 'docker build'. Man mano che la piat­ta­for­ma è cresciuta e sono apparse nuove fun­zio­na­li­tà, è diventato sempre più difficile trovare verbi adatti.

Oltre a questa tipologia, sono stati in­tro­dot­ti i co­sid­det­ti “Docker Ma­na­ge­ment Commands”, i comandi di gestione Docker, per rag­grup­pa­re i comandi nel tentativo di riportare ordine nella ten­ta­co­la­re diversità dei comandi stessi. Questi comandi di Docker Ma­na­ge­ment sono di solito composti da so­stan­ti­vi. Esempi ben noti sono 'docker image' e 'docker con­tai­ner'. I comandi Docker Ma­na­ge­ment rag­grup­pa­no dei sot­to­co­man­di, che sono a loro volta composti da verbi.

In questo modo, gli stessi verbi possono essere usati in diversi contesti senza che i nomi collidano. Per esempio, il comando 'docker image rm' serve a rimuovere un’immagine, mentre il comando 'docker container rm' serve a rimuovere un con­te­ni­to­re.

In­di­pen­den­te­men­te dal fatto che vengano uti­liz­za­ti i comandi Docker stan­da­lo­ne o i comandi Docker Ma­na­ge­ment, entrambe le tipologie di comandi Docker sono eseguite sulla riga di comando. Come di consueto, sono uti­liz­za­ti inserendo il nome del comando seguito da parametri opzionali. Se ne­ces­sa­rio, al comando può seguire il nome di uno o più oggetti, come ad esempio un container, un’immagine, un volume o simili.

Vediamo la struttura generale di un comando Docker sulla riga di comando. Nel caso più semplice, solo la CLI Docker viene ri­chia­ma­ta con un’opzione allegata:

docker [--options]

Esempi ben noti sono l’output della versione di Docker o delle in­for­ma­zio­ni di aiuto di Docker:

# Versione di Docker
docker --version
# Mostra l’aiuto di Docker
docker --help
Consiglio

Ag­giun­ge­te l’opzione '--help' a un sot­to­co­man­do Docker per mostrare le in­for­ma­zio­ni di aiuto del comando.

Nella maggior parte dei casi, non ri­chia­mia­mo solo la CLI di Docker, ma forniamo in aggiunta il nome di un comando specifico. Può trattarsi di un comando stan­da­lo­ne o di un comando Ma­na­ge­ment seguito da un sot­to­co­man­do. Diamo prima un’occhiata al modello generale di un comando Docker stan­da­lo­ne. Il nome 'docker' è seguito dal nome del comando, dai parametri opzionali e dal nome di un oggetto Docker, se ap­pli­ca­bi­le:

docker <command> [--options] <object>

Per vi­sua­liz­za­re varie in­for­ma­zio­ni di stato vengono uti­liz­za­ti due noti comandi Docker stan­da­lo­ne per la pro­dut­ti­vi­tà:

# Mostra informazioni su Docker
docker info
# Mostra le immagini Docker sull’host
docker images

In seguito, prendiamo con­fi­den­za con i comandi Docker Ma­na­ge­ment. Come già detto, questi servono a mettere ordine nel caos organico dei comandi. Ori­gi­na­ria­men­te, esisteva il comando 'docker ls' per elencare i container su un host e, ana­lo­ga­men­te, il comando 'docker images' per elencare le immagini. Un sistema non esat­ta­men­te intuitivo. Anche se og­gi­gior­no è ancora possibile uti­liz­za­re entrambe le tipologie di comandi, i comandi 'docker container ls' e 'docker image ls' offrono un’ottima al­ter­na­ti­va.

Lo schema generale dei comandi Docker Ma­na­ge­ment è basato sulla ben nota struttura dei comandi stan­da­lo­ne di Docker. Il nome 'docker' è seguito dal nome del comando di gestione e dal suo sot­to­co­man­do. Con­clu­dia­mo anche in questo caso con parametri opzionali, così come il nome di un oggetto Docker, se ap­pli­ca­bi­le:

docker <management-command> <subcommand> [--options] <object>

Il­lu­stria­mo il modello con un esempio concreto, ovvero il comando Docker per avviare un nuovo container dall’immagine 'httpd' in modalità in­te­rat­ti­va:

docker container run -it httpd

Facciamo un confronto tra la struttura generale dei comandi Docker Ma­na­ge­ment e i singoli com­po­nen­ti dell’esempio pre­ce­den­te:

CLI Docker Comando Docker Opzioni Oggetto
Struttura docker <command> <sub­com­mand> [--options] <object>
Esempio docker container run -it httpd
Dettagli Richiama Docker e trasmette ulteriori comandi e opzioni. I nomi dei comandi devono essere scritti esat­ta­men­te come indicato nella do­cu­men­ta­zio­ne. Le opzioni sono trasmesse al comando e con­trol­la­no il suo com­por­ta­men­to. Esistono due notazioni per le opzioni (il­lu­stra­te qui di seguito). Se­gna­po­sto per un oggetto come obiettivo dell’ope­ra­zio­ne. Nel caso di oggetti Docker come i container e le immagini, viene usato come ID il nome o l’hash dell’oggetto.

Quali sono le opzioni accettate dai comandi Docker?

Come la maggior parte dei comandi da riga di comando, i comandi Docker sono con­trol­la­ti da parametri opzionali, le co­sid­det­te “opzioni”, che seguono il nome del comando, facendo di­stin­zio­ne tra maiuscole e minuscole. Per la maggior parte delle opzioni esistono di solito due notazioni:

  1. Forma breve: -, ad esempio 'docker -v'

La forma breve non è par­ti­co­lar­men­te eloquente. Permette però di combinare diverse opzioni in una sola, ad esempio 'docker run -it' invece di 'docker -i -t'. L’ordine è ar­bi­tra­rio: è anche possibile scrivere 'docker run -ti' senza problemi. La forma breve risulta adatta per lavorare ra­pi­da­men­te con comandi co­no­sciu­ti sulla riga di comando.

  1. Forma lunga: --<Nome dell’opzione>, ad esempio 'docker --version'

La forma lunga è facile da capire, ma richiede più tempo per la battitura e occupa più spazio. Risulta più adatta alla creazione di script. I nomi delle opzioni fungono da do­cu­men­ta­zio­ne.

Qual è la relazione tra file, immagini e container Docker?

La maggior parte dei comandi Docker esistenti servono a gestire i container Docker, le immagini Docker e i volumi Docker. Prima di esaminare in dettaglio i comandi Docker specifici, spie­ghia­mo bre­ve­men­te come gli im­por­tan­ti concetti Docker di container e immagine sono collegati tra loro.

Un container Docker, anche detto con­te­ni­to­re, viene creato da un modello im­mu­ta­bi­le chiamato immagine. Un’immagine Docker contiene le di­pen­den­ze e le im­po­sta­zio­ni di con­fi­gu­ra­zio­ne ne­ces­sa­rie per creare un container. Non solo possiamo creare un container da un’immagine, ma anche salvarne uno esistente in una nuova immagine. I container e le immagini sono correlati l’uno all’altro allo stesso modo di una gallina e un uovo:

Comando Docker Si­gni­fi­ca­to Analogia gallina-uovo
docker build Genera un’immagine Docker da un file Docker L’uovo riceve le in­for­ma­zio­ni genetiche
docker run <image> Avvia il container Docker dall’immagine Il pulcino esce dall’uovo
docker commit <container> Genera un’immagine Docker dal container La gallina depone un nuovo uovo

Riepilogo dei comandi Docker più im­por­tan­ti

Docker ha vissuto un rapido sviluppo negli ultimi dieci anni. Oltre alla vir­tua­liz­za­zio­ne originale dei container, Docker oggi include molte altre funzioni. Per esempio, Docker Compose e Docker Swarm possono essere usati per or­che­stra­re ag­gre­ga­zio­ni di container, ca­rat­te­ri­sti­ca che in passato era pre­ro­ga­ti­va delle al­ter­na­ti­ve a Docker. Di seguito ci limitiamo a il­lu­stra­re i sot­toin­sie­mi dei comandi originali, dato che la redazione di un elenco completo andrebbe oltre lo scopo di questo articolo.

Un container Docker comprende le seguenti com­po­nen­ti, che possono essere con­trol­la­te con i comandi cor­ri­spon­den­ti:

  1. Sistema operativo dei container e file system union
  2. Com­po­nen­ti software e con­fi­gu­ra­zio­ne
  3. Variabili am­bien­ta­li e con­fi­gu­ra­zio­ne di runtime
  4. Porte e volumi
  5. Processi e registri

Quali sono i comandi Docker stan­da­lo­ne?

Og­gi­gior­no è possibile con­trol­la­re la maggior parte delle fun­zio­na­li­tà di Docker at­tra­ver­so i comandi di ma­na­ge­ment Docker. I comandi stan­da­lo­ne fun­zio­na­no tuttora, ma i comandi di ma­na­ge­ment risultano essere mag­gior­men­te de­scrit­ti­vi:

Comando Docker stan­da­lo­ne Comando Docker Ma­na­ge­ment equi­va­len­te Spie­ga­zio­ne
docker ps docker container ls Mostra i container in ese­cu­zio­ne sull’host
docker images docker image ls Mostra le immagini di­spo­ni­bi­li sull’host
docker inspect <object> docker <object-type> inspect <object>, ad esempio docker image inspect <image> Vi­sua­liz­za in­for­ma­zio­ni su oggetti Docker come immagini, container, volumi, ecc.

Esistono comunque ancora oggi alcuni comandi Docker stan­da­lo­ne che non possono essere so­sti­tui­ti dai comandi Docker Ma­na­ge­ment, poiché si ri­fe­ri­sco­no all’in­stal­la­zio­ne Docker nel suo complesso:

Comando Docker stan­da­lo­ne Spie­ga­zio­ne
docker --help Mostra aiuto per la CLI di Docker
docker --version Mostra la versione dell’in­stal­la­zio­ne di Docker
docker info Vi­sua­liz­za in­for­ma­zio­ni a livello di sistema sull’in­stal­la­zio­ne di Docker
docker login Accede a un registro di container o a un back end cloud
docker logout Si di­scon­net­te dal registro dei container o dal back end del cloud

Quali sono i comandi dei container Docker?

A dif­fe­ren­za della vir­tua­liz­za­zio­ne con le macchine virtuali, un container Docker non contiene il proprio sistema operativo. Infatti, tutti i container in ese­cu­zio­ne su un host Docker accedono allo stesso kernel del sistema operativo. A ogni container eseguito viene assegnata tramite comando una certa quantità di risorse di sistema. Queste includono memoria, core della CPU, memoria di massa e di­spo­si­ti­vi di rete (virtuali). Di seguito due esempi:

Assegnare un core della CPU e 10 megabyte di memoria ai container Docker all’avvio:

docker container run --cpus='1' --memory='10m' <image>

Mappare la porta TCP 80 dell’host Docker sulla porta 80 del con­te­ni­to­re Docker:

docker container run -p 80:80/tcp <image>

Su un host, i container possono essere avviati, arrestati e rimossi. È inoltre possibile con­trol­la­re i processi in ese­cu­zio­ne all’interno di un container. Di con­se­guen­za, molti dei comandi container di Docker si occupano dei seguenti compiti:

Comando container Docker Spie­ga­zio­ne
docker container ls Mostra i container in ese­cu­zio­ne sull’host
docker container stats Vi­sua­liz­za le in­for­ma­zio­ni sullo stato dei container in ese­cu­zio­ne
docker container run <image> Avvia un nuovo container dall’immagine spe­ci­fi­ca­ta o esegue un comando in un nuovo con­te­ni­to­re
docker container commit <container> Crea una nuova immagine dalle modifiche di un container in ese­cu­zio­ne
docker container attach <container> Fornisce un container in ese­cu­zio­ne con input, output e flussi di errore standard locali
docker container logs <container> Vi­sua­liz­za le in­for­ma­zio­ni di registro di un container
docker container inspect <container> Mostra le in­for­ma­zio­ni det­ta­glia­te di un container
docker container update <container> Aggiorna la con­fi­gu­ra­zio­ne di un container
docker container rename <container> <new-name> Rinomina un container
docker container port <container> Mostra le porte assegnate a un container
docker container pause <container> Mette in pausa i processi in ese­cu­zio­ne in un con­te­ni­to­re
docker container unpause <container> Riprende l’ese­cu­zio­ne dei processi in pausa in un con­te­ni­to­re
docker container exec <container> <command> Esegue un comando all’interno di un container in ese­cu­zio­ne
docker container stop <container> Arresta l’ese­cu­zio­ne di un container
docker container start <container> Riprende l’ese­cu­zio­ne di un container arrestato
docker container restart <container> Riavvia un con­te­ni­to­re; si comporta come docker container stop <container>; docker container start <container>
docker container top <container> Elenca i processi in ese­cu­zio­ne in un container
docker container kill <container> Arresta un container in ese­cu­zio­ne
docker container rm <container> Rimuove un container dal sistema
docker container prune Rimuove tutti i container arrestati dal sistema
docker container cp <container>:<source-path> <dest-path> Copia file e cartelle da un container al file system locale
docker container diff <container> Vi­sua­liz­za le modifiche al file system di un container
docker container export <container> Emette il file system di un container come archivio “tarball”; tutti i livelli sono ridotti a uno

Quali sono i comandi delle immagini Docker?

A dif­fe­ren­za delle immagini delle macchine virtuali, un’immagine Docker non è nor­mal­men­te composta da un singolo file, bensì è formata da diversi com­po­nen­ti:

  • Image layers: con­ten­go­no dati aggiunti da ope­ra­zio­ni sul file system. I livelli sono so­vrap­po­sti e ridotti a un livello coerente da un file system union.
  • Parent image: fornisce le funzioni di base dell’immagine e ancora l’immagine nella struttura dell’eco­si­ste­ma Docker.
  • Image manifest: descrive il gruppo e iden­ti­fi­ca i livelli di immagine in esso contenuti.

Un’immagine Docker contiene livelli di sola lettura. Ogni livello descrive cam­bia­men­ti suc­ces­si­vi al file system dell’immagine. Per ogni ope­ra­zio­ne che com­por­te­reb­be un cam­bia­men­to al file system dell’immagine, viene creato un nuovo livello. Per in­te­ra­gi­re con le immagini sull’host si usano i seguenti comandi:

Comando dell’immagine Docker Spie­ga­zio­ne
docker image build Genera un’immagine Docker da un file Docker
docker image history <image> Mostra i passaggi finora compiuti per la creazione di un’immagine Docker
docker image import <tarball> Genera un’immagine Docker da un archivio “tarball”
docker image inspect <image> Mostra in­for­ma­zio­ni det­ta­glia­te su un’immagine Docker
docker image load Carica un archivio immagine creato con 'docker image save'
docker image ls Elenca le immagini di­spo­ni­bi­li sull’host Docker
docker image prune Rimuove le immagini Docker inu­ti­liz­za­te dall’host Docker
docker image pull <image> Ottiene l’immagine Docker dal registro
docker image push <image> Invia un’immagine a un registro
docker image rm <image> Rimuove un’immagine dall’host locale
docker image save <image> Genera un archivio di immagini con tutti i livelli di un’immagine
docker image tag <source-image> <target-image> At­tri­bui­sce un tag a un’immagine

Quali sono i comandi del volume Docker?

In un container Docker è contenuta un’ap­pli­ca­zio­ne isolata dal mondo esterno. In molti casi, tuttavia, ha senso con­di­vi­de­re i file tra il container e il sistema host. A tale scopo, Docker riconosce diversi tipi di volumi, che si dif­fe­ren­zia­no tra di loro solo per dettagli minori. La scelta del tipo ap­pro­pria­to dipende prin­ci­pal­men­te dal ri­spet­ti­vo scenario di di­stri­bu­zio­ne:

  • Volumi nominati: rac­co­man­da­ti
  • Volumi anonimi: vengono persi quando il container viene rimosso
  • Bind Mounts: obsoleti e non rac­co­man­da­ti; per­for­man­ti
  • Tmpfs Mounts: contenuti nella RAM; solo con Linux

Per in­te­ra­gi­re con i volumi sono di­spo­ni­bi­li i seguenti comandi Docker:

Comando del volume Docker Spie­ga­zio­ne
docker volume ls Vi­sua­liz­za i volumi situati sull’host
docker volume prune Rimuove tutti i volumi inu­ti­liz­za­ti dall’host
docker volume create Crea un nuovo volume sull’host
docker inspect <volume> Mostra in­for­ma­zio­ni det­ta­glia­te su un volume
docker volume rm <volume> Rimuove il volume spe­ci­fi­ca­to dall’host
Vai al menu prin­ci­pa­le