Ako zistiť, či potrebujete Docker a nie VM? Je potrebné určiť, čo presne chcete izolovať. Ak je potrebné izolovať systém s garantovanými pridelenými zdrojmi a virtuálnym hardvérom, potom by mala voľba padnúť na VM. Ak je potrebné izolovať bežiace aplikácie ako samostatné procesy systému, budete potrebovať Docker.
A aký je teda rozdiel medzi Docker kontajnermi a VM?
Virtuálny počítač (VM) — to je virtuálny počítač so všetkými virtuálnymi zariadeniami a virtuálnym pevným diskom, na ktorý sa inštaluje nový nezávislý operačný systém spolu s virtuálnymi ovládačmi zariadení, správou pamäte a inými komponentmi. T. j. získavame abstrakciu fyzického hardvéru, ktorá umožňuje spustiť na jednom počítači množstvo virtuálnych počítačov.
Nainštalovaná VM môže rôzne zaujímať miesto na disku počítača:
- pevným miestom na pevnom disku, čo umožňuje rýchlejší prístup k virtuálnemu pevnému disku a vyhýba sa fragmentácii súboru;
- dynamickým prideľovaním pamäte. Pri inštalácii dodatočných aplikácií bude pamäť dynamicky pridelená pre ne, až kým nedosiahne maximálny objem, ktorý jej bol pridelený.
Čím viac virtuálních strojů na server, tým viac miesta zaberajú, a tiež vyžadujú neustálu podporu prostredia potrebného na fungovanie vašej aplikácie.
Docker — je softvér na vytváranie aplikácií na báze kontajnerov. Kontajnery a virtuálne stroje majú podobné výhody, ale fungujú odlišne. Kontajnery zaberajú menej miesta, pretože zdieľajú viac spoločných zdrojov hostiteľského systému ako VM, pretože na rozdiel od VM zabezpečuje virtualizáciu na úrovni OS, a nie hardvéru. Tento prístup zabezpečuje menší objem zaberanej pamäte, rýchle nasadenie a jednoduchšie škálovanie.
Kontejner poskytuje efektivnejší mechanizmus encapsulácie aplikácií a zabezpečuje potrebné rozhrania hostiteľského systému. Táto funkcia umožňuje kontejnerom zdieľať jadro systému, pričom každý z kontejnerov funguje ako samostatný proces hlavného operačného systému, ktorý má vlastný súbor oblastí pamäte (vlastný virtuálny adresný priestor). Keďže virtuálny adresný priestor každého kontajnera je samostatný, údaje patriace rôznym oblastiam pamäte nemôžu byť zmenené.
Nativný operačný systém pre Docker je Linux (Docker sa dá použiť aj na Windows a MacOS), využíva jeho hlavné výhody, ktoré umožňujú organizovať rozdelenie jadra. Spustenie Docker kontajnerov na Windows prebieha vo virtuálnom stroji s operačným systémom Linux, pretože kontajnery zdieľajú operačný systém hostiteľského systému a hlavným operačným systémom pre ne je Linux.
Kontejner — ako to funguje?
Kontejner — je abstrakcia na úrovni aplikácie, ktorá spája kód a závislosti. Kontajnery sú vždy vytvárané z obrazov, pričom sa pridáva zapisovateľná horná vrstva a inicializujú sa rôzne parametre. Keďže kontajner má vlastnú zapisovaciu vrstvu a všetky zmeny sú uložené v tejto vrstve, niekoľko kontajnerov môže spoločne pristupovať k rovnakému základnému obrazu.
Každý kontajner sa dá nakonfigurovať cez súbor v projekte docker-compose, ktorý je súčasťou hlavného riešenia — docker-compose.yml. Tu môžeme nastaviť rôzne parametre, ako je názov kontajnera, porty, identifikátory, obmedzenia zdrojov a závislosti medzi inými kontajnermi. Ak v nastaveniach nezadáme názov kontajnera, Docker každýkrát vytvorí nový kontajner a priradí mu náhodne generované meno.
Keď sa kontajner spúšťa z obrazu, Docker pripojí súborový systém na čítanie a písanie nad akékoľvek nižšie vrstvy. Práve tu sa budú vykonávať všetky procesy, ktoré chceme, aby náš kontajner Docker vykonával.
Keď Docker prvýkrát spúšťa kontajner, počiatočná vrstva na čítanie a písanie je prázdna. Keď dôjde k zmenám, sú aplikované na túto vrstvu; napríklad, ak chcete zmeniť súbor, tento súbor bude skopírovaný z nižšej vrstvy len pre čítanie do vrstvy na čítanie a písanie.
Verzia súboru, ktorá je dostupná len na čítanie, stále bude existovať, ale teraz je skrytá pod kópiou. Na ukladanie údajov, bez ohľadu na životný cyklus kontajnera, sa používajú objemy. Objemy sa inicializujú pri vytváraní kontajnera.
Ako je obraz spojený s kontajnerom?
Obraz je základným prvkom každého kontajnera. Obraz sa vytvára z Dockerfile pridaného do projektu a predstavuje súbor súborových systémov (vrstiev) navrstvených na seba a zoskupených spolu, dostupných iba na čítanie; maximálny počet vrstiev je 127.
Na základe každého obrazu je základný obraz, ktorý je určený príkazom FROM – vstupný bod pri vytváraní obrazu Dockerfile. Každá vrstva je readonly vrstva a je reprezentovaná jedným príkazom, ktorý modifikuje súborový systém zapísaný v Dockerfile.
Na skombinovanie týchto vrstiev do jedného obrazu Docker používa pokročilý viacerovrstvový súborový systém (AuFS je postavený na UnionFS), čo umožňuje rôznym súborom a adresárom z rôznych súborových vrstiev priehľadne sa prekryť, čím sa vytvára prepojený súborový systém.
Vrstvy obsahujú metadáta, ktoré umožňujú uchovávať sprievodné informácie o každej vrstve počas behu a zostavovania. Každá vrstva obsahuje odkaz na ďalšiu vrstvu; ak vrstva nemá odkaz, znamená to, že je to najvyššia vrstva v obraze.
Dockerfile môže obsahovať také príkazy ako:
- FROM – vstupný bod pri vytváraní obrazu;
- MAINTAINER – meno vlastníka obrazu;
- RUN – vykonáva príkaz počas stavby obrazu;
- ADD – skopíruje súbor hostiteľa do nového obrazu; ak sa uvedie URL súboru, Docker ho stiahne do určeného adresára;
- ENV – premenné prostredia;
- CMD – spúšťa vytvorenie nového kontajnera na základe obrazu;
- ENTRYPOINT – príkaz sa vykonáva pri spustení kontajnera.
- WORKDIR – pracovný adresár pre vykonanie príkazu CMD.
- USER – nastavuje UID pre kontajner vytvorený na základe obrazu.
- VOLUME – montuje adresár hostiteľa do kontajnera.
- EXPOSE – súbor portov počúvajúcich v kontajneri.
Ako funguje UnionFS?
UnionFS — služobný stohovací súborový systém (FS) pre Linux a FreeBSD. Tento FS implementuje mechanizmus kopírovania pri zápise (Copy-On-Write, COW). Pracovnou jednotkou UnionFS je vrstva, pričom každú vrstvu treba považovať za samostatný, plnohodnotný súborový systém s hierarchiou adresárov od samotného koreňa. UnionFS vytvára zjednotené pripojenie pre iné súborové systémy a umožňuje užívateľom bezproblémovo kombinovať súbory a adresáre rôznych súborových systémov (nazývaných vetvami) do jedného súvisiaceho súborového systému.
Obsah adresárov s rovnakými cestami sa zobrazí spolu v jednom zjednotenom adresári (v jednotnom mennom priestore) výsledného súborového systému.
UnionFS kombinuje vrstvy podľa nasledujúcich princípov:
- jedna z vrstiev sa stane vrstvou najvyššou, druhá a ďalšie vrstvy budú vrstvami nižšími;
- užívateľovi sú objekty vrstiev prístupné „zhora nadol“, t.j. ak je požadovaný objekt v „vyššej“ vrstve, vráti sa ten, bez ohľadu na prítomnosť objektu s rovnakým menom v „nižšej“ vrstve; inak sa vráti objekt z „nižšej“ vrstvy; ak požadovaný objekt nie je ani tam, ani tam, vráti sa chyba „Taký súbor alebo adresár neexistuje“;
- pracovná vrstva je „vyššia“, teda všetky akcie užívateľa na zmeny dát sa odrážajú iba na vrstve najvyššej, bez ovplyvnenia obsahu vrstiev nižších.
Docker je najrozšírenejšia technológia používania kontajnerov pri práci s aplikáciami. Stal sa štandardom v tejto oblasti, vychádzajúc z cgroups a menného priestoru, ktorý zabezpečuje jadro Linux.
Docker nám umožňuje rýchlo nasadzovať aplikácie a maximálne optimálne využívať súborový systém vďaka rozdeleniu jadra OS medzi všetkými kontajnermi, pričom pracuje ako samostatné procesy OS.
Zdroj: habr.com
