Introduzione
Docker è una piattaforma di containerizzazione che costituisce un ambiente standardizzato leggero, virtualizzato, portabile e definito dal software, che consente al software di essere eseguito in isolamento rispetto ad altri software in esecuzione sulla macchina host fisica. Docker è un componente determinante dell'aspetto di Sviluppo e Integrazione Continua (Continuous Development and Integration) dello sviluppo software. Fornendo un ambiente di runtime coerente, Docker garantisce che il software si comporti allo stesso modo indipendentemente dalla macchina host fisica su cui è distribuito. Per una panoramica approfondita dell'ecosistema Docker, dai un'occhiata a questo articolo.
Sebbene i container Docker siano autonomi, a volte hanno la necessità di condividere l'accesso ai dati o di rendere persistenti i dati su disco dopo l'arresto del container. I dati possono essere sotto forma di database, file di log o dati generati dagli utenti. È impossibile includere tali dati in un file di configurazione dell'immagine Docker, ma devono essere disponibili affinché l'applicazione funzioni come previsto. La condivisione e la persistenza dei dati nei container Docker sono gestite da Volumi Docker. I volumi Docker possono essere creati durante la creazione del container o creati successivamente e collegati ai container. In questo tutorial, discuteremo i quattro diversi modi per condividere dati tra i container.
Prerequisiti
- Configurare un server con Ubuntu 20.04 e Creare un utente non root con privilegi sudo. Accedere con l'utente non root per procedere con i passaggi seguenti.
- Installare Docker: abbiamo un tutorial su Come installare e utilizzare Docker su Ubuntu, è necessario seguire i passaggi 1, 2, 3 e 4. Questo dovrebbe funzionare per qualsiasi distribuzione Ubuntu.
Si prega di notare che, sebbene stiamo lavorando con Ubuntu 20.04, le istruzioni e i comandi per Docker funzioneranno su qualsiasi altro sistema operativo con Docker installato e l'utente sudo aggiunto al gruppo docker come spiegato nei prerequisiti sopra.
Passaggio 1: Creare volumi Docker indipendenti
Inizieremo creando volumi indipendenti che non sono correlati a nessun container Docker. Per fare ciò, abbiamo il comando docker volume create introdotto nella versione Docker 1.9. Inserire il seguente comando per creare un volume denominato Step1DataVolume :
|
1 |
docker volume create --name Step1DataVolume |
Dovresti vedere il seguente output che indica che la creazione del volume è andata a buon fine:
![]()
Ora che abbiamo un volume indipendente, possiamo creare un nuovo container dall'immagine ufficiale di Ubuntu come esempio per utilizzarlo. Inserire il seguente comando per creare il container e collegare il volume:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
In questo comando, il flag --rm eliminerà automaticamente il container dopo l'uscita. Il flag -v viene utilizzato per specificare e montare il volume. Il flag -v accetta il nome del volume, i due punti e il percorso assoluto all'interno del container in cui deve apparire il volume. Tieni presente che quando il comando viene eseguito, se le directory specificate nel percorso non esistono, verranno create. Se esistono già, il volume montato nasconderà il contenuto esistente. Per il flag -ti , la -t fornisce l'accesso al terminale, e la -i ci consente di interagire con il container tramite il terminale.
Mentre sei all'interno del container, esegui il seguente comando per scrivere alcuni dati nel volume:
|
1 |
echo "Step One Sample Text" > /Step1DataVolume/StepOne.txt |
Digita exit e premi invio per uscire dal container. Come spiegato, il container viene eliminato automaticamente all'uscita, grazie al flag --rm, tuttavia, il volume sarà ancora accessibile.
Per verificare che il volume esista ancora, puoi utilizzare il comando docker volume inspect :
|
1 |
docker volume inspect Step1DataVolume |
Dovresti vedere il seguente output:

Successivamente, creiamo un nuovo container. Innanzitutto, colleghiamo il volume e vediamo se riusciamo ad accedere al testo creato nel container precedente. Inserire il seguente comando per creare ed eseguire il container utilizzando il ubuntu immagine:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
All'interno del container, esegui il seguente comando per verificare che il file StepOne.txt esista:
|
1 |
cat /Step1DataVolume/StepOne.txt |
Dovresti vedere un output simile:

Successivamente, digita exit e premi invio per uscire dal container. In questo passaggio, hai imparato come gestire la persistenza dei dati utilizzando volumi Docker indipendenti e come collegare i volumi ai container.
Passaggio 2: Creazione di un volume Docker che rende persistenti i dati quando si elimina un container
In questo passaggio, useremo un singolo comando per creare un volume contemporaneamente alla creazione di un container. Successivamente elimineremo il container e collegheremo il volume a un nuovo container. Il comando è simile a quello utilizzato nel Passaggio 1, tuttavia, aggiungiamo un flag --name, per specificare un nome per il container:
|
1 |
docker run -ti --name=Step2Container1 -v Step2DataVolume:/Step2DataVolume ubuntu |
Mentre sei all'interno del container, inserisci il seguente comando per scrivere dati nel volume e verificare che i dati siano presenti:
|
1 2 3 |
echo "Step Two Sample Text" > /Step2DataVolume/StepTwo.txt cat /Step2DataVolume/StepTwo.txt |
Di seguito è riportato l'output dei tre comandi:

Successivamente, esci dal container. Quando riavvii il container utilizzando il seguente comando, the volume si collegherà automaticamente:
|
1 |
docker start -ai Step2Container1 |
All'interno del container, verifica che il volume sia montato controllando l'esistenza del file StepTwo.txt utilizzando il comando:
|
1 |
cat /Step2DataVolume/StepTwo.txt |
Ecco l'output:

Ora puoi uscire dal container. Docker impedisce la rimozione di un volume a cui fa riferimento un altro container. Puoi provare a rimuovere il volume utilizzando il comando:
|
1 |
docker volume rm Step2DataVolume |
Dovresti vedere il messaggio di errore nell'output:
![]()
Rimuoviamo il container utilizzando l'id del container mostrato nell'output con il comando docker rm:
|
1 |
docker rm e3932e65e484bbf4524ca8de1b1dd99c4e92c12f92a9d6b0567a643d0aa6bb2d |
Sostituisci l' container id evidenziato con l' id del tuo container mostrato nel terminale. Il comando rimuove il container, ma non rimuove il volume che abbiamo creato. Puoi elencare i volumi disponibili utilizzando il comando docker volume ls per verificare:
|
1 |
docker volume ls |
Ecco l'output:

Per rimuovere il container creato nel Passaggio 2, inserisci il seguente comando:
|
1 |
docker volume rm Step2DataVolume |
In questo passaggio, sei stato in grado di creare un volume Docker contemporaneamente alla creazione di un container. Vediamo come possiamo creare un volume da una directory esistente contenente dati.
Passaggio 3: Creazione di un volume Docker da una directory esistente con dati
Se desideri copiare dati in un volume, puoi creare un volume durante la creazione di un container e fornire il percorso di una directory contenente i dati nell'immagine di base. Nel comando seguente, creiamo un container e aggiungiamo un volume di dati in /var, che è una directory contenente dati nell'immagine di base:
|
1 |
docker run -ti --rm -v Step3DataVolume:/var ubuntu |
Quando il comando viene eseguito, il contenuto della directory /var dell'immagine di base verrà copiato nel volume. Il volume può essere collegato a un nuovo container. Successivamente, esci dal container:

Inserisci il seguente comando per creare il container, collegare il volume ed elencare i contenuti del volume utilizzando il comando ls:
|
1 |
docker run --rm -v Step3DataVolume:/Step3DataVolume ubuntu ls Step3DataVolume |
Dovresti vedere un output simile dal comando, che è una copia del contenuto della directory /var dell'immagine di base ora disponibile nel Step3DataVolume:

Mentre si monta la /var directory come abbiamo fatto in questo esempio potrebbe essere poco pratico, ci aiuta a capire che è possibile montare qualsiasi directory creata nelle immagini personalizzate su un volume Docker per rendere i dati disponibili ad altri container.
Passo 4: Condivisione dei dati tra più container Docker
Nella maggior parte dei casi, vorrai che più container accedano ai dati da un unico volume Docker. Negli esempi precedenti, abbiamo collegato un volume a un solo container. Ora imparerai come collegare un volume a più container. Sebbene sia possibile farlo facilmente, Docker non gestisce il blocco dei file (file locking). Per più container che scrivono sullo stesso volume, è necessario progettare individualmente le applicazioni in esecuzione in tali container per gestire la scrittura su archivi dati condivisi al fine di evitare la corruzione dei dati.
- Crea Step4Container1 e Step4DataVolume
Usa il docker run comando con il --name flag per creare un container con nome:
|
1 |
docker run -ti --name=Step4Container1 -v Step4DataVolume:/Step4DataVolume ubuntu |
All'interno del container, esegui il seguente comando per creare un file di testo e aggiungere del testo:
|
1 |
echo "Step Four Sample Text" > /Step4DataVolume/StepFour.txt |
Successivamente, esci dal container e torna all'ambiente host. Ora vogliamo creare un altro container e montare i volumi da Step4Container1 su di esso.
- Crea Step4Container2 e collega i volumi dal container Step4Container1
Esegui il seguente comando per creare Step4Container2 e montare i volumi da Step4Container1:
|
1 |
docker run -ti --name=Step4Container2 --volumes-from Step4Container1 ubuntu |
All'interno del container, usa il cat comando per verificare la persistenza dei dati:
|
1 |
cat /Step4DataVolume/StepFour.txt |
Dovresti vedere il seguente output:

Possiamo aggiungere dell'altro testo al file da Step4Container2 inserendo il seguente comando:
|
1 |
echo "We are appending text while inside Step4Container2" >> /Step4DataVolume/StepFour.txt |
Esci dal container dopo questo e torneremo a Step4Container1 per verificare se i dati sono ancora presenti.
- Verificare le modifiche apportate nel volume Docker tra diversi container
Per visualizzare le modifiche, riavvierai prima il Step4Container1 utilizzando il comando:
|
1 |
docker start -ai Step4Container1 |
Controlla le modifiche utilizzando il comando:
|
1 |
cat /Step4DataVolume/StepFour.txt |
Dovresti vedere un output simile allo screenshot qui sotto:

Una volta verificato che entrambi i container possono leggere e scrivere dati sullo stesso volume, puoi uscire dal container. Come menzionato, Docker non gestisce il blocco dei file (file locking), è compito della logica dell'applicazione in esecuzione all'interno dei container gestire l'accesso in lettura-scrittura agli archivi dati condivisi. Docker consente di montare i volumi come sola lettura per prevenire la corruzione accidentale dei dati da parte di container che richiedono solo l'accesso in sola lettura aggiungendo :ro come mostrato nel prossimo esempio.
- Montare un volume su un container Docker come sola lettura
Per questo esempio, creeremo un container chiamato Step4Container3. Nel comando di creazione, montiamo i volumi da Step4Container1 e aggiungiamo :ro per specificare che questo container ha accesso in sola lettura ma non può scrivere sul volume. Esegui il seguente comando nel tuo terminale:
|
1 |
docker run -ti --name=Step4Container3 --volumes-from Step4Container1:ro ubuntu |
Una volta all'interno del container, puoi leggere il file di testo nel volume inserendo il seguente comando:
|
1 |
cat /Step4DataVolume/StepFour.txt |

Tuttavia, se provi a rimuovere il file utilizzando il comando:
|
1 |
rm /Step4DataVolume/StepFour.txt |
Riceverai un messaggio di errore nel tuo terminale come:
![]()
Una volta verificati i permessi di lettura-scrittura, puoi uscire dal container. Se desideri ripulire i container e il volume creati in questo tutorial, esegui i seguenti comandi:
|
1 2 3 |
docker rm Step4Container1 Step4Container2 Step4Container3 docker volume rm Step4DataVolume |
In questo passaggio, hai imparato come condividere dati tra più container utilizzando i volumi Docker, oltre a montare i volumi di dati sui container in modalità di sola lettura.
Conclusione
In questo tutorial, hai creato alcuni volumi Docker e hai imparato a condividere dati tra i container Docker. Nel gestire la condivisione dei dati tra i container, abbiamo notato che la logica della singola applicazione all'interno del container deve gestire il blocco dei file (file locking) per prevenire la corruzione dei dati durante la scrittura su archivi di dati condivisi, poiché Docker non ha un'implementazione per la gestione del blocco dei file.
Per ulteriori risorse sull'utilizzo di Docker, potresti voler consultare altri tutorial sul nostro blog:
- Come condividere dati tra un container Docker e un host
- Ripulire le risorse Docker – Immagini, container e volumi
- Distribuire Laravel, Nginx e MySQL con Docker Compose
- Installazione e configurazione di Docker su CentOS 7
Buona programmazione!
Commenti
Ancora nessun commento. Scrivi il primo.