Comandi Docker

Il software open source Docker è diventato lo standard per la virtualizzazione dei container di applicazioni. La virtualizzazione dei container costituisce un ulteriore passaggio nel progresso dello sviluppo delle macchine virtuali, ma con una differenza sostanziale: invece di simulare un sistema operativo completo, la singola applicazione viene virtualizzata in un container.

Docker viene controllato sul sistema locale tramite un’interfaccia a riga di comando. I relativi comandi risultano quindi essenziali per lavorare con la piattaforma. Vi spieghiamo come funzionano i comandi Docker e vi presentiamo quelli più importanti.

Cosa sono i comandi Docker?

Per capire meglio cosa sono i comandi Docker e come funzionano, è necessario spiegare brevemente la struttura di Docker. L’installazione di Docker su un host locale si basa sul Docker Engine. Il Docker Engine consiste di tre componenti principali:

  1. Il Docker Daemon, che gira come dockerd sull’host.
  2. La Docker API, fornita dal Docker Deamon, che viene indirizzato e controllato tramite l’API stessa.
  3. L’interfaccia della riga di comando (CLI), utilizzata per comunicare con la Docker API attraverso i comandi Docker.

Per controllare 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 corrispondenti al Docker Deamon, incaricato di svolgere il lavoro effettivo.

Consiglio

Il modo migliore per imparare a utilizzare i comandi Docker è prendere confidenza con il software. Il nostro tutorial di Docker vi aiuta a capire i concetti più importanti.

Come sono strutturati 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 standalone, ovvero indipendenti. Questi, di solito composti da verbi, eseguono un’azione specifica quando vengono richiamati. Tra gli esempi più noti troviamo 'docker pull' e 'docker build'. Man mano che la piattaforma è cresciuta e sono apparse nuove funzionalità, è diventato sempre più difficile trovare verbi adatti.

Oltre a questa tipologia, sono stati introdotti i cosiddetti “Docker Management Commands”, i comandi di gestione Docker, per raggruppare i comandi nel tentativo di riportare ordine nella tentacolare diversità dei comandi stessi. Questi comandi di Docker Management sono di solito composti da sostantivi. Esempi ben noti sono 'docker image' e 'docker container'. I comandi Docker Management raggruppano dei sottocomandi, 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 contenitore.

Indipendentemente dal fatto che vengano utilizzati i comandi Docker standalone o i comandi Docker Management, entrambe le tipologie di comandi Docker sono eseguite sulla riga di comando. Come di consueto, sono utilizzati inserendo il nome del comando seguito da parametri opzionali. Se necessario, 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 richiamata con un’opzione allegata:

docker [--options]

Esempi ben noti sono l’output della versione di Docker o delle informazioni di aiuto di Docker:

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

Aggiungete l’opzione '--help' a un sottocomando Docker per mostrare le informazioni di aiuto del comando.

Nella maggior parte dei casi, non richiamiamo solo la CLI di Docker, ma forniamo in aggiunta il nome di un comando specifico. Può trattarsi di un comando standalone o di un comando Management seguito da un sottocomando. Diamo prima un’occhiata al modello generale di un comando Docker standalone. Il nome 'docker' è seguito dal nome del comando, dai parametri opzionali e dal nome di un oggetto Docker, se applicabile:

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

Per visualizzare varie informazioni di stato vengono utilizzati due noti comandi Docker standalone per la produttività:

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

In seguito, prendiamo confidenza con i comandi Docker Management. Come già detto, questi servono a mettere ordine nel caos organico dei comandi. Originariamente, esisteva il comando 'docker ls' per elencare i container su un host e, analogamente, il comando 'docker images' per elencare le immagini. Un sistema non esattamente intuitivo. Anche se oggigiorno è ancora possibile utilizzare entrambe le tipologie di comandi, i comandi 'docker container ls' e 'docker image ls' offrono un’ottima alternativa.

