Úvod
Docker je kontejnerová platforma, což je lehké, virtualizované, přenosné, softwarově definované standardizované prostředí, které umožňuje softwaru běžet v izolaci od ostatního softwaru běžícího na fyzickém hostitelském stroji. Docker je definující komponentou aspektu průběžného vývoje a integrace (Continuous Development and Integration) vývoje softwaru. Poskytnutím konzistentního běhového prostředí Docker zajišťuje, že se software chová stejně bez ohledu na fyzický hostitelský stroj, na kterém je nasazen. Pro důkladný přehled ekosystému Docker se podívejte na tento článek.
Ačkoli jsou kontejnery Docker soběstačné, někdy potřebují sdílet přístup k datům nebo data uchovávat na disku i po zastavení kontejneru. Data mohou mít podobu databází, logovacích souborů nebo uživatelsky generovaných dat. Taková data nelze zahrnout do konfiguračního souboru obrazu Dockeru, ale musí být k dispozici, aby vaše aplikace běžela podle očekávání. Sdílení a uchovávání dat v kontejnerech Docker je řešeno pomocí Docker Volumes. Docker Volumes lze vytvořit během vytváření kontejneru nebo je vytvořit později a připojit ke kontejnerům. V tomto návodu probereme čtyři různé způsoby sdílení dat mezi kontejnery.
Požadavky
- Nastavte server se systémem Ubuntu 20.04 a vytvořte uživatele bez oprávnění root s právy sudo. Přihlaste se jako uživatel bez oprávnění root a pokračujte následujícími kroky.
- Nainstalujte Docker – máme návod na Jak nainstalovat a provozovat Docker na Ubuntu, musíte postupovat podle kroků 1, 2, 3 a 4. To by mělo fungovat pro jakoukoli distribuci Ubuntu.
Upozorňujeme, že ačkoli pracujeme s Ubuntu 20.04, pokyny a příkazy pro Docker budou fungovat na jakémkoli jiném operačním systému s nainstalovaným Dockerem a uživatelem sudo přidaným do skupiny docker, jak je vysvětleno v požadavcích výše.
Krok 1: Vytvoření nezávislých Docker Volumes
Začneme vytvořením nezávislých svazků, které nesouvisí s žádným kontejnerem Docker. K tomu slouží příkaz docker volume create který byl představen ve verzi Docker 1.9. Zadáním následujícího příkazu vytvořte svazek s názvem Step1DataVolume :
|
1 |
docker volume create --name Step1DataVolume |
Měli byste vidět následující výstup indikující, že vytvoření svazku bylo úspěšné:
![]()
Nyní, když máme nezávislý svazek, můžeme jako příklad vytvořit nový kontejner z oficiálního obrazu Ubuntu a použít jej. Zadáním následujícího příkazu vytvořte kontejner a připojte svazek:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
In this command, the --rm flag will automatically delete the container after exiting. The -v flag is used to specify and mount the volume. The -v flag takes the name of the volume, a full colon, and the absolute path inside the container where the volume should appear. Keep in mind that when the command runs, if the specified directories in the path do not exist, they will be created. If they already exist, the mounted volume will hide the existing content. For the -ti flag, the -t gives access to the terminal, and the -i allows us to interact with the container through the terminal.
While inside the container, run the following command to write some data to the volume:
|
1 |
echo "Step One Sample Text" > /Step1DataVolume/StepOne.txt |
Type exit and press enter to exit the container. As explained, the container is automatically deleted when you exit, thanks to the --rm flag, however, the volume will still be accessible.
To verify that the volume still exists, you can use the docker volume inspect command:
|
1 |
docker volume inspect Step1DataVolume |
You should see the following output:

Next, let’s create a new container. First, attach the volume and see if we can access the text we created in the previous container. Enter the following command to create and run the container using the ubuntu obraz:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
Uvnitř kontejneru spusťte následující příkaz, abyste ověřili, že soubor StepOne.txt existuje:
|
1 |
cat /Step1DataVolume/StepOne.txt |
Měli byste vidět podobný výstup:

Dále napište exit a stiskněte enter pro ukončení kontejneru. V tomto kroku jste se naučili, jak zacházet s perzistencí dat pomocí nezávislých svazků Dockeru a jak svazky připojovat ke kontejnerům.
Krok 2: Vytvoření svazku Dockeru, který uchovává data i po smazání kontejneru
V tomto kroku použijeme jediný příkaz k vytvoření svazku současně s vytvořením kontejneru. Poté kontejner smažeme a svazek připojíme k novému kontejneru. Příkaz je podobný tomu, který byl použit v Kroku 1, přidáme však jeden příznak --name, abychom specifikovali název kontejneru:
|
1 |
docker run -ti --name=Step2Container1 -v Step2DataVolume:/Step2DataVolume ubuntu |
Zatímco jste uvnitř kontejneru, zadejte následující příkaz pro zápis dat do svazku a ověřte, že tam data jsou:
|
1 2 3 |
echo "Step Two Sample Text" > /Step2DataVolume/StepTwo.txt cat /Step2DataVolume/StepTwo.txt |
Níže je výstup těchto tří příkazů:

Dále ukončete kontejner. Když kontejner restartujete pomocí následujícího příkazu, svazek se připojí automaticky:
|
1 |
docker start -ai Step2Container1 |
Uvnitř kontejneru ověřte, že je svazek připojen, zkontrolováním existence souboru StepTwo.txt pomocí příkazu:
|
1 |
cat /Step2DataVolume/StepTwo.txt |
Zde je výstup:

Nyní můžete kontejner ukončit. Docker zabraňuje odstranění svazku, na který odkazuje jiný kontejner. Můžete zkusit svazek odstranit pomocí příkazu:
|
1 |
docker volume rm Step2DataVolume |
Ve výstupu byste měli vidět chybovou zprávu:
![]()
Let’s remove the container using the container id shown in the output with the docker rm command:
|
1 |
docker rm e3932e65e484bbf4524ca8de1b1dd99c4e92c12f92a9d6b0567a643d0aa6bb2d |
Nahraďte zvýrazněné container id za id vašeho kontejneru zobrazené ve vašem terminálu. Příkaz odstraní kontejner, ale neodstraní svazek, který jsme vytvořili. Pro ověření můžete vypsat dostupné svazky pomocí příkazu docker volume ls :
|
1 |
docker volume ls |
Zde je výstup:

Pro odstranění kontejneru vytvořeného v Kroku 2, zadejte následující příkaz:
|
1 |
docker volume rm Step2DataVolume |
V tomto kroku se vám podařilo vytvořit svazek Dockeru současně s vytvořením kontejneru. Podívejme se, jak můžeme vytvořit svazek z existujícího adresáře s daty.
Krok 3: Vytvoření svazku Dockeru z existujícího adresáře s daty
Pokud chcete zkopírovat data do svazku, můžete vytvořit svazek při vytváření kontejneru a zadat cestu k adresáři obsahujícímu data v základním obrazu. V níže uvedeném příkazu vytvoříme kontejner a přidáme datový svazek na /var, což je adresář obsahující data v základním obrazu:
|
1 |
docker run -ti --rm -v Step3DataVolume:/var ubuntu |
Při spuštění příkazu se obsah z adresáře /var základního obrazu zkopíruje do svazku. Svazek lze připojit k novému kontejneru. Poté kontejner ukončete:

Zadejte následující příkaz pro vytvoření kontejneru, připojení svazku a vypsání obsahu svazku pomocí příkazu ls:
|
1 |
docker run --rm -v Step3DataVolume:/Step3DataVolume ubuntu ls Step3DataVolume |
Měli byste vidět podobný výstup příkazu, což je kopie obsahu adresáře /var ze základního obrazu, který je nyní k dispozici ve Step3DataVolume:

I když připojení /var adresáře, jako jsme to udělali v tomto příkladu, může být nepraktické, pomůže nám to pochopit, že k Docker svazku můžete připojit jakýkoli adresář vytvořený ve vašich vlastních obrazech, aby byla data dostupná pro ostatní kontejnery.
Krok 4: Sdílení dat mezi více kontejnery Docker
Ve většině případů budete chtít, aby k datům z jednoho svazku Docker přistupovalo více kontejnerů. V předchozích příkladech jsme svazek připojili pouze k jednomu kontejneru. Nyní se dozvíte, jak připojit svazek k více kontejnerům. I když toho můžete dosáhnout snadno, Docker neřeší zamykání souborů. Pokud do stejného svazku zapisuje více kontejnerů, musíte aplikace běžící v těchto kontejnerech individuálně navrhnout tak, aby zvládaly zápis do sdílených datových úložišť, aby nedošlo k poškození dat.
- Vytvořte Step4Container1 a Step4DataVolume
Použijte příkaz docker run s příznakem --name pro vytvoření pojmenovaného kontejneru:
|
1 |
docker run -ti --name=Step4Container1 -v Step4DataVolume:/Step4DataVolume ubuntu |
Uvnitř kontejneru spusťte následující příkaz pro vytvoření textového souboru a přidání textu:
|
1 |
echo "Step Four Sample Text" > /Step4DataVolume/StepFour.txt |
Poté ukončete kontejner a vraťte se do hostitelského prostředí. Nyní chceme vytvořit další kontejner a připojit k němu svazky z Step4Container1 k němu.
- Vytvořte Step4Container2 a připojte svazky z kontejneru Step4Container1
Spuštěním následujícího příkazu vytvořte Step4Container2 a připojte svazky z Step4Container1:
|
1 |
docker run -ti --name=Step4Container2 --volumes-from Step4Container1 ubuntu |
Uvnitř kontejneru použijte příkaz cat k ověření trvalosti dat:
|
1 |
cat /Step4DataVolume/StepFour.txt |
Měli byste vidět následující výstup:

