Jak zjistit, že potřebujete Docker a ne VM? Je třeba určit, co přesně chcete izolovat. Pokud je potřeba izolovat systém s garantovaně vyčleněnými zdroji a virtuálním hardwarovým vybavením, pak by volba měla padnout na VM. Pokud potřebujete izolovat běžící aplikace jako samostatné procesy systému, budete potřebovat Docker.
Jaký je tedy rozdíl mezi kontejnery Docker a VM?
Virtuální stroj (VM) je virtuální počítač se všemi virtuálními zařízeními a virtuálním pevným diskem, na který se instaluje nová nezávislá OS spolu s virtuálními ovladači zařízení, správou paměti a dalšími komponenty. Tedy získáváme abstrakci fyzického hardwaru, která umožňuje spouštět na jednom počítači množství virtuálních počítačů.
Nainstalovaná VM může různě zabírat místo na disku počítače:
- fixní místo na pevném disku, což umožňuje rychlejší přístup k virtuálnímu pevnému disku a vyhýbá se fragmentaci souboru;
- dynamické přidělování paměti. Při instalaci dalších aplikací bude paměť dynamicky přidělována pro ně, dokud nedosáhne maximálního objemu, který jí byl vyčleněn.
Čím větší virtuálních strojů na serveru, tím více místa zabírají a také vyžadují neustálou podporu prostředí potřebného pro chod vaší aplikace.
Docker je software pro vytváření aplikací na bázi kontejnerů. Kontejnery a virtuální stroje mají podobné výhody, ale pracují různě. Kontejnery zabírají méně místa, protože znovu využívají větší množství sdílených zdrojů hostitelského systému než VM, neboť na rozdíl od VM zajišťují virtualizaci na úrovni OS, nikoli hardwaru. Tento přístup zajišťuje menší objem zabrané paměti, rychlé nasazení a snadnější škálování.
Kontejner poskytuje efektivnější mechanismus pro zapouzdření aplikací, zajišťující nezbytné rozhraní hostitelského systému. Tato funkce umožňuje kontejnerům sdílet jádro systému, přičemž každý kontejner funguje jako samostatný proces hlavního OS, má svůj vlastní soubor paměťových oblastí (vlastní virtuální adresní prostor). Protože je virtuální adresní prostor každého kontejneru vlastní, data náležející různým paměťovým oblastem nemohou být měněna.
Nativním OS pro Docker je Linux (Docker lze také používat na Windows a MacOS), využívá jeho hlavní výhody, které umožňují uspořádání sdílení jádra. Spuštění Docker kontejnerů na Windows probíhá uvnitř virtuálního stroje s OS Linux, protože kontejnery sdílejí OS hostitelského systému a pro ně je hlavním OS Linux.
Jak kontejnery fungují?
Kontejner - to je abstrakce na úrovni aplikace, která spojuje kód a závislosti. Kontajnery jsou vždy vytvářeny z obrazů, přidáním zapisovatelného vrchního layeru a inicializací různých parametrů. Protože má kontejner svůj vlastní zapisovatelný vrstvu a všechny změny jsou ukládány do této vrstvy, několik kontejnerů může společně sdílet přístup k jednomu a tomu samému základnímu obrazu.
Každý kontejner lze nakonfigurovat pomocí souboru v projektu docker-compose, který je součástí hlavního řešení — docker-compose.yml. Zde lze zadat různé parametry, jako je název kontejneru, porty, identifikátory, limity zdrojů a závislosti mezi jinými kontejnery. Pokud není v nastavení zadán název kontejneru, Docker vždy vytvoří nový kontejner a přiřadí mu náhodné jméno.
Když se kontejner spustí z obrazu, Docker přimountuje souborový systém pro čtení a zápis přes jakékoli nižší vrstvy. Právě zde budou prováděny všechny procesy, které chceme, aby náš Docker kontejner vykonával.
Když Docker poprvé spustí kontejner, počáteční vrstva pro čtení a zápis je prázdná. Když dojde ke změnám, jsou aplikovány na tuto vrstvu; například, pokud chcete změnit soubor, tento soubor bude zkopírován z vrstvy pouze pro čtení níže do vrstvy pro čtení a zápis.
Verze souboru dostupná pouze pro čtení stále bude existovat, ale nyní je skryta pod kopií. K ukládání dat, nezávisle na životním cyklu kontejneru, se používají svazky. Svazky se inicializují při vytváření kontejneru.
Jak je obraz spojen s kontejnerem?
Obraz — základní prvek pro každý kontejner. Obraz se vytváří z Dockerfile přidaného do projektu a představuje soubor souborových systémů (vrstev) navrstvených na sebe a skupinovaných dohromady, přístupných pouze pro čtení; maximální počet vrstev je 127.
Na každém obrazu je základní obraz, který je uveden příkazem FROM — vstupní bod při vytváření obrazu Dockerfile. Každá vrstva je readonly vrstvou a je reprezentována jedním příkazem, který modifikuje souborový systém zapsaný v Dockerfile.
Pro kombinaci těchto vrstev do jednoho obrazu Docker používá pokročilý vícivrstvý zápisový systém souborů (AuFS založený na UnionFS), který umožňuje různým souborům a adresářům z různých souborových vrstev průhledně se překrývat, čímž vytváří propojený souborový systém.
Vrstvy obsahují metadata, která umožňují uchovávat související informace o každé vrstvě během provádění a sestavení. Každá vrstva obsahuje odkaz na následující vrstvu, pokud vrstva nemá odkaz, znamená to, že je to nejvyšší vrstva v obrazu.
Dockerfile může obsahovat takové příkazy jako:
- FROM — vstupní bod při vytváření obrazu;
- MAINTAINER — jméno vlastníka obrazu;
- RUN — provedení příkazu během sestavení obrazu;
- ADD — zkopírování souboru z hostitele do nového obrazu, pokud je zadán URL souboru, Docker ho stáhne do zadaného adresáře;
- ENV — proměnné prostředí;
- CMD — spouští vytvoření nového kontejneru na základě obrazu;
- ENTRYPOINT — příkaz se provede při spuštění kontejneru.
- WORKDIR — pracovní adresář pro provádění příkazu CMD.
- USER — nastavuje UID pro kontejner vytvářený na základě obrazu.
- VOLUME — připojuje adresář hostitele do kontejneru.
- EXPOSE — seznam portů naslouchajících v kontejneru.
Jak funguje UnionFS?
UnionFS — služební stohovací souborový systém (FS) pro Linux a FreeBSD. Tento FS realizuje mechanismus kopírování při zápisu (Copy-On-Write, COW). Pracovní jednotkou UnionFS je vrstva, každou vrstvu je třeba považovat za samostatný plnohodnotný souborový systém s hierarchií adresářů od samotného kořene. UnionFS vytváří sloučené připojení pro jiné souborové systémy a umožňuje transparentně pro uživatele kombinovat soubory a adresáře různých souborových systémů (nazývaných větvemi) do jediné propojené souborové soustavy.
Obsah adresářů se stejnými cestami se bude zobrazovat společně v jednom sloučeném adresáři (v jediném jmenném prostoru) výsledného souborového systému.
UnionFS spojuje vrstvy podle následujících principů:
- jedna z vrstev se stává vrstvou nejvyšší úrovně, druhá a další – vrstvami nižší úrovně;
- uživateli jsou objekty vrstev dostupné „shora dolů“, t.j. pokud je požadovaný objekt v „horní“ vrstvě, vrátí se on, bez ohledu na přítomnost objektu se stejným jménem v „dolní“ vrstvě; jinak se vrátí objekt „dolní“ vrstvy; pokud požadovaný objekt není ani tam, ani tam, vrátí se chyba „Žádný takový soubor nebo adresář“;
- pracovní vrstvou je „horní“, to znamená, že všechny akce uživatele na změnu dat se odrážejí pouze na vrstvě nejvyšší úrovně, aniž by ovlivnily obsah vrstev nižších úrovní.
Docker je nejběžnější technologií pro používání kontejnerů při práci s aplikacemi. Stal se standardem v této oblasti a vychází z cgroups a prostorů jmen, které zajišťuje jádro Linuxu.
Docker nám umožňuje rychle nasazovat aplikace a maximálně optimálně využívat souborový systém díky sdílení jádra OS mezi všemi kontejnery, přičemž funguje jako samostatné procesy OS.
Zdroj: habr.com
