Späť na blog

Zdieľanie dát medzi Docker kontajnermi

Zdieľanie dát medzi Docker kontajnermi

Úvod

Docker je kontajnerová platforma, čo je ľahké, virtualizované, prenosné, softvérovo definované štandardizované prostredie, ktoré umožňuje softvéru bežať v izolácii od iného softvéru bežiaceho na fyzickom hostiteľskom počítači. Docker je definujúcim komponentom aspektu Continuous Development and Integration vo vývoji softvéru. Poskytnutím konzistentného behového prostredia Docker zaisťuje, že softvér sa správa rovnako bez ohľadu na fyzický hostiteľský počítač, na ktorom je nasadený. Pre dôkladný prehľad ekosystému Docker si pozrite tento článok.

Hoci sú kontajnery Docker samostatné, niekedy potrebujú zdieľať prístup k dátam alebo uchovávať dáta na disku aj po zastavení kontajnera. Dáta môžu byť vo forme databáz, logovacích súborov alebo dát generovaných používateľmi. Takéto dáta nie je možné zahrnúť do konfiguračného súboru obrazu Docker, ale musia byť k dispozícii, aby vaša aplikácia fungovala podľa očakávania. Zdieľanie a uchovávanie dát v kontajneroch Docker riešia Docker Volumes. Docker Volumes môžu byť vytvorené počas vytvárania kontajnera alebo vytvorené neskôr a pripojené ku kontajnerom. V tomto návode budeme diskutovať o štyroch rôznych spôsoboch zdieľania dát medzi kontajnermi.

Požiadavky

Upozorňujeme, že hoci pracujeme s Ubuntu 20.04, pokyny a príkazy pre Docker budú fungovať na akomkoľvek inom operačnom systéme s nainštalovaným Dockerom a používateľom sudo pridaným do skupiny docker, ako je vysvetlené v požiadavkách vyššie.

Krok 1: Vytvorenie nezávislých Docker Volumes

Začneme vytvorením nezávislých zväzkov, ktoré nesúvisia so žiadnym kontajnerom Docker. Na dosiahnutie tohto cieľa máme príkaz docker volume create ktorý bol predstavený vo verzii Docker 1.9. Zadaním nasledujúceho príkazu vytvorte zväzok s názvom Step1DataVolume :

Mali by ste vidieť nasledujúci výstup indikujúci, že vytvorenie zväzku bolo úspešné:

Docker Volume Create

Teraz, keď máme nezávislý zväzok, môžeme ako príklad vytvoriť nový kontajner z oficiálneho obrazu Ubuntu a použiť ho. Zadaním nasledujúceho príkazu vytvorte kontajner a pripojte zväzok:

V tomto príkaze príznak --rm automaticky vymaže kontajner po ukončení. Príznak -v sa používa na špecifikovanie a pripojenie zväzku. Príznak -v preberá názov zväzku, dvojbodku a absolútnu cestu vo vnútri kontajnera, kde sa má zväzok objaviť. Majte na pamäti, že ak pri spustení príkazu zadané adresáre v ceste neexistujú, vytvoria sa. Ak už existujú, pripojený zväzok skryje existujúci obsah. Pre príznak -ti príznak -t poskytuje prístup k terminálu a -i nám umožňuje interagovať s kontajnerom cez terminál.

Keď ste vo vnútri kontajnera, spustením nasledujúceho príkazu zapíšte nejaké dáta do zväzku:

Napíšte exit a stlačte enter na ukončenie kontajnera. Ako už bolo vysvetlené, kontajner sa po ukončení automaticky vymaže vďaka príznaku --rm avšak zväzok bude stále prístupný.

Ak chcete overiť, že zväzok stále existuje, môžete použiť príkaz docker volume inspect :

Mali by ste vidieť nasledujúci výstup:

Docker Volume Inspect

Ďalej vytvorme nový kontajner. Najprv pripojte zväzok a zistite, či máme prístup k textu, ktorý sme vytvorili v predchádzajúcom kontajneri. Zadaním nasledujúceho príkazu vytvorte a spustite kontajner pomocou ubuntu obraz:

Vo vnútri kontajnera spustite nasledujúci príkaz, aby ste overili, že StepOne.txt súbor existuje:

Mali by ste vidieť podobný výstup:

Docker Volume Content 1

