Docker kontajnery verzus virtualizácia
Docker kontajnery aj virtuálne stroje sa využívajú na beh aplikácií v izolovanom prostredí, ale majú zásadné rozdiely vo svojej architektúre a využití zdrojov. Na rozdiel od klasickej virtualizácie kontajnerizácia nepoužíva virtualizačnú vrstvu, napríklad hypervízor, ale využíva služby jadra hostiteľského operačného systému, čo znižuje preťaženie CPU, pamäte, uľahčuje škálovanie a prenášateľnosť vďaka malým súborom definujúcim prostredie na beh aplikácií. Zároveň je dosiahnutá určitá izolácia oproti ostatným procesom bez nutnosti prevádzkovať celý operačný systém iba pre jedinú aplikáciu či vývojové prostredie. Na rozdiel od obrazov na virtualizáciu, ktoré obsahujú aj kompletný operačný systém, takže spravidla zaberajú niekoľko gigabajtov, sú obrazy Docker veľmi malé. Docker virtualizuje len aplikačnú vrstvu, nie operačný systém.
Docker
Docker je otvorená platforma na vývoj, distribúciu a spúšťanie aplikácií. Umožňuje oddeliť aplikácie od infraštruktúry, aby ste ich mohli rýchlo nasadiť, prípadne pokračovať vo vývoji. Docker poskytuje možnosť zbaliť a spustiť aplikáciu vo voľne izolovanom prostredí nazývanom kontajner. Kontajnery vytvárajú prostredie na beh programu a pri behu využívajú hardvér prostredníctvom vášho operačného systému. Sú to však oddelené entity, ktoré bežia v izolovaných sandboxoch. Všetko potrebné na beh aplikácie je predinštalované v kontajneri, takže sa nemusíte spoliehať na to, čo je nainštalované na hostiteľskom počítači.
Napríklad potrebujeme vytvoriť prostredie na deep learning a trénovanie neurónových sietí vo Windows. Prostredie obsahuje platformu Anaconda, PyTorch a rôzne ďalšie knižnice, takže môžeme začať navrhovať neurónovú sieť, napríklad v Pythone. Následne potrebujeme z nejakého dôvodu pokračovať v Linuxe, napríklad preto, že niektorá z knižníc, ktorú potrebujeme, nie je k dispozícii pre Windows. Alebo vývojár pracuje v Linuxe a následne do tímu pribudne kolega, ktorý chce pracovať vo Windows. Bolo by prácne znovu inštalovať rovnaké prostredie, nehovoriac o možnom nesúlade platforiem, verzií vývojárskych nástrojov či knižníc (napríklad rôzne verzie platformy NVIDIA CUDA a knižnice PyTorch). Odstránenie prípadného nesúladu je spravidla pomerne prácne.
Riešením je kontajnerizácia, ktorá umožňuje zabaliť všetko potrebné, teda aplikáciu, prípadne vývojové prostredie, so všetkými potrebnými knižnicami a konfiguráciou. Takto zabalený „balík“ je následne ľahko prenosný medzi platformami. Aby sme boli úplne presní balík, v našej terminológii image obsahuje predpis, ako nakonfigurovať operačné prostredie, a všetko, čo je na to potrebné. Takto zabalenú aplikáciu môžete presunúť do akéhokoľvek operačného prostredia (Linux, Windows, Mac OS), ktoré podporuje kontajnerizáciu, prípadne zdieľať.
V prípade vývoja deep learnigu modelov bude v balíku zabalené všetko potrebné na vývoj. Ak chcete túto problematiku študovať na praktických príkladoch, prípadne programovať a trénovať neurónové siete, stačí vám použiť kontajner, ktorý pripravil a sprístupnil dodávateľ platformy (TensorFlow, PyTorch) alebo iný vývojár.
Aplikácia s operačným prostredím a všetkými závislosťami je zabalená v niekoľkých vrstvách nazývaných obrazy.
Napríklad kontajner na deep learning bude obsahovať vrstvy:
- Visual Studio Code
- PyTorch
- Anaconda
- Python 3.10
- Linux (tenké jadro)
Všetky tieto vrstvy obrazov skombinované spolu sa nazývajú Docker Image, po našom Docker Obraz. Dôležité je pochopiť, aký je rozdiel medzi obrazom a kontajnerom.
Obraz (Image) je šablóna, ktorá obsahuje súbor inštrukcií na vytvorenie kontajnera. Obrazy sa po vytvorení už nemôžu zmeniť. Sú uložené v Docker registri, napríklad Docker Hube, a môžu byť stiahnuté (pull) a použité na vytvorenie kontajnerov. Obrazy sú často vytvárané pomocou Dockerfile, ktorý obsahuje príkazy na zostavenie obrazu (Image). Obrazy sú základné stavebné bloky, z ktorých sú vytvárané kontajnery. Skladajú sa z jednotlivých vrstiev, ktoré tvoria inštrukcie. Tieto vrstvy slúžia iba na čítanie, ale vo chvíli, keď je spustený kontajner, Docker pripája na vrchol týchto vrstiev prázdnu read-write vrstvu, kde sú spúšťané jednotlivé procesy. Ak dôjde k vykonaniu nejakej zmeny, napríklad skopírovaniu existujúceho súboru do iného umiestnenia, vykoná sa to tak, že sa z read-only vrstvy vytvorí kópia súboru. Verzia súboru z read-only vrstvy stále existuje, ale je schovaná pod kópiou.
Kontajner je prostredie, ktoré vznikne po spustení obrazu Docker a obsahuje všetko potrebné na spustenie aplikácie či vývojového prostredia.
Vzťah medzi obrazom a kontajnerom je podobný ako medzi plánom stavby a hotovou postavenou budovou. Obraz je ekvivalentom plánu, je to predpis ohľadne tvaru, materiálov a ďalších záležitostí. Podľa plánu sa dá postaviť dom a dom je ekvivalentom kontajnera. Plány si môžeme nechať vytvoriť na mieru, prípadne si vybrať plán z katalógu. Katalóg hotových projektov je ekvivalentom registra obrazov. Tento register môže byť privátny, čiže ide o obrazy vo vašom PC, alebo verejný na portáli Docker Hub, kde sú verejne dostupné obrazy. Na tento hub môžete zverejňovať svoje obrazy a tie potom môžu využiť prípadní záujemcovia. Firmy alebo niektoré komunity vývojárov môžu mať aj primárne neverejné registre, kde obrazy môžu zdieľať len autorizovaní používatelia.
Ak použijeme analógiu s objektovo orientovaným programovaním, obraz je trieda a kontajner je jej inštancia. Kontajnery sú izolované a majú vlastný súborový systém, procesy, pamäť a ďalšie zdroje. Sú prenosné a konzistentné v rôznych prostrediach, pretože všetky závislosti sú zabalené v obraze. Kontajnery môžu byť spustené, zastavené, presunuté alebo zmazané. Pri zmene stavu alebo údajov v kontajneri sa obraz nezmení. Inak povedané, Docker Image slúži ako nemenný predpis na vytvorenie kontajnera, zatiaľ čo Docker kontajner je dynamická, spustená inštancia podľa tohto predpisu.
Kompatibilita
Trochu zložitejšie je to s kompatibilitou. Virtuálne stroje možno nainštalovať na akýkoľvek PC, ktorý podporuje virtualizáciu. Kontajnery s Linuxom naproti tomu nemôžete nainštalovať na počítače so staršími verziami Windows. Budú fungovať len vo Windows 11 a 10, ktoré podporujú WSL čiže Windows Subsystem for Linux.
Docker Desktop pre Linux, Windows alebo Mac OS nainštalujete zo stránky docker.com. Pre Windows treba mať nainštalovaný WSL (Windows Subsystem for Linux) vo verzii 2. Takisto musí byť v BIOSe povolená podpora virtualizácie hardvéru a musí byť povolená funkcia Hyper-V. Ohľadne Linuxu sú na stránke docker.com opísané postupy inštalácie pre distribúcie Debian, Fedora, Ubuntu a Arch. Podmienkou je podpora KVM (Kernel-based Virtual Machine) virtualizácie.
Inštalácia Docker Desktop je jednoduchá, stačí stiahnuť a spustiť inštalačný súbor. Po spustení sú v aplikácii záložky Containers, Images, Volumes, Dev Enviroments a Extensions. Na hlavnej stránke nájdete ponuku, ako spustiť príklad s cvičným kontajnerom. Stačí skopírovať príkaz a spustiť ho cez terminálovú aplikáciu, napríklad Príkazový riadok (Command Prompt) alebo aplikáciu Windows Power Shell. Keď v týchto aplikáciách napíšete docker, zobrazí sa zoznam príkazov.
Ak potrebujeme nejaké prostredie, napríklad platformu TensorFlow na strojové učenie, nemusíme ju prácne inštalovať vrátane knižníc NVIDIA CUDA, ale vyhľadáme v repozitári už existujúci obraz. Docker sa bude snažiť hľadať obraz najskôr v lokálnom registri, a ak ho tam nenájde, bude hľadať na Docker Hube. Napríklad pre TensorFlow:
docker search tensorflow
Následne si vyberiete z ponúkaných možností, napríklad jupyter/tensorflow-notebook.
Obraz stiahnete príkazom:
docker pull jupyter/tensorflow-notebook
a spustíte ho príkazom
docker run -p 8000:8888 jupyter/tensorflow-notebook
Resumé
Docker kontajnery sa vo väčšine prípadov rýchlejšie spustia a budú aj rýchlejšie bežať ako virtuálne počítače, pretože aplikačná vrstva bude komunikovať priamo s jadrom OS hostiteľského PC. Každý kontajner beží ako izolovaný proces v používateľskom priestore hostiteľského systému. Docker kontajnery sú preto ideálne na mikroslužby, kontinuálne nasadzovanie a integráciu a vývoj aplikácií, kde je potrebná rýchlosť, škálovateľnosť a portabilita. Naproti tomu virtuálne stroje majú vlastnú inštanciu operačného systému a sú spravované hypervízorom, ktorý beží na fyzickom hardvéri, takže poskytujú úplnú izoláciu na úrovni hardvéru. Sú ideálne na scenáre, kde je potrebná kompatibilita s rôznymi operačnými systémami.
Úvodný obr. zdroj: SHUTTERSTOCK.COM