Comprendere e gestire i volumi dei container Docker

Docker è un software open source per creare e gestire container. Un volume di Docker permette di scambiare dati tra questi container o rendere persistenti dati provenienti da un container Docker.

Requisiti

Il file system di Docker

Per comprendere i volumi di Docker, è fondamentale avere prima di tutto una panoramica sul funzionamento del file system di Docker.

Un’immagine Docker è composta da più livelli protetti da scrittura. Quando si crea un container da un’immagine, Docker inserisce un nuovo livello descrivibile in cima al sistema. Con Docker questo processo prende il nome di union file system.

Ogni volta che si modifica un file, Docker ne crea una copia dai livelli protetti da scrittura sul livello descrivibile situato in cima. In questo modo, il file originario (protetto da scrittura) resta invariato.

Cancellando il container, si perde il livello descrivibile più in alto. Ciò significa che tutte le modifiche apportate dopo l’avvio del container non saranno più disponibili.

IONOS Cloud Compute Engine

Le medie e grandi aziende scelgono il Cloud made in Germany. IaaS e PaaS, servizi per veri campioni.

Sicuro
Affidabile
Flessibile

Come correggere un problema con i volumi di Docker

Un volume di container permette di mantenere inalterati i file anche quando si eliminano i container Docker. I volumi rappresentano inoltre una possibilità pratica per scambiare dati tra l’host e il container.

Collegare un volume di un container Docker rappresenta una buona soluzione per eseguire le seguenti operazioni:

  • Trasmettere dati in un container Docker
  • Salvare dati da un container Docker
  • Scambiare dati tra container Docker

I volumi di Docker esistono al di fuori dello union file system grazie all’accesso di sola lettura e al livello descrivibile. Il volume è una cartella condivisa tra il container e il computer host. È possibile anche condividere volumi tra container.

Consiglio

Sul server cloud di IONOS potete selezionare Docker come applicazione preinstallata sul cloud così potrete accedere alle vostre applicazioni dappertutto!

Nozioni di base dei volumi di Docker

Un volume di un container “vive” al di fuori del container in questione sul computer host. Dal container il volume si comporta come una cartella in cui salvare file o da cui recuperare dati. Si tratta del cosiddetto mount point (punto di montaggio) in una directory dell’host.

Esistono diverse possibilità per creare e gestire volumi di Docker. Ciascun metodo presenta i suoi vantaggi e svantaggi.

Utilizzo del comando “volume create” di Docker

Dalla versione 1.9.0 rilasciata il 3/11/2015, è possibile creare e gestire volumi di Docker in modo semplice grazie al comando integrato docker volume.

Primo passaggio: creare e denominare i volumi

Il comando docker volume create crea un volume denominato. Il nome vi permette di trovare in modo semplice il vostro volume di Docker e di assegnarlo ai container.

Per creare un volume utilizzate il comando:

sudo docker volume create - - name [volume name]

Secondo passaggio: utilizzare il volume in un container Docker

Per avviare un container che utilizza un volume che avete creato con docker volume create, inserite al comando docker run il seguente argomento:

-v [volume name]:[container directory]

Ad esempio, per avviare un container dall’immagine CentOS chiamato my-volume-test e assegnare il Data-Volume nella directory /data del container, il comando è il seguente:

sudo docker run -it --name my-volume-test -v data-volume:/data centos /bin/bash

Terzo passaggio: lista dei volumi

Per visualizzare in una lista tutti i volumi di Docker, utilizzate il comando:

sudo docker volume ls

Questo comando vi restituirà un elenco di tutti i volumi di Docker creati sull’host.

Quarto passaggio: ispezionare i volumi

Per ispezionare un volume denominato, utilizzate il comando:

sudo docker volume inspect [volume name]

Questo comando vi fornisce informazioni sul volume, incluso il mount point e la directory sul sistema host con cui accedere al volume di Docker.

Per ricevere, ad esempio, maggiori informazioni sul volume denominato “Data” che abbiamo creato qui in alto, inserite il comando:

