Docker è un software open source per creare e gestire container. Un volume di Docker permette di scambiare dati tra questi container o rendere per­si­sten­ti dati pro­ve­nien­ti da un container Docker.

Requisiti

Il file system di Docker

Per com­pren­de­re i volumi di Docker, è fon­da­men­ta­le avere prima di tutto una pa­no­ra­mi­ca sul fun­zio­na­men­to 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 de­scri­vi­bi­le 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 de­scri­vi­bi­le situato in cima. In questo modo, il file ori­gi­na­rio (protetto da scrittura) resta invariato.

Can­cel­lan­do il container, si perde il livello de­scri­vi­bi­le più in alto. Ciò significa che tutte le modifiche apportate dopo l’avvio del container non saranno più di­spo­ni­bi­li.

Compute Engine
La soluzione IaaS ideale per i tuoi carichi di lavoro
  • vCPU estre­ma­men­te van­tag­gio­se e potenti core dedicati
  • Massima fles­si­bi­li­tà senza periodo con­trat­tua­le minimo
  • Servizio di as­si­sten­za tecnica 24 ore su 24, 7 giorni su 7

Come cor­reg­ge­re un problema con i volumi di Docker

Un volume di container permette di mantenere inal­te­ra­ti i file anche quando si eliminano i container Docker. I volumi rap­pre­sen­ta­no inoltre una pos­si­bi­li­tà pratica per scambiare dati tra l’host e il container.

Collegare un volume di un container Docker rap­pre­sen­ta una buona soluzione per eseguire le seguenti ope­ra­zio­ni:

  • Tra­smet­te­re 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 de­scri­vi­bi­le. Il volume è una cartella condivisa tra il container e il computer host. È possibile anche con­di­vi­de­re volumi tra container.

Consiglio

Sul server cloud di IONOS potete se­le­zio­na­re Docker come ap­pli­ca­zio­ne pre­in­stal­la­ta sul cloud così potrete accedere alle vostre ap­pli­ca­zio­ni dap­per­tut­to!

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 re­cu­pe­ra­re dati. Si tratta del co­sid­det­to mount point (punto di montaggio) in una directory dell’host.

Esistono diverse pos­si­bi­li­tà 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 ri­la­scia­ta il 3/11/2015, è possibile creare e gestire volumi di Docker in modo semplice grazie al comando integrato docker volume.

Primo passaggio: creare e de­no­mi­na­re i volumi

Il comando docker volume create crea un volume de­no­mi­na­to. Il nome vi permette di trovare in modo semplice il vostro volume di Docker e di as­se­gnar­lo ai container.

Per creare un volume uti­liz­za­te il comando:

sudo docker volume create - - name [volume name]

Secondo passaggio: uti­liz­za­re 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 vi­sua­liz­za­re in una lista tutti i volumi di Docker, uti­liz­za­te il comando:

sudo docker volume ls

Questo comando vi re­sti­tui­rà un elenco di tutti i volumi di Docker creati sull’host.

Quarto passaggio: ispe­zio­na­re i volumi

Per ispe­zio­na­re un volume de­no­mi­na­to, uti­liz­za­te il comando:

sudo docker volume inspect [volume name]

Questo comando vi fornisce in­for­ma­zio­ni sul volume, incluso il mount point e la directory sul sistema host con cui accedere al volume di Docker.

Per ricevere, ad esempio, maggiori in­for­ma­zio­ni sul volume de­no­mi­na­to “Data” che abbiamo creato qui in alto, inserite il comando:

sudo docker volume inspect data-volume

Quinto passaggio: can­cel­la­re un volume

Per can­cel­la­re un volume creato con questa procedura, uti­liz­za­te il comando:

sudo docker volume rm [volume name]

Non sarà possibile can­cel­la­re un volume se è uti­liz­za­to da un container di­spo­ni­bi­le. Prima di poter can­cel­la­re il volume, dovete in­ter­rom­pe­re 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 de­no­mi­na­to “Data”, dovete prima di tutto in­ter­rom­pe­re 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 de­si­de­ra­te 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 uti­liz­ze­re­te 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

Suc­ces­si­va­men­te avviate il container de­no­mi­na­to my-directory-test e assegnate /host­vo­lu­me dell’host a /con­tai­ner­vo­lu­me 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 pro­ce­di­men­to funziona anche al contrario e cioè i file inseriti in questa directory sono mostrati sull’host. È possibile ve­ri­fi­car­lo dal container inserendo al volume condiviso un altro file con il comando seguente:

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

Ab­ban­do­na­te il container con [CTRL] + [P] e [CTRL] + [Q] per ritornare al prompt dei comandi del computer host. Qui potete vi­sua­liz­za­re i file nel volume condiviso con il comando suc­ces­si­vo:

sudo ls /hostvolume

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

Creare un volume di Docker con un Doc­ker­fi­le

Uti­liz­za­te il comando seguente in un Doc­ker­fi­le per creare un volume di ar­chi­via­zio­ne condiviso in un container:

VOLUME [volume path]

Per esempio, per creare un volume /myvolume nel container che deve essere avviato con un Doc­ker­fi­le, uti­liz­za­te il comando:

VOLUME /myvolume

Per fare una prova, create un file de­no­mi­na­to Doc­ker­fi­le 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.

Suc­ces­si­va­men­te, da questo Doc­ker­fi­le, create un’immagine de­no­mi­na­ta doc­ker­fi­le-vo­lu­me­te­st con il comando seguente:

sudo docker build -t dockerfile-volumetest

Infine, avviate un container de­no­mi­na­to my-doc­ker­fi­le-test da 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

Ab­ban­do­na­te il container con [CTRL] + [P] e [CTRL] + [Q] per ritornare al prompt dei comandi del computer host.

Come passaggio suc­ces­si­vo cercate il mount point con il comando:

sudo docker inspect my-dockerfile-test

Scorrete tra i risultati fino a trovare una sezione de­no­mi­na­ta “Mounts” che dovrebbe apparire più o meno così:

Sorgente/Source è la directory sul computer host.

De­sti­na­zio­ne/De­sti­na­tion è la cartella sul container.

Con­trol­la­te la cartella sorgente sul vostro computer host. Nell’esempio il comando è:

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

Qui trovate il file doc­ker­fi­le-container-hello.txt che avete creato nel container.

Pa­no­ra­mi­ca dei vantaggi e svantaggi dei diversi metodi

Metodo Vantaggi Svantaggi
Comando “volume create” Gestione semplice e rapida Il volume sull’host è creato au­to­ma­ti­ca­men­te 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 de­no­mi­na­re il volume o au­to­ma­tiz­za­re at­tra­ver­so il Doc­ker­fi­le
Creazione di un Doc­ker­fi­le Au­to­ma­tiz­za­zio­ne del processo Non è possibile assegnare una cartella dell’host o de­no­mi­na­re il volume
Metodo Vantaggi Svantaggi  
Comando “volume create” Gestione semplice e rapida Il volume sull’host è creato au­to­ma­ti­ca­men­te 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 de­no­mi­na­re il volume o au­to­ma­tiz­za­re at­tra­ver­so il ((Doc­ker­fi­le server/knowhow/doc­ker­fi­le/))
Creazione di un Doc­ker­fi­le Au­to­ma­tiz­za­zio­ne del processo Non è possibile assegnare una cartella dell’host o de­no­mi­na­re il volume  

Con­di­vi­sio­ne di volumi di Docker tra container

Ci sono si­tua­zio­ni in cui è utile con­di­vi­de­re un volume di Docker tra container ed esistono diversi modi per farlo.

Con­di­vi­de­re un volume sull’host

Se create un volume sul computer host, potete uti­liz­zar­lo con­tem­po­ra­nea­men­te su diversi container e scambiare file tra container e host.

Per questo esempio dovete creare una directory sull’host da uti­liz­za­re come volume condiviso tra due container.

Co­min­cia­te creando una directory da uti­liz­za­re 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 Post­gre­SQL 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, ve­ri­fi­ca­te la corretta con­fi­gu­ra­zio­ne 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

Ab­ban­do­na­te 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, ve­ri­fi­ca­te la corretta con­fi­gu­ra­zio­ne 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 pro­ve­nien­te dal container appena creato:

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

Ab­ban­do­na­te il container con [CTRL] + [P] e [CTRL] + [Q] per ritornare al prompt dei comandi del computer host. Sull’host sarete in grado di vi­sua­liz­za­re tutti e tre i file con il comando seguente:

sudo ls /webdata

Poiché entrambi i container con­di­vi­do­no una cartella che “vive” sull’host, è possibile tra­smet­te­re im­me­dia­ta­men­te i file in tutte e tre le posizioni tra­sci­nan­do­li sem­pli­ce­men­te in questa cartella.

Con­fi­gu­ra­re un container come volume di dati condiviso

È anche possibile con­fi­gu­ra­re un container separato come volume di dati condiviso.

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

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

Questo funziona in­di­pen­den­te­men­te dall’ese­cu­zio­ne o meno del container di de­sti­na­zio­ne. I volumi di Docker non sono can­cel­la­ti e restano inal­te­ra­ti anche dopo l’in­ter­ru­zio­ne del container.

Per questo esempio create un container di dati de­no­mi­na­to “Data-Storage” che funge da volume di dati. In aggiunta, saranno uti­liz­za­ti altri due container che con­di­vi­do­no il container di dati come volume di ar­chi­via­zio­ne.

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

Ab­ban­do­na­te 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 vi­sua­liz­za­re 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 pro­ve­nien­te dal container app:

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

Ab­ban­do­na­te 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 vi­sua­liz­za­re 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
Per­for­man­ce e in­no­va­zio­ne
  • Pro­ces­so­ri al­l'a­van­guar­dia di ultima ge­ne­ra­zio­ne
  • Hardware dedicato ad alte pre­sta­zio­ni
  • Data center cer­ti­fi­ca­ti ISO

Montare volumi protetti da scrittura

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

Se de­si­de­ra­te che l’accesso a un container sia limitato soltanto alla lettura di un volume, vi basterà sem­pli­ce­men­te inserire :ro per “read-only” alle in­di­ca­zio­ni v dei volumi di container:

docker run -v /directory:/path:ro

Questo pro­ce­di­men­to può essere molto utile per la sicurezza. L’accesso read-only (di sola lettura) rap­pre­sen­ta una buona soluzione anche se volete as­si­cu­rar­vi che i file di un volume preciso siano protetti da so­vra­scrit­tu­ra o eli­mi­na­zio­ne in­vo­lon­ta­ria 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

Ab­ban­do­na­te 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 as­se­gna­te­lo 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

ri­ce­ve­re­te 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
Vai al menu prin­ci­pa­le