Lo schema generale dei comandi Docker Management è basato sulla ben nota struttura dei comandi standalone di Docker. Il nome 'docker' è seguito dal nome del comando di gestione e dal suo sottocomando. Concludiamo anche in questo caso con parametri opzionali, così come il nome di un oggetto Docker, se applicabile:

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

Illustriamo il modello con un esempio concreto, ovvero il comando Docker per avviare un nuovo container dall’immagine 'httpd' in modalità interattiva:

docker container run -it httpd

Facciamo un confronto tra la struttura generale dei comandi Docker Management e i singoli componenti dell’esempio precedente:

  CLI Docker Comando Docker Opzioni Oggetto
Struttura docker <command> <subcommand> [--options] <object>
Esempio docker container run -it httpd
Dettagli Richiama Docker e trasmette ulteriori comandi e opzioni. I nomi dei comandi devono essere scritti esattamente come indicato nella documentazione. Le opzioni sono trasmesse al comando e controllano il suo comportamento. Esistono due notazioni per le opzioni (illustrate qui di seguito). Segnaposto per un oggetto come obiettivo dell’operazione. 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 controllati da parametri opzionali, le cosiddette “opzioni”, che seguono il nome del comando, facendo distinzione 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 è particolarmente eloquente. Permette però di combinare diverse opzioni in una sola, ad esempio 'docker run -it' invece di 'docker -i -t'. L’ordine è arbitrario: è anche possibile scrivere 'docker run -ti' senza problemi. La forma breve risulta adatta per lavorare rapidamente con comandi conosciuti 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 documentazione.

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, spieghiamo brevemente come gli importanti concetti Docker di container e immagine sono collegati tra loro.

Un container Docker, anche detto contenitore, viene creato da un modello immutabile chiamato immagine. Un’immagine Docker contiene le dipendenze e le impostazioni di configurazione necessarie 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 Significato Analogia gallina-uovo
docker build Genera un’immagine Docker da un file Docker L’uovo riceve le informazioni 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ù importanti

Docker ha vissuto un rapido sviluppo negli ultimi dieci anni. Oltre alla virtualizzazione originale dei container, Docker oggi include molte altre funzioni. Per esempio, Docker Compose e Docker Swarm possono essere usati per orchestrare aggregazioni di container, caratteristica che in passato era prerogativa delle alternative a Docker. Di seguito ci limitiamo a illustrare i sottoinsiemi dei comandi originali, dato che la redazione di un elenco completo andrebbe oltre lo scopo di questo articolo.

Un container Docker comprende le seguenti componenti, che possono essere controllate con i comandi corrispondenti:

  1. Sistema operativo dei container e file system union
  2. Componenti software e configurazione
  3. Variabili ambientali e configurazione di runtime
  4. Porte e volumi
  5. Processi e registri

Quali sono i comandi Docker standalone?

Oggigiorno è possibile controllare la maggior parte delle funzionalità di Docker attraverso i comandi di management Docker. I comandi standalone funzionano tuttora, ma i comandi di management risultano essere maggiormente descrittivi:

Comando Docker standalone Comando Docker Management equivalente Spiegazione
docker ps docker container ls Mostra i container in esecuzione sull’host
docker images docker image ls Mostra le immagini disponibili sull’host
docker inspect <object> docker <object-type> inspect <object>, ad esempio docker image inspect <image> Visualizza informazioni su oggetti Docker come immagini, container, volumi, ecc.

Esistono comunque ancora oggi alcuni comandi Docker standalone che non possono essere sostituiti dai comandi Docker Management, poiché si riferiscono all’installazione Docker nel suo complesso:

Comando Docker standalone Spiegazione
docker --help Mostra aiuto per la CLI di Docker
docker --version Mostra la versione dell’installazione di Docker
docker info Visualizza informazioni a livello di sistema sull’installazione di Docker
docker login Accede a un registro di container o a un back end cloud
docker logout Si disconnette dal registro dei container o dal back end del cloud

