# Comandi Docker

Il software open source [Docker](https://www.ionos.it/digitalguide/server/know-how/cose-docker/ "Cos’è 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](https://www.ionos.it/digitalguide/server/configurazione/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:

```none
docker [--options]
```

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

```none
# Versione di Docker
docker --version
```

```none
# 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:

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

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

```none
# Mostra informazioni su Docker
docker info
```

```none
# 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:

```none
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:

```none
docker container run -it httpd
```

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

<table>
  <thead>
    <tr>
      <th></th>
      <th>CLI Docker</th>
      <th>Comando Docker</th>
      <th>Opzioni</th>
      <th>Oggetto</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Struttura</td>
      <td>docker</td>
      <td>&lt;command&gt; &lt;subcommand&gt;</td>
      <td>\[--options\]</td>
      <td>&lt;object&gt;</td>
    </tr>
    <tr>
      <td>Esempio</td>
      <td>docker</td>
      <td>container run</td>
      <td>-it</td>
      <td>httpd</td>
    </tr>
    <tr>
      <td>Dettagli</td>
      <td>Richiama Docker e trasmette ulteriori comandi e opzioni.</td>
      <td>I nomi dei comandi devono essere scritti esattamente come indicato nella documentazione.</td>
      <td>Le opzioni sono trasmesse al comando e controllano il suo comportamento. Esistono due notazioni per le opzioni (illustrate qui di seguito).</td>
      <td>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.</td>
    </tr>
  </tbody>
</table>

### 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.

2. **Forma lunga**: --&lt;Nome dell’opzione&gt;, 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](https://www.ionos.it/digitalguide/server/know-how/container-docker/ "Container Docker"), le [immagini Docker](https://www.ionos.it/digitalguide/server/know-how/immagine-docker/ "Immagine Docker") e i [volumi Docker](https://www.ionos.it/digitalguide/server/know-how/volumi-dei-container-docker/ "Volumi dei container 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:

<table>
  <thead>
    <tr>
      <th>Comando Docker</th>
      <th>Significato</th>
      <th>Analogia gallina-uovo</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>docker build</td>
      <td>Genera un’immagine Docker da un file Docker</td>
      <td>L’uovo riceve le informazioni genetiche</td>
    </tr>
    <tr>
      <td>docker run &lt;image&gt;</td>
      <td>Avvia il container Docker dall’immagine</td>
      <td>Il pulcino esce dall’uovo</td>
    </tr>
    <tr>
      <td>docker commit &lt;container&gt;</td>
      <td>Genera un’immagine Docker dal container</td>
      <td>La gallina depone un nuovo uovo</td>
    </tr>
  </tbody>
</table>

## 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](https://www.ionos.it/digitalguide/server/know-how/una-panoramica-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:

<table>
  <thead>
    <tr>
      <th>Comando Docker standalone</th>
      <th>Comando Docker Management equivalente</th>
      <th>Spiegazione</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>docker ps</td>
      <td>docker container ls</td>
      <td>Mostra i container in esecuzione sull’host</td>
    </tr>
    <tr>
      <td>docker images</td>
      <td>docker image ls</td>
      <td>Mostra le immagini disponibili sull’host</td>
    </tr>
    <tr>
      <td>docker inspect &lt;object&gt;</td>
      <td>docker &lt;object-type&gt; inspect &lt;object&gt;, ad esempio docker image inspect &lt;image&gt;</td>
      <td>Visualizza informazioni su oggetti Docker come immagini, container, volumi, ecc.</td>
    </tr>
  </tbody>
</table>

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:

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

### 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:

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

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

**Mappare la porta TCP 80 dell’host Docker** sulla porta 80 del contenitore Docker:

```none
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:

<table>
  <thead>
    <tr>
      <th>Comando container Docker</th>
      <th>Spiegazione</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>docker container ls</td>
      <td>Mostra i container in esecuzione sull’host</td>
    </tr>
    <tr>
      <td>docker container stats</td>
      <td>Visualizza le informazioni sullo stato dei container in esecuzione</td>
    </tr>
    <tr>
      <td>docker container run &lt;image&gt;</td>
      <td>Avvia un nuovo container dall’immagine specificata o esegue un comando in un nuovo contenitore</td>
    </tr>
    <tr>
      <td>docker container commit &lt;container&gt;</td>
      <td>Crea una nuova immagine dalle modifiche di un container in esecuzione</td>
    </tr>
    <tr>
      <td>docker container attach &lt;container&gt;</td>
      <td>Fornisce un container in esecuzione con input, output e flussi di errore standard locali</td>
    </tr>
    <tr>
      <td>docker container logs &lt;container&gt;</td>
      <td>Visualizza le informazioni di registro di un container</td>
    </tr>
    <tr>
      <td>docker container inspect &lt;container&gt;</td>
      <td>Mostra le informazioni dettagliate di un container</td>
    </tr>
    <tr>
      <td>docker container update &lt;container&gt;</td>
      <td>Aggiorna la configurazione di un container</td>
    </tr>
    <tr>
      <td>docker container rename &lt;container&gt; &lt;new-name&gt;</td>
      <td>Rinomina un container</td>
    </tr>
    <tr>
      <td>docker container port &lt;container&gt;</td>
      <td>Mostra le porte assegnate a un container</td>
    </tr>
    <tr>
      <td>docker container pause &lt;container&gt;</td>
      <td>Mette in pausa i processi in esecuzione in un contenitore</td>
    </tr>
    <tr>
      <td>docker container unpause &lt;container&gt;</td>
      <td>Riprende l’esecuzione dei processi in pausa in un contenitore</td>
    </tr>
    <tr>
      <td>docker container exec &lt;container&gt; &lt;command&gt;</td>
      <td>Esegue un comando all’interno di un container in esecuzione</td>
    </tr>
    <tr>
      <td>docker container stop &lt;container&gt;</td>
      <td>Arresta l’esecuzione di un container</td>
    </tr>
    <tr>
      <td>docker container start &lt;container&gt;</td>
      <td>Riprende l’esecuzione di un container arrestato</td>
    </tr>
    <tr>
      <td>docker container restart &lt;container&gt;</td>
      <td>Riavvia un contenitore; si comporta come docker container stop &lt;container&gt;; docker container start &lt;container&gt;</td>
    </tr>
    <tr>
      <td>docker container top &lt;container&gt;</td>
      <td>Elenca i processi in esecuzione in un container</td>
    </tr>
    <tr>
      <td>docker container kill &lt;container&gt;</td>
      <td>Arresta un container in esecuzione</td>
    </tr>
    <tr>
      <td>docker container rm &lt;container&gt;</td>
      <td>Rimuove un container dal sistema</td>
    </tr>
    <tr>
      <td>docker container prune</td>
      <td>Rimuove tutti i container arrestati dal sistema</td>
    </tr>
    <tr>
      <td>docker container cp &lt;container&gt;:&lt;source-path&gt; &lt;dest-path&gt;</td>
      <td>Copia file e cartelle da un container al file system locale</td>
    </tr>
    <tr>
      <td>docker container diff &lt;container&gt;</td>
      <td>Visualizza le modifiche al file system di un container</td>
    </tr>
    <tr>
      <td>docker container export &lt;container&gt;</td>
      <td>Emette il file system di un container come archivio “tarball”; tutti i livelli sono ridotti a uno</td>
    </tr>
  </tbody>
</table>

### 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:

<table>
  <thead>
    <tr>
      <th>Comando dell’immagine Docker</th>
      <th>Spiegazione</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>docker image build</td>
      <td>Genera un’immagine Docker da un file Docker</td>
    </tr>
    <tr>
      <td>docker image history &lt;image&gt;</td>
      <td>Mostra i passaggi finora compiuti per la creazione di un’immagine Docker</td>
    </tr>
    <tr>
      <td>docker image import &lt;tarball&gt;</td>
      <td>Genera un’immagine Docker da un archivio “tarball”</td>
    </tr>
    <tr>
      <td>docker image inspect &lt;image&gt;</td>
      <td>Mostra informazioni dettagliate su un’immagine Docker</td>
    </tr>
    <tr>
      <td>docker image load</td>
      <td>Carica un archivio immagine creato con 'docker image save'</td>
    </tr>
    <tr>
      <td>docker image ls</td>
      <td>Elenca le immagini disponibili sull’host Docker</td>
    </tr>
    <tr>
      <td>docker image prune</td>
      <td>Rimuove le immagini Docker inutilizzate dall’host Docker</td>
    </tr>
    <tr>
      <td>docker image pull &lt;image&gt;</td>
      <td>Ottiene l’immagine Docker dal registro</td>
    </tr>
    <tr>
      <td>docker image push &lt;image&gt;</td>
      <td>Invia un’immagine a un registro</td>
    </tr>
    <tr>
      <td>docker image rm &lt;image&gt;</td>
      <td>Rimuove un’immagine dall’host locale</td>
    </tr>
    <tr>
      <td>docker image save &lt;image&gt;</td>
      <td>Genera un archivio di immagini con tutti i livelli di un’immagine</td>
    </tr>
    <tr>
      <td>docker image tag &lt;source-image&gt; &lt;target-image&gt;</td>
      <td>Attribuisce un tag a un’immagine</td>
    </tr>
  </tbody>
</table>

### 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:

<table>
  <thead>
    <tr>
      <th>Comando del volume Docker</th>
      <th>Spiegazione</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>docker volume ls</td>
      <td>Visualizza i volumi situati sull’host</td>
    </tr>
    <tr>
      <td>docker volume prune</td>
      <td>Rimuove tutti i volumi inutilizzati dall’host</td>
    </tr>
    <tr>
      <td>docker volume create</td>
      <td>Crea un nuovo volume sull’host</td>
    </tr>
    <tr>
      <td>docker inspect &lt;volume&gt;</td>
      <td>Mostra informazioni dettagliate su un volume</td>
    </tr>
    <tr>
      <td>docker volume rm &lt;volume&gt;</td>
      <td>Rimuove il volume specificato dall’host</td>
    </tr>
  </tbody>
</table>


This is a markdown version of: [https://www.ionos.it/digitalguide/server/know-how/comandi-docker/](https://www.ionos.it/digitalguide/server/know-how/comandi-docker/) for AI/LLM consumption.