Ďalej napíšte exit a stlačte enter pre opustenie kontajnera. V tomto kroku ste sa naučili, ako riešiť perzistenciu dát pomocou nezávislých zväzkov Docker a ako pripájať zväzky ku kontajnerom.

Krok 2: Vytvorenie zväzku Docker, ktorý uchováva dáta aj po vymazaní kontajnera

V tomto kroku použijeme jediný príkaz na vytvorenie zväzku súčasne s vytvorením kontajnera. Potom kontajner vymažeme a zväzok pripojíme k novému kontajneru. Príkaz je podobný tomu, ktorý bol použitý v Kroku 1, avšak pridáme jeden príznak --name, na zadanie názvu kontajnera:

Keď ste vo vnútri kontajnera, zadajte nasledujúci príkaz na zápis dát do zväzku a overte, že dáta tam sú:

Nižšie je výstup týchto troch príkazov:

Persistent Docker Volume

Ďalej opustite kontajner. Keď kontajner reštartujete pomocou nasledujúceho príkazu, zväzok sa pripojí automaticky:

Vo vnútri kontajnera overte, že je zväzok pripojený, skontrolovaním existencie súboru StepTwo.txt pomocou príkazu:

Tu je výstup:

Docker Volume After Restart

Teraz môžete kontajner opustiť. Docker zabraňuje odstráneniu zväzku, na ktorý odkazuje iný kontajner. Môžete sa pokúsiť odstrániť zväzok pomocou príkazu:

Vo výstupe by ste mali vidieť chybové hlásenie:

Error Response

Odstráňme kontajner pomocou ID kontajnera zobrazeného vo výstupe pomocou príkazu docker rm:

Nahraďte zvýraznené container id za id vášho kontajnera zobrazené vo vašom termináli. Príkaz odstráni kontajner, ale neodstráni zväzok, ktorý sme vytvorili. Pre overenie môžete zobraziť zoznam dostupných zväzkov pomocou príkazu docker volume ls :

Tu je výstup:

Docker Volume List

Na odstránenie kontajnera vytvoreného v Kroku 2, zadajte nasledujúci príkaz:

V tomto kroku sa vám podarilo vytvoriť zväzok Docker súčasne s vytvorením kontajnera. Pozrime sa, ako môžeme vytvoriť zväzok z existujúceho adresára s dátami.

Krok 3: Vytvorenie zväzku Docker z existujúceho adresára s dátami

Ak chcete skopírovať dáta do zväzku, môžete vytvoriť zväzok počas vytvárania kontajnera a zadať cestu k adresáru obsahujúcemu dáta v základnom obraze. V príkaze nižšie vytvoríme kontajner a pridáme dátový zväzok na /var, čo je adresár obsahujúci dáta v základnom obraze:

Po spustení príkazu sa obsah z adresára /var základného obrazu skopíruje do zväzku. Zväzok je možné pripojiť k novému kontajneru. Ďalej opustite kontajner:

Create Docker Volume

Zadaním nasledujúceho príkazu vytvorte kontajner, pripojte zväzok a vypíšte obsah zväzku pomocou príkazu ls:

Mali by ste vidieť podobný výstup z príkazu, čo je kópia obsahu adresára /var zo základného obrazu, ktorý je teraz k dispozícii v Step3DataVolume:

Copy Docker Volume

Hoci pripojenie /var adresára, ako sme to urobili v tomto príklade, môže byť nepraktické, pomáha nám to pochopiť, že do zväzku Docker môžete pripojiť akýkoľvek adresár vytvorený vo vašich vlastných obrazoch, aby boli údaje dostupné pre ostatné kontajnery.

Krok 4: Zdieľanie údajov medzi viacerými kontajnermi Docker

Vo väčšine prípadov budete chcieť, aby k údajom z jedného zväzku Docker pristupovalo viacero kontajnerov. V predchádzajúcich príkladoch sme zväzok pripojili iba k jednému kontajneru. Teraz sa naučíte, ako pripojiť zväzok k viacerým kontajnerom. Aj keď to môžete dosiahnuť jednoducho, Docker nerieši uzamykanie súborov. Ak viacero kontajnerov zapisuje do rovnakého zväzku, musíte aplikácie bežiace v týchto kontajneroch individuálne navrhnúť tak, aby zvládali zápis do zdieľaných dátových úložísk, aby sa zabránilo poškodeniu údajov.

  • Vytvorte Step4Container1 a Step4DataVolume