sudo docker volume inspect data-volume

Quinto passaggio: cancellare un volume

Per cancellare un volume creato con questa procedura, utilizzate il comando:

sudo docker volume rm [volume name]

Non sarà possibile cancellare un volume se è utilizzato da un container disponibile. Prima di poter cancellare il volume, dovete interrompere e rimuovere il container Docker con i seguenti comandi:

sudo docker stop [container name or ID]
sudo docker rm [container name or ID]

Ad esempio, per eliminare il volume denominato “Data”, dovete prima di tutto interrompere e rimuovere il container che lo utilizza con my-volume-test:

sudo docker stop my-volume-test
sudo docker rm my-volume-test

Il volume di dati può essere poi eliminato con il seguente comando:

sudo docker volume rm data-volume

Creare un volume di Docker e indicare una directory sull’host

Se desiderate montare un file system di una directory precisa sul vostro computer host come volume di Docker, inserite al vostro comando docker run il seguente argomento:

-v [host directory]:[container directory]

Ad esempio, per avviare un nuovo container e assegnare la cartella /webfiles sull’host alla cartella/var/wwww/html del container, il comando è:

sudo docker run -it -v /webfiles:/var/www/html centos /bin/bash

Per fare un test, potete creare una directory che utilizzerete come volume di Docker. Per farlo, vi servirà il comando seguente:

sudo mkdir /hostvolume

Inserite con questo comando un piccolo file di prova alla directory:

sudo echo "Hello World">> /hostvolume/host-hello.txt

Successivamente avviate il container denominato my-directory-test e assegnate /hostvolume dell’host a /containervolume del container con il comando seguente:

sudo docker run -it --name my-directory-test -v /hostvolume:/containervolume centos /bin/bash

Non appena vi troverete nel prompt dei comandi del nuovo container, elencate i file nel volume condiviso con il comando:

ls /containervolume

Vedrete il file host-hello.txt che avete creato sull’host.

Questo procedimento funziona anche al contrario e cioè i file inseriti in questa directory sono mostrati sull’host. È possibile verificarlo dal container inserendo al volume condiviso un altro file con il comando seguente:

echo "Hello from the container.">> /containervolume/container-hello.txt

Abbandonate il container con [CTRL] + [P] e [CTRL] + [Q] per ritornare al prompt dei comandi del computer host. Qui potete visualizzare i file nel volume condiviso con il comando successivo:

sudo ls /hostvolume

Vedrete entrambi i file di prova che avete creato dall’host e dal container.

Creare un volume di Docker con un Dockerfile

Utilizzate il comando seguente in un Dockerfile per creare un volume di archiviazione condiviso in un container:

VOLUME [volume path]

Per esempio, per creare un volume /myvolume nel container che deve essere avviato con un Dockerfile, utilizzate il comando:

VOLUME /myvolume

Per fare una prova, create un file denominato Dockerfile con il comando:

sudo nano Dockerfile

Inserite al file il seguente contenuto:

# The source image to start with
FROM centos
# Create a volume
VOLUME /dockerfilevolume

Salvate e chiudete il file.

Successivamente, da questo Dockerfile, create un’immagine denominata dockerfile-volumetest con il comando seguente:

sudo docker build -t dockerfile-volumetest

Infine, avviate un container denominato my-dockerfile-testda questa immagine con il comando:

sudo docker run --name my-dockerfile-test -it dockerfile-volumetest /bin/bash

Non appena vi troverete nel prompt dei comandi del nuovo container, create un piccolo file di prova nel volume condiviso con questo comando:

echo "Hello World">> /dockerfilevolume/dockerfile-container-hello.txt

Abbandonate il container con [CTRL] + [P] e [CTRL] + [Q] per ritornare al prompt dei comandi del computer host.

Come passaggio successivo cercate il mount point con il comando:

sudo docker inspect my-dockerfile-test

