Už několik měsíců používám Docker k strukturování procesu vývoje/dodání webových projektů. Nabízím čtenářům „HabrHabr“ překlad úvodního článku o Dockeru — .
Co je Docker?
Docker je otevřená platforma pro vývoj, dodání a provoz aplikací. Docker je navržen pro rychlejší nasazení vašich aplikací. S pomocí Dockeru můžete oddělit vaši aplikaci od vaší infrastruktury a zacházet se strukturou jako s řízenou aplikací. Docker pomáhá rychleji nasazovat váš kód, rychleji testovat, rychleji vydávat aplikace a zkracovat čas mezi psaním kódu a jeho spuštěním. Docker to dělá pomocí lehké platformy kontejnerové virtualizace, využívající procesy a nástroje, které pomáhají spravovat a nasazovat vaše aplikace.
V jádru Docker umožňuje spouštět prakticky jakoukoli aplikaci, bezpečně izolovanou v kontejneru. Bezpečná izolace vám umožňuje spouštět na jednom hostiteli více kontejnerů současně. Lehká povaha kontejneru, který je spuštěn bez dodatečné zátěže hypervizora, vám umožňuje dosáhnout více z vašeho hardwaru.
Platforma a nástroje kontejnerové virtualizace mohou být užitečné v následujících případech:
- balení vaší aplikace (a také používaných komponent) do Docker kontejnerů;
- distribuce a dodání těchto kontejnerů vašim týmům pro vývoj a testování;
- nasazení těchto kontejnerů do vašich produkcí, jak do datových center, tak do cloudu.
Na co mohu použít Docker?
Rychlé nasazení vašich aplikací
Docker je skvělý pro organizaci vývojového cyklu. Docker umožňuje vývojářům používat lokální kontejnery s aplikacemi a službami. To následně umožňuje integraci do procesu kontinuální integrace a nasazení (continuous integration and deployment workflow).
Například vaši vývojáři píší kód lokálně a sdílí svůj vývojový stack (sadu Docker obrazů) se svými kolegy. Když jsou připraveni, odešlou kód a kontejnery na testovací prostředí a spustí jakékoli potřebné testy. Z testovacího prostředí mohou odeslat kód a obrazy do produkce.
Jednodušší nasazení a rozbalení
Platforma založená na kontejnerech Docker umožňuje snadno přenášet vaše pracovní zatížení. Kontejnery Docker mohou běžet na vaší lokální stanici, jak na fyzické, tak na virtuální mašině v datacentru nebo v cloudu.
Přenositelnost a lehká povaha Dockeru usnadňují dynamickou správu vašeho zatížení. Můžete použít Docker k nasazení nebo uhašení vaší aplikace nebo služeb. Rychlost Dockeru umožňuje provádět tyto operace téměř v reálném čase.
Vysoké zátěže a více pracovních zatížení
Docker je lehký a rychlý. Nabízí spolehlivou, nákladově efektivní alternativu k virtuálním strojům založeným na hypervizoru. Je obzvlášť užitečný v prostředí s vysokým zatížením, například při vytváření vlastního cloudu nebo platformy jako služby (platform-as-service). Je také užitečný pro malé a střední aplikace, když chcete maximálně využít dostupné zdroje.
Hlavní komponenty Dockeru
Docker se skládá ze dvou hlavních komponent:
- Docker: platforma pro virtualizaci s otevřeným zdrojovým kódem;
- Docker Hub: naše platforma jako služba pro distribuci a správu kontejnerů Docker.
Poznámka! Docker se distribuuje pod licencí Apache 2.0.
Architektura Dockeru
Docker používá architekturu klient-server. Klient Docker komunikuje s démonem Docker, který přebírá zátěž vytváření, spouštění a distribuce vašich kontejnerů. Oba, klient i server, mohou běžet na jednom systému, můžete připojit klienta k vzdálenému démonu Docker. Klient a server komunikují přes socket nebo přes RESTful API.