Quali sono i comandi dei container Docker?

A differenza della virtualizzazione con le macchine virtuali, un container Docker non contiene il proprio sistema operativo. Infatti, tutti i container in esecuzione 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 dispositivi di rete (virtuali). Di seguito due esempi:

Assegnareun 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 contenitore Docker:

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

Su un host, i container possono essere avviati, arrestati e rimossi. È inoltre possibile controllare i processi in esecuzione all’interno di un container. Di conseguenza, molti dei comandi container di Docker si occupano dei seguenti compiti:

Comando container Docker Spiegazione
docker container ls Mostra i container in esecuzione sull’host
docker container stats Visualizza le informazioni sullo stato dei container in esecuzione
docker container run <image> Avvia un nuovo container dall’immagine specificata o esegue un comando in un nuovo contenitore
docker container commit <container> Crea una nuova immagine dalle modifiche di un container in esecuzione
docker container attach <container> Fornisce un container in esecuzione con input, output e flussi di errore standard locali
docker container logs <container> Visualizza le informazioni di registro di un container
docker container inspect <container> Mostra le informazioni dettagliate di un container
docker container update <container> Aggiorna la configurazione 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 esecuzione in un contenitore
docker container unpause <container> Riprende l’esecuzione dei processi in pausa in un contenitore
docker container exec <container> <command> Esegue un comando all’interno di un container in esecuzione
docker container stop <container> Arresta l’esecuzione di un container
docker container start <container> Riprende l’esecuzione di un container arrestato
docker container restart <container> Riavvia un contenitore; si comporta come docker container stop <container>; docker container start <container>
docker container top <container> Elenca i processi in esecuzione in un container
docker container kill <container> Arresta un container in esecuzione
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> Visualizza 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 differenza delle immagini delle macchine virtuali, un’immagine Docker non è normalmente composta da un singolo file, bensì è formata da diversi componenti:

  • Image layers: contengono dati aggiunti da operazioni sul file system. I livelli sono sovrapposti 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’ecosistema Docker.
  • Image manifest: descrive il gruppo e identifica i livelli di immagine in esso contenuti.

Un’immagine Docker contiene livelli di sola lettura. Ogni livello descrive cambiamenti successivi al file system dell’immagine. Per ogni operazione che comporterebbe un cambiamento al file system dell’immagine, viene creato un nuovo livello. Per interagire con le immagini sull’host si usano i seguenti comandi:

Comando dell’immagine Docker Spiegazione
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 informazioni dettagliate su un’immagine Docker
docker image load Carica un archivio immagine creato con 'docker image save'
docker image ls Elenca le immagini disponibili sull’host Docker
docker image prune Rimuove le immagini Docker inutilizzate 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> Attribuisce un tag a un’immagine

Quali sono i comandi del volume Docker?

In un container Docker è contenuta un’applicazione isolata dal mondo esterno. In molti casi, tuttavia, ha senso condividere i file tra il container e il sistema host. A tale scopo, Docker riconosce diversi tipi di volumi, che si differenziano tra di loro solo per dettagli minori. La scelta del tipo appropriato dipende principalmente dal rispettivo scenario di distribuzione:

  • Volumi nominati: raccomandati
  • Volumi anonimi: vengono persi quando il container viene rimosso
  • Bind Mounts: obsoleti e non raccomandati; performanti
  • Tmpfs Mounts: contenuti nella RAM; solo con Linux

Per interagire con i volumi sono disponibili i seguenti comandi Docker:

Comando del volume Docker Spiegazione
docker volume ls Visualizza i volumi situati sull’host
docker volume prune Rimuove tutti i volumi inutilizzati dall’host
docker volume create Crea un nuovo volume sull’host
docker inspect <volume> Mostra informazioni dettagliate su un volume
docker volume rm <volume> Rimuove il volume specificato dall’host