Torna al blog

Condivisione di dati tra container Docker

Condivisione di dati tra container Docker

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

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 :

Dovresti vedere il seguente output che indica che la creazione del volume è andata a buon fine:

Docker Volume Create

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:

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:

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 :

Dovresti vedere il seguente output:

Docker Volume Inspect

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:

All'interno del container, esegui il seguente comando per verificare che il file StepOne.txt esista:

Dovresti vedere un output simile:

Docker Volume Content 1

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:

Mentre sei all'interno del container, inserisci il seguente comando per scrivere dati nel volume e verificare che i dati siano presenti:

Di seguito è riportato l'output dei tre comandi:

Persistent Docker Volume

Successivamente, esci dal container. Quando riavvii il container utilizzando il seguente comando, the volume si collegherà automaticamente:

All'interno del container, verifica che il volume sia montato controllando l'esistenza del file StepTwo.txt utilizzando il comando:

Ecco l'output:

Docker Volume After Restart

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:

Dovresti vedere il messaggio di errore nell'output:

Error Response

Rimuoviamo il container utilizzando l'id del container mostrato nell'output con il comando docker rm:

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:

Ecco l'output:

Docker Volume List

Per rimuovere il container creato nel Passaggio 2, inserisci il seguente comando:

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:

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:

Create Docker Volume

Inserisci il seguente comando per creare il container, collegare il volume ed elencare i contenuti del volume utilizzando il comando ls:

Dovresti vedere un output simile dal comando, che è una copia del contenuto della directory /var dell'immagine di base ora disponibile nel Step3DataVolume:

Copy Docker Volume

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:

All'interno del container, esegui il seguente comando per creare un file di testo e aggiungere del testo:

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:

All'interno del container, usa il cat comando per verificare la persistenza dei dati:

Dovresti vedere il seguente output:

Container Data Sharing

Possiamo aggiungere dell'altro testo al file da Step4Container2 inserendo il seguente comando:

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:

Controlla le modifiche utilizzando il comando:

Dovresti vedere un output simile allo screenshot qui sotto:

Copied Container Data

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:

Una volta all'interno del container, puoi leggere il file di testo nel volume inserendo il seguente comando:

Read Only Mount

Tuttavia, se provi a rimuovere il file utilizzando il comando:

Riceverai un messaggio di errore nel tuo terminale come:

Read Only Error

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:

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:

Buona programmazione!

author

Pranay Kapgate

Autore · CloudSigma

Preslav Dobrev è un designer creativo presso CloudSigma, con un focus su un'identità aziendale coerente attraverso l'uso di canali di marketing tradizionali e innovativi. È abile nel fondere la visione artistica con il marketing strategico per creare narrazioni di brand di grande impatto.

Commenti

Ancora nessun commento. Scrivi il primo.