Scorrete tra i risultati fino a trovare una sezione denominata “Mounts” che dovrebbe apparire più o meno così:

Sorgente/Source è la directory sul computer host.

Destinazione/Destination è la cartella sul container.

Controllate la cartella sorgente sul vostro computer host. Nell’esempio il comando è:

sudo ls  /var/lib/docker/volumes/30275034a424251a771c91b65ba44261a27f91e3f6af31097b5226b1f46bfe20/_data/test

Qui trovate il file dockerfile-container-hello.txt che avete creato nel container.

Panoramica dei vantaggi e svantaggi dei diversi metodi

Metodo

Vantaggi

Svantaggi

Comando “volume create”

Gestione semplice e rapida

Il volume sull’host è creato automaticamente ed è difficile da trovare

Creare un volume di Docker con una directory sull’host

Il container può essere assegnato a una cartella precisa dell’host

Non è possibile denominare il volume o automatizzare attraverso il Dockerfile

Creazione di un Dockerfile

Automatizzazione del processo

Non è possibile assegnare una cartella dell’host o denominare il volume

Metodo Vantaggi Svantaggi  
Comando “volume create” Gestione semplice e rapida Il volume sull’host è creato automaticamente ed è difficile da trovare  
Creare un volume di Docker con una directory sull’host Il container può essere assegnato a una cartella precisa dell’host Non è possibile denominare il volume o automatizzare attraverso il ((Dockerfile server/knowhow/dockerfile/))
Creazione di un Dockerfile Automatizzazione del processo Non è possibile assegnare una cartella dell’host o denominare il volume  

Condivisione di volumi di Docker tra container

Ci sono situazioni in cui è utile condividere un volume di Docker tra container ed esistono diversi modi per farlo.

Condividere un volume sull’host

Se create un volume sul computer host, potete utilizzarlo contemporaneamente su diversi container e scambiare file tra container e host.

Per questo esempio dovete creare una directory sull’host da utilizzare come volume condiviso tra due container.

Cominciate creando una directory da utilizzare come volume di Docker con il comando seguente:

sudo mkdir /webdata

Inserite in questa directory un piccolo file di prova con questo comando:

sudo echo "Hello from the host.">> /webdata/host-hello.txt

Nel prossimo passaggio avviate un container con il nome sql-database dall’immagine ufficiale PostgreSQL e assegnate /webdata sull’host al container con il comando /data:

sudo docker run -it --name sql-database -v /webdata:/data postgres /bin/bash

Non appena vi troverete nel prompt dei comandi del nuovo container, verificate la corretta configurazione del volume condiviso con il comando:

ls /data

Vedrete il file host-hello.txt che avete creato sull’host. Con il seguente comando inserite un file al volume condiviso:

echo "Hello from the sql-database container.">> /data/sql-hello.txt

Abbandonate il container con [CTRL] + [P] e [CTRL] + [Q] per ritornare al prompt dei comandi del computer host.

Avviate il container dal nome “Webapp” dall’immagine ufficiale PHP+Apache e assegnate /webdata sull’host al container /var/www/html.

sudo docker run -it --name webapp -v /webdata:/var/www/html php:5.6-apache /bin/bash

Non appena vi troverete nel prompt dei comandi del nuovo container, verificate la corretta configurazione del volume condiviso con il comando:

ls /var/www/html

Vedrete sia il file host-hello.txt, che avete creato sull’host, sia il file sql-hello.txt, che avete creato sul container del database di SQL.

Inserite adesso un file proveniente dal container appena creato:

echo "Hello from the webapp container.">> /var/www/html/webapp-hello.txt

Abbandonate il container con [CTRL] + [P] e [CTRL] + [Q] per ritornare al prompt dei comandi del computer host. Sull’host sarete in grado di visualizzare tutti e tre i file con il comando seguente:

sudo ls /webdata

Poiché entrambi i container condividono una cartella che “vive” sull’host, è possibile trasmettere immediatamente i file in tutte e tre le posizioni trascinandoli semplicemente in questa cartella.