Použite docker run príkaz s príznakom --name na vytvorenie pomenovaného kontajnera:

Vo vnútri kontajnera spustite nasledujúci príkaz na vytvorenie textového súboru a pridanie textu:

Potom ukončite kontajner a vráťte sa do hostiteľského prostredia. Teraz chceme vytvoriť ďalší kontajner a pripojiť k nemu zväzky z Step4Container1 .

  • Vytvorte Step4Container2 a pripojte zväzky z kontajnera Step4Container1

Spustením nasledujúceho príkazu vytvorte Step4Container2 a pripojte zväzky z Step4Container1:

Vo vnútri kontajnera použite príkaz cat na overenie trvalosti údajov:

Mali by ste vidieť nasledujúci výstup:

Container Data Sharing

Do súboru môžeme pridať ďalší text z Step4Container2 zadaním nasledujúceho príkazu:

Potom ukončite kontajner a vrátime sa do Step4Container1 , aby sme skontrolovali, či sú údaje stále prítomné.

  • Overenie zmien vykonaných vo zväzku Docker medzi rôznymi kontajnermi

Ak chcete zobraziť zmeny, najprv reštartujte Step4Container1 pomocou príkazu:

Skontrolujte zmeny pomocou príkazu:

Mali by ste vidieť výstup podobný snímke obrazovky nižšie:

Copied Container Data

Keď overíte, že oba kontajnery môžu čítať a zapisovať údaje do rovnakého zväzku, môžete teraz kontajner ukončiť. Ako už bolo spomenuté, Docker nerieši uzamykanie súborov, je to úlohou vašej aplikačnej logiky bežiacej vo vnútri kontajnerov, ktorá by mala spracovávať prístup na čítanie a zápis do zdieľaných dátových úložísk. Docker umožňuje pripojiť zväzky len na čítanie, aby sa zabránilo náhodnému poškodeniu údajov kontajnermi, ktoré vyžadujú iba prístup na čítanie, pridaním :ro , ako je znázornené v nasledujúcom príklade.

  • Pripojenie zväzku k Docker kontajneru len na čítanie

Pre tento príklad vytvoríme kontajner s názvom Step4Container3. V príkaze na vytvorenie pripojíme zväzky z Step4Container1 a pridáme :ro na špecifikovanie, že tento kontajner má prístup iba na čítanie, ale nemôže do zväzku zapisovať. Spustite nasledujúci príkaz vo vašom termináli:

Po vstupe do kontajnera môžete prečítať textový súbor vo zväzku zadaním nasledujúceho príkazu:

Read Only Mount

Avšak, ak sa pokúsite súbor odstrániť pomocou príkazu:

Vo svojom termináli dostanete chybové hlásenie ako:

Read Only Error

Po overení oprávnení na čítanie a zápis môžete kontajner opustiť. Ak chcete vyčistiť kontajnery a zväzok vytvorené v tomto návode, spustite nasledujúce príkazy:

V tomto kroku ste sa naučili, ako zdieľať dáta medzi viacerými kontajnermi pomocou zväzkov Docker, ako aj pripájať dátové zväzky ku kontajnerom len na čítanie.

Záver

V tomto návode ste vytvorili niekoľko zväzkov Docker a naučili ste sa, ako zdieľať dáta medzi kontajnermi Docker. Pri riešení zdieľania dát medzi kontajnermi sme si všimli, že individuálna aplikačná logika vo vnútri kontajnera musí riešiť uzamykanie súborov, aby sa zabránilo poškodeniu dát pri zápise do zdieľaných dátových úložísk, keďže Docker nemá žiadnu implementáciu na riešenie uzamykania súborov.

Ďalšie zdroje o využívaní Dockeru nájdete v ďalších návodoch na našom blogu:

Príjemnú prácu!

author

Pranay Kapgate

Autor · CloudSigma

Preslav Dobrev je kreatívny dizajnér v spoločnosti CloudSigma, ktorý sa zameriava na konzistentnú firemnú identitu prostredníctvom tradičných a inovatívnych marketingových kanálov. Dokáže brilantne spájať umeleckú víziu so strategickým marketingom, čím vytvára pôsobivé príbehy značky.

Komentáre

Zatiaľ žiadne komentáre. Buďte prvý.