Ú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
- Nastavte server s operačným systémom Ubuntu 20.04 a Vytvorte používateľa bez oprávnení root s privilégiami sudo. Prihláste sa ako používateľ bez oprávnení root a pokračujte nasledujúcimi krokmi.
- Nainštalujte Docker - máme návod na Ako nainštalovať a prevádzkovať Docker na Ubuntu, musíte postupovať podľa krokov 1, 2, 3 a 4. To by malo fungovať pre akúkoľvek distribúciu Ubuntu.
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 :
|
1 |
docker volume create --name Step1DataVolume |
Mali by ste vidieť nasledujúci výstup indikujúci, že vytvorenie zväzku bolo úspešné:
![]()
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:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
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:
|
1 |
echo "Step One Sample Text" > /Step1DataVolume/StepOne.txt |
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 :
|
1 |
docker volume inspect Step1DataVolume |
Mali by ste vidieť nasledujúci výstup:

Ď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:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
Vo vnútri kontajnera spustite nasledujúci príkaz, aby ste overili, že StepOne.txt súbor existuje:
|
1 |
cat /Step1DataVolume/StepOne.txt |
Mali by ste vidieť podobný výstup:

Ď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:
|
1 |
docker run -ti --name=Step2Container1 -v Step2DataVolume:/Step2DataVolume ubuntu |
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ú:
|
1 2 3 |
echo "Step Two Sample Text" > /Step2DataVolume/StepTwo.txt cat /Step2DataVolume/StepTwo.txt |
Nižšie je výstup týchto troch príkazov:

Ďalej opustite kontajner. Keď kontajner reštartujete pomocou nasledujúceho príkazu, zväzok sa pripojí automaticky:
|
1 |
docker start -ai Step2Container1 |
Vo vnútri kontajnera overte, že je zväzok pripojený, skontrolovaním existencie súboru StepTwo.txt pomocou príkazu:
|
1 |
cat /Step2DataVolume/StepTwo.txt |
Tu je výstup:

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:
|
1 |
docker volume rm Step2DataVolume |
Vo výstupe by ste mali vidieť chybové hlásenie:
![]()
Odstráňme kontajner pomocou ID kontajnera zobrazeného vo výstupe pomocou príkazu docker rm:
|
1 |
docker rm e3932e65e484bbf4524ca8de1b1dd99c4e92c12f92a9d6b0567a643d0aa6bb2d |
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 :
|
1 |
docker volume ls |
Tu je výstup:

Na odstránenie kontajnera vytvoreného v Kroku 2, zadajte nasledujúci príkaz:
|
1 |
docker volume rm Step2DataVolume |
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:
|
1 |
docker run -ti --rm -v Step3DataVolume:/var ubuntu |
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:

Zadaním nasledujúceho príkazu vytvorte kontajner, pripojte zväzok a vypíšte obsah zväzku pomocou príkazu ls:
|
1 |
docker run --rm -v Step3DataVolume:/Step3DataVolume ubuntu ls Step3DataVolume |
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:

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:
|
1 |
docker run -ti --name=Step4Container1 -v Step4DataVolume:/Step4DataVolume ubuntu |
Vo vnútri kontajnera spustite nasledujúci príkaz na vytvorenie textového súboru a pridanie textu:
|
1 |
echo "Step Four Sample Text" > /Step4DataVolume/StepFour.txt |
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:
|
1 |
docker run -ti --name=Step4Container2 --volumes-from Step4Container1 ubuntu |
Vo vnútri kontajnera použite príkaz cat na overenie trvalosti údajov:
|
1 |
cat /Step4DataVolume/StepFour.txt |
Mali by ste vidieť nasledujúci výstup:

Do súboru môžeme pridať ďalší text z Step4Container2 zadaním nasledujúceho príkazu:
|
1 |
echo "We are appending text while inside Step4Container2" >> /Step4DataVolume/StepFour.txt |
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:
|
1 |
docker start -ai Step4Container1 |
Skontrolujte zmeny pomocou príkazu:
|
1 |
cat /Step4DataVolume/StepFour.txt |
Mali by ste vidieť výstup podobný snímke obrazovky nižšie:

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:
|
1 |
docker run -ti --name=Step4Container3 --volumes-from Step4Container1:ro ubuntu |
Po vstupe do kontajnera môžete prečítať textový súbor vo zväzku zadaním nasledujúceho príkazu:
|
1 |
cat /Step4DataVolume/StepFour.txt |

Avšak, ak sa pokúsite súbor odstrániť pomocou príkazu:
|
1 |
rm /Step4DataVolume/StepFour.txt |
Vo svojom termináli dostanete chybové hlásenie ako:
![]()
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:
|
1 2 3 |
docker rm Step4Container1 Step4Container2 Step4Container3 docker volume rm Step4DataVolume |
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:
- Ako zdieľať dáta medzi kontajnerom Docker a hostiteľom
- Vyčistenie zdrojov Docker – obrazy, kontajnery a zväzky
- Nasadenie Laravel, Nginx a MySQL pomocou Docker Compose
- Inštalácia a nastavenie Dockeru na CentOS 7
Príjemnú prácu!
Komentáre
Zatiaľ žiadne komentáre. Buďte prvý.