Jednou z možností, jak automatizovat kontejner s daty, je uložit data do obrazu kontejneru. To však vyžaduje, aby kopie dat byla v každém spuštěném kontejneru, což může vést k plýtvání zdroji, pokud se kontejnery zvětší. Lepší možností je uložit jednu kopii dat do svazku Docker a poté tento svazek sdílet mezi kontejnery.
Svazek Docker si můžete představit jako složku, která existuje mimo souborový systém kontejneru, ale je stále přístupná pro kontejnery běžící na stejném hostiteli. Když vytváříte nový kontejner, můžete buď připojit existující svazek, nebo vytvořit nový. Pokud vytvoříte nový svazek, Docker automaticky vytvoří novou vrstvu úložiště na základním hostitelském souborovém systému a inicializuje jej pomocí dat, která určíte.
Jakmile vytvoříte svazek, můžete jej použít k ukládání jakéhokoli typu dat, včetně statických souborů, dat aplikací nebo protokolů. Svazky můžete také použít ke sdílení dat mezi kontejnery.
Pokud máte například webovou aplikaci, která běží v jednom kontejneru, můžete použít svazek k uložení zdrojového kódu aplikace, aby k němu měly přístup ostatní kontejnery ve vašem nasazení. To vám umožní ponechat zdrojový kód vaší aplikace oddělený od běhového prostředí, což usnadňuje aktualizaci a opětovné nasazení vaší aplikace.
Kromě sdílení dat mezi kontejnery můžete také použít svazky k uchování dat při zastavení a spuštění kontejnerů. Je to skvělý způsob, jak udržet svá data v bezpečí, i když budou vaše kontejnery omylem smazány nebo zastaveny.
V této příručce se dozvíte, jak svazky Docker interagují s kontejnery. Toho dosáhnete vytvořením nových kontejnerů a použitím svazků k ukládání a sdílení dat mezi nimi. Potom zjistíte, jak vyčistit prostor, který zbyde po anonymních svazcích, které jsou automaticky generovány kontejnery. Nakonec se dozvíte, jak zálohovat data svazků Docker.
Začněme!
Předpoklady
- Abyste mohli postupovat podle tohoto průvodce, měli byste se seznámit se základy práce s kontejnery Docker.
- Tato příručka předpokládá, že používáte hostitele Linux. Tato příručka používá CentOS, ale stejné kroky by měly fungovat na jakékoli jiné distribuci Linuxu.
- Musíte mít na svém hostiteli nainstalovaný a spuštěný Docker. Pokud jej ještě nemáte nainstalovaný, postupujte podle pokynů v našem instalačním průvodci.
- Uživatelský účet s oprávněními root
- Na hostiteli Linuxu máte nainstalovaný Docker.
Objevování anonymních svazků dockeru
Když vytvoříte nový kontejner Docker, ve výchozím nastavení se na hostitelském souborovém systému vytvoří nový anonymní svazek. Tento svazek se používá k ukládání dat, která kontejner vyžaduje.
1. Spuštěním následujícího příkazu zkontrolujte, zda je docker spuštěný a aktivní.
sudo systemctl status docker
2. Spuštěním následujícího příkazu přidejte svůj uživatelský účet do skupiny docker, abyste mohli spouštět příkazy docker bez použití sudo. Po přidání uživatelského účtu do skupiny dockerů se odhlaste a znovu přihlaste, aby se změny projevily.
sudo usermod -aG docker $(whoami)
3. Spusťte následující příkaz k načtení některých obrázků z registru Docker do vašeho hostitele. Tyto obrázky budete používat k procvičování vytváření a práce se svazky Docker.
docker pull postgres:12.1
docker pull bash
docker pull httpd:2.4
4. Spusťte následující příkaz pro zobrazení seznamu obrázků, které jsou aktuálně na vašem hostiteli, abyste ověřili, že obrázky byly staženy.
docker images
5. Spusťte následující příkaz a zjistěte, zda jsou na vašem hostiteli nějaké aktivní svazky. Měli byste vidět výstup podobný následujícímu.
docker volume ls
Měli byste vidět prázdný výstup.
6. Spuštěním následujícího příkazu vytvořte nový kontejner a ověřte, že byl na hostiteli vytvořen nový anonymní svazek. Pomocí parametru -d spustíte kontejner v odpojeném režimu, abyste mohli pokračovat v práci v terminálu. Pomocí příznaku --name přidělíte kontejneru název, abyste jej mohli snadno identifikovat. Zde používáte obrázek postgres:12.1, protože Postgres potřebuje svazky na pozadí pro ukládání svých dat. Měli byste spustit dva kontejnery, jeden pro každou z vašich databází Postgres, abyste mohli dobře měřit a vidět více informací.
docker run -d --name db1 postgres:12.1
docker run -d --name db2 postgres:12.1
7. Spusťte níže uvedený příkaz docker a vypište kontejnery, které aktuálně běží na vašem hostiteli.
docker ps
Nyní máte dva kontejnery: db1 a db2, jak je uvedeno níže.
8. Nyní uveďte seznam svazků, které byly vytvořeny na hostiteli.
docker volume ls
Uvidíte výstup podobný následujícímu. Jakmile se Postgres spustí, potřebuje místo pro uložení dat. Postgres nechce přijít o svá data, takže Postgres automaticky vytváří anonymní svazky. Svazky jsou pojmenovány s náhodným řetězcem hexadecimálních znaků (e9f338... a ee3423... ).
Podívejme se blíže na svazky pomocí příkazu docker inspect.
9. Spuštěním níže uvedeného příkazu získáte další informace o kontejneru db1 ve formátu čitelném pro člověka.
docker inspect db1 -f '{{ json .Mounts }}' | python -m json.tool
Jak můžete vidět níže, e9f338 Jméno řádek odpovídá výstupu příkazu docker volume ls výše. Tento řádek říká, že tento svazek je přidružen a připojen k db1 kontejner.
10. Totéž proveďte při kontrole db2 kontejner.
docker inspect db2 -f '{{ json .Mounts}}' | python -m json.tool
Uvidíte, že výstup je přesně stejný jako db1 kontejner, kromě názvu svazku, který se bude lišit. Tento výstup potvrzuje, že Docker vytváří nový anonymní svazek pro každý vytvořený kontejner.
11. Spusťte ještě jeden kontejner. Ale tentokrát použijeme příznak --rm a uvidíme, co se stane se svazky. Tento kontejner jsme pojmenovali dbTmp. Pojďme to zjistit!
docker run -d --rm --name dbTmp postgres:12.1
Nyní máme tři kontejnery:db1 , db2, a dbTmp v provozu
docker ps
12. Znovu vypište svazky.
docker volume ls
Všimnete si, že pro dbTmp byl vytvořen třetí svazek kontejner.
13. Nyní zastavte db2 spolu s kontejnerem dbTmp pomocí níže uvedeného příkazu.
docker stop db2 dbTmp
13. Znovu vypište kontejnery a objemy.
docker ps
docker volume ls
Jak je znázorněno níže, jediným spuštěným kontejnerem je kontejner db1. Svazek pro kontejner dbTemp je však nyní pryč, ale svazek pro kontejner db2 (ee3423... ) je stále tam.
Toto chování je očekáváno. Parametr --rm odstraní kontejner poté, co byl zastaven, spolu se všemi souvisejícími svazky. Objem pro kontejner dbTmp je pryč, protože jsme zastavili kontejner dbTemp. Protože jsme při vytváření kontejneru db2 nezadali příznak --rm, kontejner db2 a jeho přidružený svazek zůstávají na hostiteli, i když kontejner zastavíme. Z tohoto příkladu vyplývá, že musíte být opatrní s příznakem --rm. Pokud zastavíte kontejner, který má přidružený svazek, svazek bude smazán.
Vytvoření svazku dockeru
Svazek Docker je pojmenovaný úložný kontejner, který vytvoříte pomocí příkazu vytvoření svazku dockeru. Svazek pak použijete k ukládání dat nebo ke sdílení dat mezi kontejnery.
1. Spuštěním následujícího příkazu vytvořte nový svazek s názvem website.
docker volume create website
2. Vypište svazky, uvidíte nový svazek, který jste právě vytvořili.
docker volume ls
3. Stáhněte si tento kód webu z GitHubu do svého aktuálního pracovního adresáře.
4. Spusťte níže uvedený příkaz a zkopírujte kód webu, který jste právě stáhli, do svazku webu.
sudo cp -r /home/cloud_user/widget-factory-inc/web/* /var/lib/docker/volumes/website/_data/
5. Spuštěním níže uvedeného příkazu zobrazíte seznam souborů ve svazku webových stránek.
sudo ls -l /var/lib/docker/volumes/website/_data/
Můžete vidět, že kód webu je nyní uložen ve svazku webu.
6. Nyní můžete spustit nový kontejner a připojit k němu svazek webu. K připojení svazku použijte parametr -v (svazek). Pomocí parametru -p (mapování portu) namapujete port na hostiteli na port v kontejneru. V tomto příkladu mapujeme port 80 na hostiteli na port 80 v kontejneru. Web1 je název kontejneru.
docker run -d --name web1 -p 80:80 -v website:/usr/local/apache2/htdocs:ro httpd:2.4
7. Web bude nyní obsluhován z kontejneru web1. Spuštěním příkazu docker ps zkontrolujte stav kontejneru web1. Můžete vidět, že web je obsluhován z kontejneru web1. Můžete také vidět port, na kterém je webová stránka obsluhována (80), jak je uvedeno níže.
8. Můžete otevřít IP adresu hostitelského počítače ve svém webovém prohlížeči a zobrazit webovou stránku, kterou jste právě zkopírovali.
9. Nyní spusťte jeden další kontejner s názvem webTmp, tentokrát s příznakem --rm, abyste viděli, co se stane se svazkem webu, když zastavíte kontejner webTmp.
docker run -d --name webTmp --rm -v website:/usr/local/apache2/htdocs:ro httpd:2.4
10. Spusťte příkaz docker ps show, abyste ověřili, že kontejner webTmp běží.
docker ps
11. Nyní zastavte kontejner webTmp a vypište svazky.
docker stop webTmp
svazek dockeru ls
Jak si pamatujete na začátku tohoto článku, když zastavíte kontejner, smažou se také související svazky. Ale tentokrát, jak je uvedeno níže, můžete vidět, že objem webových stránek je stále k dispozici. Tak co se stalo?
Klíčovým přínosem v tomto příkladu je, že když zastavíte kontejner, data ve svazcích přidružených k tomuto kontejneru nebudou odstraněna, pokud jsou svazky používány jiným kontejnerem. V tomto případě je objem webu stále využíván kontejnerem web1. Toto je velmi důležitý bod, který je třeba pamatovat při práci se svazky Docker.
Jak se zbavit nevyužitých svazků
I když jsou svazky skvělým způsobem, jak ukládat data a udržovat je v pořádku, mohou také zabírat hodně místa na disku, pokud se nepoužívají. Pokud svazek nepoužíváte, je nejlepší jej odebrat ze systému, abyste uvolnili místo na disku. Naštěstí Docker nabízí všechny nástroje, které potřebujete k odstranění nepoužívaných svazků z vašeho systému.
1. Spusťte příkaz docker volume prune, abyste odstranili visící prostředky (obrázky, sítě, svazky a kontejnery). Visící prostředek je objekt Docker, který není v současné době přidružen ke kontejneru. Než však svazek odeberete, ujistěte se, že jej nepoužívají žádné nádoby. Například musíte odebrat kontejner db2, než budete moci odebrat nepoužívané svazky, které jsou s ním spojené.
docker stop db2
docker rm db2
docker volume prune
2. Uveďte seznam svazků a uvidíte, že svazek db2 je nyní pryč.
docker volume ls
3. Spusťte níže uvedený postup a vyhledejte umístění objemových dat pro svůj web, abyste je mohli zálohovat.
docker volume inspect website
Uvidíte bod připojení pro váš web. Bod připojení je adresář v hostitelském operačním systému, kde je připojen svazek dockeru. V tomto příkladu je bod připojení /var/lib/docker/volumes/website/_data , jak je uvedeno níže.
4. K zálohování obsahu svazku vašich webových stránek můžete použít příkaz tar. Existuje již dlouhou dobu a je podporována na většině platforem. Příkaz tar lze použít k zálohování adresáře, včetně všech jeho podadresářů a souborů.
Poznámka :Tento příkaz MUSÍTE spustit jako uživatel root, jinak nebudete mít oprávnění zapisovat na svazek připojeného dockeru, jak je znázorněno níže.
tar czf /tmp/website_$(date +%Y-%m-%d-%H%M).tgz -C /var/lib/docker/volumes/website/_data .
5. Spuštěním níže uvedeného příkazu ověřte, že byl záložní soubor tar úspěšně vytvořen.
ls -l /tmp/website_*.tgz
6. Spuštěním níže uvedeného příkazu ověřte, že záložní soubor obsahuje správná data. Nahraďte YOUR_BACKUP_FILE_NAME skutečným názvem vašeho záložního souboru.
tar tf /tmp/<YOUR_BACKUP_FILE_NAME>.tgz
7. Nyní spustíme ještě jeden kontejner pomocí objemu webu. Tentokrát budete používat příznak -it k interakci s kontejnerem k testování zálohy.
docker run -it --rm -v website:/website -v /tmp:/backup bash tar czf /backup/website_$(date +%Y-%m-%d-%H-%M).tgz -C /website .
8. Přejděte do adresáře svazku a odstraňte všechna data webu.
9. Vypište obsah adresáře, abyste viděli, že data webu jsou pryč.
ls -l
10. Spusťte níže uvedený příkaz a obnovte data webových stránek. Nahraďte
tar xf <YOUR_BACKUP_FILE_NAME>.tgz .
11. Vypište obsah adresáře, abyste ověřili, že data webu byla obnovena.
ls -l
Závěr
V této příručce jste se naučili, jak vytvořit, zálohovat svazek dockeru a obnovit data. Také jste se dozvěděli, kde najít přípojný bod pro svazek dokovacího zařízení.
Docker si v poslední době získává velkou oblibu, protože usnadňuje nasazování aplikací. S velkou mocí však přichází i velká zodpovědnost. Je důležité zálohovat svazky dockeru, abyste předešli ztrátě dat v případě katastrofy.
O Dockeru se toho dá hodně naučit. Pokud se chcete na Docker podívat podrobněji, doporučujeme prostudovat si jeho dokumentaci, kde najdete všechny informace, které potřebujete, abyste mohli s dockerem začít pracovat.