Configurare un container come volume di dati condiviso

È anche possibile configurare un container separato come volume di dati condiviso.

Per farlo create un container di dati. Una volta creato il container che dovrà utilizzare il container di dati, inserite al comando docker run il seguente argomento:

--volumes-from [name or ID of data container]
N.B.

Questo funziona indipendentemente dall’esecuzione o meno del container di destinazione. I volumi di Docker non sono cancellati e restano inalterati anche dopo l’interruzione del container.

Per questo esempio create un container di dati denominato “Data-Storage” che funge da volume di dati. In aggiunta, saranno utilizzati altri due container che condividono il container di dati come volume di archiviazione.

Avviate adesso il container Data-Storage dall’immagine ufficiale CentOS-7:

sudo docker run -it -v /shared-data --name data-storage centos /bin/bash

Inserite un piccolo file alla cartella /shared-data:

echo "Hello from the data-storage container.">> /shared-data/data-storage-hello.txt

Abbandonate il container con [CTRL] + [P] e [CTRL] + [Q] per ritornare al prompt dei comandi del computer host.

Avviate il container App dall’immagine ufficiale di Python e montate il container di memoria di dati come volume:

sudo docker run -it --name app --volumes-from data-storage python /bin/bash

Qui potete visualizzare i file nel volume condiviso con il comando seguente:

ls /shared-data

Come vedete, la cartella /shared-data è stata montata come file system dalla cartella /shared-data sul container di memoria di dati e contiene il file data-storage-hello.txt.

Inserite adesso un file proveniente dal container app:

echo "Hello from the app container.">> /shared-data/app-hello.txt

Abbandonate il container con [CTRL] + [P] e [CTRL] + [Q] per ritornare al prompt dei comandi del computer host.

Avviate, infine, il container Web dall’immagine ufficiale di Apache e montate il container di memoria di dati come volume:

sudo docker run -it --name web --volumes-from data-storage httpd /bin/bash

Qui potete visualizzare i file nel volume condiviso con questo comando:

ls /shared-data

Adesso vedrete i file creati da noi sui container di memoria e app.

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

Montare volumi protetti da scrittura

Finora, in questo articolo, abbiamo creato o montato volumi con accesso in lettura e scrittura.

Se desiderate che l’accesso a un container sia limitato soltanto alla lettura di un volume, vi basterà semplicemente inserire :ro per “read-only” alle indicazioni v dei volumi di container:

docker run -v /directory:/path:ro

Questo procedimento può essere molto utile per la sicurezza. L’accesso read-only (di sola lettura) rappresenta una buona soluzione anche se volete assicurarvi che i file di un volume preciso siano protetti da sovrascrittura o eliminazione involontaria da parte di altri container Docker.

Create, ad esempio, un volume sull’host con il nome limited-access con il comando seguente: 

sudo docker volume create --name limited-access

Avviate un container dall’immagine di CentOS con il nome allowed-to-write e assegnate al volume “Limited-Access” un normale volume (read-write):

sudo docker run -it --name allowed-to-write -v limited-access:/data centos /bin/bash

Non appena vi troverete nel prompt dei comandi di questo container, create un file di prova con il comando:

echo "Hello from the container that is allowed to write.">> /data/hello.txt

Abbandonate il container con [CTRL] + [P] e [CTRL] + [Q] per ritornare al prompt dei comandi del computer host.

Adesso avviate un container dall’immagine di CentOS con il nome not-allowed-to-write e assegnatelo al volume Limited-Access come volume Read-only:

sudo docker run -it --name not-allowed-to-write -v limited-access:/data:ro centos /bin/bash

Se provate a creare un file di prova nel volume condiviso con un comando così:

echo "Hello from the container that is not allowed to write.">> /data/no-access.txt

riceverete un messaggio di errore che vi spiega che questo container non ha accesso di scrittura alla directory.

bash:/data/no-access.txt:Read-only file system