Démon Docker
Jak je znázorněno na diagramu, démon běží na hostitelské stanici. Uživatel neinteraguje přímo se serverem, ale používá k tomu klienta.
Klient Docker
Klient Docker, program Docker, je hlavním rozhraním k Dockeru. Získává příkazy od uživatele a interaguje s démonem Docker.
Uvnitř Dockeru
Abychom pochopili, z čeho se Docker skládá, musíme vědět o třech komponentech:
- obrazy (images)
- registr (registries)
- kontejnery
Obrázky
Docker obraz je šablona pouze pro čtení. Například může obsahovat operační systém Ubuntu s Apache a na něm běžící aplikaci. Obrazy se používají k vytváření kontejnerů. Docker umožňuje snadno vytvářet nové obrazy, aktualizovat existující, nebo můžete stahovat obrazy vytvořené jinými uživateli. Obrazy jsou součástí sestavení dockeru.
Registr
Docker registr ukládá obrazy. Existují veřejné a soukromé registry, ze kterých lze stahovat nebo nahrávat obrazy. Veřejný Docker registr je . Obsahuje obrovskou sbírku obrazů. Jak víte, obrazy mohou být vytvořeny vámi nebo můžete používat obrazy vytvořené někým jiným. Registry jsou součástí distribuce.
Kontejnery
Kontejnery jsou podobné adresářům. V kontejnerech je obsaženo vše, co je potřeba pro běh aplikace. Každý kontejner se vytváří z obrazu. Kontejnery mohou být vytvářeny, spouštěny, zastavovány, přesouvány nebo odstraňovány. Každý kontejner je izolovaný a představuje bezpečnou platformu pro aplikaci. Kontejnery jsou součástí provozu.
Jak tedy Docker funguje?
Zatím víme, že:
- můžeme vytvářet obrazy, které obsahují naše aplikace;
- můžeme vytvářet kontejnery z obrazů pro spuštění aplikací;
- můžeme distribuovat obrazy přes Docker Hub nebo jiný registr obrazů.
Podívejme se, jak tyto komponenty spolu souvisejí.
Jak funguje obraz?
Už víme, že obraz je šablona pouze pro čtení, ze které se vytváří kontejner. Každý obraz se skládá z množiny vrstev. Docker používá k propojení těchto vrstev do jednoho obrazu. Unified file system umožňuje souborům a adresářům z různých souborových systémů (různých větví) se transparentně překrývat, což vytváří koherentní souborový systém.
Jedním z důvodů, proč je docker lehký, je použití takových vrstev. Když změníte obraz, například aktualizací aplikace, vytváří se nová vrstva. Tímto způsobem, bez nutnosti nahrazovat celý obraz nebo jej rekonstruovat, jak byste možná museli udělat s virtuální stroj, je pouze přidána nebo aktualizována vrstva. A nemusíte distribuovat celý nový obraz, pouze aktualizace, což usnadňuje a urychluje distribuci obrazů.
Každý obraz se zakládá na základním obrazu. Například ubuntu, základní obraz Ubuntu, nebo fedora, základní obraz distribuce Fedora. Můžete také použít obrazy jako základ pro vytváření nových obrazů. Například pokud máte obraz apache, můžete ho použít jako základní obraz pro vaše webové aplikace.
Poznámka! Docker obvykle bere obrazy z registru Docker Hub.
Docker obrazy mohou být vytvořeny z těchto základních obrazů, kroky popisující vytváření těchto obrazů nazýváme instrukcemi. Každá instrukce vytváří nový obraz nebo úroveň. Instrukcemi budou následující akce:
- spuštění příkazu
- přidání souboru nebo adresáře
- vytvoření proměnné prostředí
- určení, co se má spustit při spuštění kontejneru tohoto obrazu
Tyto instrukce jsou uloženy v souboru Dockerfile. Docker to čte Dockerfile, když sestavujete obraz, provádí tyto instrukce a vrací konečný obraz.
Jak funguje docker registr?
Registr je úložiště docker obrazů. Po vytvoření obrazu ho můžete publikovat na veřejném registru Docker Hub nebo na vašem osobním registru.
Pomocí docker klienta můžete vyhledávat již publikované obrazy a stahovat je na vaši mašinu s dockerem pro vytváření kontejnerů.
Docker Hub poskytuje veřejná a soukromá úložiště obrazů. Vyhledávání a stahování obrazů z veřejných úložišť je dostupné pro všechny. Obsah soukromých úložišť se nedostává do výsledků vyhledávání. Pouze vy a vaši uživatelé mohou tyto obrazy získávat a vytvářet z nich kontejnery.
Jak funguje kontejner?
Kontejner se skládá z operačního systému, uživatelských souborů a metadat. Jak víme, každý kontejner je vytvořen z obrazu. Tento obraz říká dockeru, co se nachází v kontejneru, jaký proces spustit, když se kontejner spustí a další konfigurační údaje. Docker obraz je dostupný pouze pro čtení. Když docker spustí kontejner, vytváří vrstvu pro čtení/zápis nad obrazem (používající union file system, jak bylo uvedeno dříve), ve které může být spuštěna aplikace.
Co se stane, když se kontejner spustí?
Buď pomocí programu docker, nebo pomocí RESTful API, docker klient říká docker démonu, aby spustil kontejner.
$ sudo docker run -i -t ubuntu /bin/bash
Pojďme si vysvětlit tento příkaz. Klient se spouští pomocí příkazu docker, s volbou run, která říká, že bude spuštěn nový kontejner. Minimálními požadavky pro spuštění kontejneru jsou následující atribuce:
- jaký obraz použít pro vytvoření kontejneru. V našem případě
ubuntu - příkaz, který chcete spustit, když bude kontejner spuštěn. V našem případě
/bin/bash
Co se vlastně děje pod kapotou, když spouštíme tento příkaz?
Docker postupně dělá následující:
- stahuje obraz ubuntu: docker kontroluje přítomnost obrazu
ubuntuna místním počítači, a pokud není — stáhne ho z . Pokud však obraz existuje, použije ho k vytvoření kontejneru; - vytvoří kontejner: když je obraz přijat, docker ho použije k vytvoření kontejneru;
- inicializuje souborový systém a připojuje read-only úroveň: kontejner je vytvořen v souborovém systému a read-only úroveň byla přidána k obrazu;
- inicializuje síť/most: vytváří síťové rozhraní, které umožňuje dockeru komunikovat s hostitelským počítačem;
- Nastavení IP adresy: najde a určuje adresu;
- Spouští zvolený proces: spouští vaši aplikaci;
- Zpracovává a vykazuje výstup vaší aplikace: připojuje se a zapisuje standardní vstup, výstup a chyby vaší aplikace, abyste mohli sledovat, jak funguje vaše aplikace.
Nyní máte funkční kontejner. Můžete spravovat svůj kontejner a interagovat s vaší aplikací. Když se rozhodnete zastavit aplikaci, odstraňte kontejner.
Používané technologie
Docker je napsán v Go a využívá některé vlastnosti jádra Linuxu k realizaci výše uvedené funkčnosti.
Jmenné prostory (namespaces)
Docker používá technologii jmenné prostory pro uspořádání izolovaných pracovních prostorů, které nazýváme kontejnery. Když spouštíme kontejner, docker vytváří sadu jmenných prostorů pro daný kontejner.
To vytváří izolační úroveň, každý aspekt kontejneru běží ve svém jmenném prostoru, a nemá přístup k externímu systému.
Seznam některých jmenných prostorů, které docker používá:
- pid: pro izolaci procesů;
- net: pro správu síťových rozhraní;
- ipc: pro správu IPC prostředků. (IPC: InterProcess Communication);
- mnt: pro správu bodů připojení;
- utc: pro izolaci jádra a kontrolu generace verzí (UTC: Unix timesharing system).
Control groups (kontrolní skupiny)
Docker také používá technologii cgroups nebo kontrolní skupiny. Klíčem k fungování aplikace v izolaci je poskytnout aplikaci pouze ty zdroje, které chcete poskytnout. To zaručuje, že kontejnery budou dobrými sousedy. Kontrolní skupiny umožňují rozdělit dostupné zdroje hardwaru a v případě potřeby nastavit limity a omezení. Například omezit možné množství paměti pro kontejner.
Union File System
Union File System neboli UnionFS je souborový systém, který funguje tak, že vytváří vrstvy, což jej činí velmi lehkým a rychlým. Docker používá UnionFS k vytváření bloků, ze kterých se kontejner sestavuje. Docker může použít několik variant UnionFS včetně: AUFS, btrfs, vfs a DeviceMapper.
Formáty kontejnerů
Docker kombinuje tyto komponenty do obalu, kterému říkáme formát kontejneru. Formát, který se používá ve výchozím nastavení, se nazývá libcontainer. Docker také podporuje tradiční formát kontejnerů v Linuxu pomocí . V budoucnu Docker může podporovat i jiné formáty kontejnerů. Například integrací s BSD Jails nebo Solaris Zones.
Zdroj: habr.com
