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:
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:
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
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.