Docker kontejnery jsou záměrně izolovaná prostředí. Každý kontejner má svůj vlastní souborový systém, ke kterému nemohou přímo přistupovat jiné kontejnery nebo váš hostitel.
Někdy mohou kontejnery potřebovat sdílet data. I když byste měli usilovat o to, aby kontejnery byly soběstačné, existují scénáře, kdy je sdílení dat nevyhnutelné. Může to být tak, že druhý kontejner může přistupovat ke kombinované mezipaměti, používat databázi zálohovanou souborem, vytvářet zálohu nebo provádět operace s daty generovanými uživateli, jako je kontejner pro optimalizaci obrázků, který zpracovává profilové fotografie nahrané prostřednictvím samostatného kontejneru webového serveru. .
V této příručce se podíváme na několik metod předávání dat mezi vašimi kontejnery Docker. Budeme předpokládat, že jste již Docker nastavili a jste obeznámeni se základními pojmy, jako jsou kontejnery, obrázky, svazky a sítě.
Použití svazků ke sdílení adresáře
Svazky jsou de facto způsob, jak nastavit sdílení dat. Jsou to nezávislé souborové systémy, které ukládají svá data mimo jakýkoli jednotlivý kontejner. Připojení svazku k cestě souborového systému v kontejneru poskytuje přístup pro čtení a zápis k datům svazku.
Svazky lze připojit k více kontejnerům současně. To usnadňuje bezproblémové sdílení a zachování dat, které spravuje Docker.
Začněte vytvořením svazku:
docker volume create --name shared-data
Dále vytvořte kontejnery a připojte svazek k cestě souborového systému očekávané každým obrazem:
docker run -d -v shared-data:/data --name example example-image:latest docker run -d -v shared-data:/backup-source --name backup backup-image:latest
V tomto příkladu backup
kontejner získá účinný přístup k example
/data
kontejneru adresář. Bude připojen jako /backup-source
; změny provedené jedním kontejnerem se projeví v druhém.
Rychlé spuštění kontejnerů s odpovídajícími objemy
Výše uvedený příklad lze zjednodušit pomocí docker run
--volumes-from
příkazu vlajka. To poskytuje mechanismus pro automatické připojení svazků, které již používá existující kontejner:
docker run -d --volumes-from example --name backup backup-image:latest
Tentokrát backup
kontejner obdrží shared-data
svazku připojeného do jeho /data
adresář. --volumes-from
flag stáhne všechny definice svazku připojené k example
kontejner. Je zvláště ideální pro zálohovací úlohy a další kontejnery s krátkou životností, které fungují jako pomocné součásti vaší hlavní služby.
Zlepšení bezpečnosti pomocí držáků pouze pro čtení
Svazky jsou ve výchozím nastavení vždy připojeny v režimu čtení a zápisu. Všechny vaše kontejnery s přístupem ke svazku mohou měnit jeho obsah, což může způsobit nechtěnou ztrátu dat.
Nejlepším postupem je připojit sdílené svazky v režimu pouze pro čtení, když se neočekává, že kontejner bude provádět úpravy. Ve výše uvedeném příkladu backup
kontejner potřebuje pouze číst obsah shared-data
hlasitost. Nastavení připojení do režimu pouze pro čtení vynucuje toto očekávání a zabraňuje chybám nebo škodlivým binárním souborům v obraze smazat data použitá v example
kontejner.
docker run -d -v shared-data:/backup-source:ro --name backup backup-image:latest
Přidávání ro
jako třetí parametr oddělený dvojtečkou k -v
příznak označuje, že svazek by měl být připojen v režimu pouze pro čtení. Můžete také napsat readonly
místo ro
jako explicitnější alternativu.
Sdílení dat přes síť
Síťové výměny můžete použít jako alternativní přístup ke sdílení dat prostřednictvím svazků souborového systému. Připojení dvou kontejnerů ke stejné síti Docker jim umožňuje bezproblémovou komunikaci pomocí automaticky přiřazených názvů hostitelů:
docker network create demo-network docker run -d --net demo-network --name first example-image:latest docker run -d --net demo-network --name second another-image:latest
Zde first
bude moci ping second
a naopak. Vaše kontejnery by mohly provozovat službu HTTP API, která jim umožní vzájemně interagovat s daty ostatních.
Pokračujeme v příkladu zálohování, nyní vaše backup
kontejner může odeslat síťový požadavek na http://example:8080/backup-data
získat data k zálohování. example
kontejner by měl odpovědět archivem obsahujícím všechna data, která je třeba uložit. Záložní kontejner pak nese odpovědnost za uložení archivu do vhodného úložiště.
Vynucení toho, že ke sdílení dat dochází přes síť, často napomáhá úsilí o oddělení. Skončíte s jasně definovanými rozhraními, která nevytvářejí tvrdé závislosti mezi službami. Přístup k datům lze přesněji řídit odhalením rozhraní API pro každý datový typ namísto poskytování celkového přístupu každého kontejneru ke svazku.
Při použití tohoto přístupu je důležité zvážit zabezpečení. Ujistěte se, že žádná rozhraní HTTP API, která jsou navržena pro interní přístup vašich ostatních kontejnerů Docker, nemají porty vystavené na mostové síti vašeho hostitele Docker. Toto je výchozí chování při použití výše uvedených možností sítě; propojení portu s -p 8080:8080
by umožnil přístup k záložnímu API přes síťová rozhraní vašeho hostitele. To by byl bezpečnostní problém.
Přehled
Kontejnery Docker jsou izolovaná prostředí, která nemají přístup k souborovým systémům ostatních. Data však můžete sdílet vytvořením svazku, který je připojen ke všem zúčastněným kontejnerům. Použití sdílené sítě Docker je alternativní možností, která poskytuje silnější oddělení ve scénářích, kde nejsou nutné přímé interakce se souborovým systémem.
Je dobrým zvykem co nejvíce omezit interakce mezi kontejnery. Případy, kdy potřebujete sdílení dat, by měly být jasně definovány, aby nedošlo k těsnému propojení vašich služeb. Kontejnery, které jsou pevně závislé na datech z jiného kontejner může být složitější na nasazení a údržbu v průběhu času, což narušuje širší výhody kontejnerizace a izolace.