Gestire i volumi Docker utilizzando Docker Compose

Gestire i volumi Docker utilizzando Docker Compose

Scopo dei volumi Docker

I contenitori Docker sono pensati per essere una sostituzione drop-in per le applicazioni. Sono pensati per essere usa e getta da sostituire. Questa proprietà è, infatti, la pietra angolare di molte pipeline CI/CD. Quando viene apportata una modifica al tuo repository di origine che innesca una catena di eventi. Le immagini Docker vengono create automaticamente, testate e (a volte) addirittura distribuite direttamente in produzione, sostituendo le versioni precedenti perfettamente.

Ma ci sono spesso dati persistenti che devono essere conservati tra le diverse versioni della tua applicazione. Esempi includono database, file di configurazione per app, file di registro e credenziali di sicurezza come chiavi API e certificati TLS.

Per consentire a tutti questi dati di persistere, utilizzeremo i volumi Docker che sono solo parti del filesystem di Docker Host (una directory o un dispositivo a blocchi formattato con un filesystem) che può essere montato all'interno di un contenitore in qualsiasi posizione desiderata del filesystem del contenitore del contenitore.

Impostare

Per garantire che siamo tutti sulla stessa pagina, ecco la versione di Docker Runtime e Docker-Opse che sto usando:

  1. Docker versione 18.09.2, build 6247962
  2. Docker-compose versione 1.23.2, build 1110ad01
  3. Comporre il file versione 3: funziona con 1.13.0 e sopra

Esempio: ospitare un sito Web Ghost CMS

Lavorare con compose è davvero diretto. Scrivi un file YAML che descrive la distribuzione e quindi si esegue distribuiscilo utilizzando la CLI Docker-Opse. Cominciamo con una semplice distribuzione CMS fantasma.

Crea una directory chiamata composesamples e al suo interno crea un file chiamato docker-compose.Yaml

$ mkdir compositi
$ CD compositi
Contenuto di Docker-Opse.Yaml:
Versione: "3.0 "
Servizi:
ragnatela:
Immagine: Ghost: ultimo
Porte:
- "2368: 2368"
Volumi:
- CMS-Content:/var/lib/ghost/content
Volumi:
CMS-Content:

Questo file di composizione dichiara un singolo servizio che è il Web che esegue l'ultima immagine di Ghost CMS dal repository ufficiale di Docker Hub. La porta esposta è 2368 (ne parleremo più tardi) e un volume è quindi un volume chiamato CMS-Content montato su/var/lib/ghost/contenuti che puoi leggere sulla tua particolare applicazione e le sue sfumature cercando le app documentazione. Ad esempio, la porta predefinita del contenitore Ghost 2368 e il punto di montaggio predefinito per il contenuto del sito Web/var/lib/ghost/contenuti sono entrambi menzionano che la documentazione ufficiale del contenitore.

Se stai scrivendo una nuova applicazione per conto tuo, pensa a tutti i dati persistenti a cui dovrà accedere e di conseguenza impostare i punti di montaggio per i volumi Docker.

Per testare che il volume persistente funziona, prova questo:

  1. Apri un browser e inserisci l'IP del tuo host Docker, ovvero http: // Dockerhostip: 2368/Ghost (o semplicemente http: // localhost: 2368/ghost) e crea un account amministratore. Modifica uno dei post preesistenti e salva.
  2. Elenca tutti i componenti Docker in esecuzione utilizzando i comandi: Docker PS, Docker Network LS, Docker Volume LS
  3. Nella stessa directory del file di compositore, eseguire il comando $ docker-compone e ora puoi elencare tutti i contenitori Docker, la rete e i volumi. È interessante notare che noterai che mentre il contenitore e la rete creati da docker-compose vengono rimossi, il volume di Docker è ancora intatto.
  4. Esegui Docker -Opse UP -D e noterai che il post modificato è proprio dove l'hai lasciato, anche le credenziali di accesso di amministrazione possono essere utilizzate di nuovo e non devi creare un nuovo account amministratore.
  5. Rimuovere le sezioni con il volume sia dal servizio: Web: sezione e dalla sezione principale e ora se si ripete i tre passaggi precedenti, lo noterai.

Sintassi e verbosità

La sintassi per introdurre un volume usando docker-compose è piuttosto semplice. Inizi con qualcosa di simile a un contenitore e menzioni il nome del volume che vuoi montare al suo interno. Se non menzioni un nome, puoi scegliere una sintassi pigro come sotto:

Versione: "3.0 "
Servizi:
ragnatela:
Immagine: Ghost: ultimo
Porte:
- "2368: 2368"
Volumi:
- /var/lib/ghost/content

Se vuoi essere un po 'più verboso, dovrai menzionare il volume Docker come definizione di livello superiore:

Versione: "3.0 "
Servizi:
ragnatela:
Immagine: Ghost: ultimo
Porte:
- "2368: 2368"
Volumi:
- CMS-Content:/var/lib/ghost/content
## Definisci che il contenuto di CMS è in realtà un volume.
Volumi:
CMS-Content:

Sebbene quest'ultima versione richieda di digitare di più, è più verbosio. Scegli il nome pertinente per i tuoi volumi, in modo che i tuoi colleghi possano capire cosa è stato fatto. Puoi andare ancora oltre e menzionare il tipo di volume (più su questo in seguito) e indicare la sorgente e il bersaglio.

Volumi:
- Tipo: volume
Fonte: CMS-DATA
Target:/var/lib/ghost/content

Montaggi di legame

I montaggi di bind sono parti del file system host che possono essere montate direttamente all'interno del contenitore Docker. Per introdurre un supporto di bind, menziona semplicemente la directory host che si desidera condividere e il punto di montaggio all'interno del contenitore Docker dove dovrebbe essere montato:

Volumi:
- /casa//progetti/fantasma:/var/lib/ghost/content

Ho usato il percorso/home // progetti/fantasma come solo un esempio, puoi usare qualsiasi percorso sul tuo host Docker desideri, a condizione che tu abbia accesso ad esso, ovviamente.

Puoi anche usare percorsi relativi usando $ PWD o ~, ma ciò può facilmente portare a bug e disastri negli scenari del mondo reale in cui si collaborano con più altri umani con il proprio ambiente Linux. Il rovescio della medaglia, a volte i percorsi relativi sono effettivamente più facili da gestire. Ad esempio, se il tuo repository git dovrebbe anche essere il tuo supporto di bind usando DOT (.) per simboleggiare la directory corrente potrebbe benissimo essere l'ideale.

Nuovi utenti che clonano il repository e lo clonano ovunque nel loro sistema host, e eseguono un docker composti e ottengono praticamente lo stesso risultato.

Se si utilizza una sintassi più verbosa, questo è ciò che il tuo file di composizione conterrà:

Volumi:
- Tipo: Bind
Fonte:/home/utente/progetti/fantasma
Target:/var/lib/ghost/content

Conclusione

Per organizzare le tue applicazioni in modo tale che l'app sia separata dai dati può essere molto utile. I volumi sono modi sani per realizzare proprio questo. A condizione che siano backup e sicuri, è possibile utilizzare liberamente per utilizzare i contenitori come ambienti usa e getta, anche in produzione!

L'aggiornamento da una versione dell'app alla successiva o utilizzando versioni diverse dell'app per i test A/B può diventare molto semplificato fintanto che il modo in cui i dati sono archiviati o accessibili è lo stesso per entrambe le versioni.