Do souboru můžeme přidat další text z Step4Container2 zadáním následujícího příkazu:
|
1 |
echo "We are appending text while inside Step4Container2" >> /Step4DataVolume/StepFour.txt |
Poté ukončete kontejner a vrátíme se zpět do Step4Container1 pro kontrolu, zda jsou data stále přítomna.
- Ověření změn provedených ve svazku Docker mezi různými kontejnery
Chcete-li zobrazit změny, nejprve restartujte Step4Container1 pomocí příkazu:
|
1 |
docker start -ai Step4Container1 |
Zkontrolujte změny pomocí příkazu:
|
1 |
cat /Step4DataVolume/StepFour.txt |
Měli byste vidět výstup podobný snímku obrazovky níže:

Jakmile ověříte, že oba kontejnery mohou číst a zapisovat data do stejného svazku, můžete nyní kontejner ukončit. Jak již bylo zmíněno, Docker neřeší zamykání souborů, to je úkolem aplikační logiky běžící uvnitř kontejnerů, která by měla spravovat přístup pro čtení a zápis do sdílených datových úložišť. Docker umožňuje připojit svazky pouze pro čtení, aby se zabránilo náhodnému poškození dat kontejnery, které vyžadují pouze přístup pro čtení, a to přidáním :ro jak je znázorněno v následujícím příkladu.
- Připojení svazku ke kontejneru Docker pouze pro čtení
V tomto příkladu vytvoříme kontejner s názvem Step4Container3. V příkazu pro vytvoření připojíme svazky z Step4Container1 a přidáme :ro pro určení, že tento kontejner má přístup pouze pro čtení, ale nemůže do svazku zapisovat. Spusťte v terminálu následující příkaz:
|
1 |
docker run -ti --name=Step4Container3 --volumes-from Step4Container1:ro ubuntu |
Jakmile budete uvnitř kontejneru, můžete si přečíst textový soubor ve svazku zadáním následujícího příkazu:
|
1 |
cat /Step4DataVolume/StepFour.txt |

Pokud se však pokusíte soubor odebrat pomocí příkazu:
|
1 |
rm /Step4DataVolume/StepFour.txt |
Ve svém terminálu obdržíte chybovou zprávu jako:
![]()
Jakmile ověříte oprávnění pro čtení a zápis, můžete kontejner opustit. Pokud chcete vyčistit kontejnery a svazek vytvořené v tomto návodu, spusťte následující příkazy:
|
1 2 3 |
docker rm Step4Container1 Step4Container2 Step4Container3 docker volume rm Step4DataVolume |
V tomto kroku jste se naučili, jak sdílet data mezi několika kontejnery pomocí svazků Docker a také jak připojit datové svazky ke kontejnerům pouze pro čtení.
Závěr
V tomto návodu jste vytvořili několik svazků Docker a naučili se sdílet data mezi kontejnery Docker. Při řešení sdílení dat mezi kontejnery jsme si všimli, že jednotlivá aplikační logika uvnitř kontejneru musí řešit zamykání souborů, aby se zabránilo poškození dat při zápisu do sdílených datových úložišť, protože Docker nemá žádnou implementaci pro zpracování zamykání souborů.
Další zdroje o využívání Dockeru naleznete v dalších návodech na našem blogu:
- Jak sdílet data mezi kontejnerem Docker a hostitelem
- Jak vyčistit prostředky Dockeru – obrazy, kontejnery a svazky
- Nasazení Laravel, Nginx a MySQL pomocí Docker Compose
- Instalace a nastavení Dockeru na CentOS 7
Příjemnou práci!
Komentáře
Zatím žádné komentáře. Buďte první.