7.4 Docker

Docker je Open Source projekt umožňujúci nasadenie aplikácií do softvérových kontajnerov. Docker kontajner  zabaľuje časť softvéru do kompletného súborového systému, ktorý obsahuje všetko potrebné pre jeho beh (kód, runtime, systémové nástroje, systémové knižnice). Tento prístup zaručuje bezproblémový beh aplikácie bez ohľadu na prostredie, v ktorom beží

V Linuxe využíva Docker existujúce virtualizačné a izolačné funkcie dostupné v jadre Linuxu (najme cgroups a namespaces)  a UFS.

Namespaces zabezpečujú pre Docker požadovanú izoláciu, t.j. aby kontajnery zobrazovali iba vlastné prostredie. Kontajnery tak:

  • neovplyvnia ostatné kontajnery ani hostiteľské prostredie,
  • majú obmedzený prístup k súborovému systému a dávajú kontajnerom všetky práva, ktoré sú nad úrovňou kontajnera,
  • poskytujú vlastné virtuálne sieťové adaptéry, ktoré umožňujú prideliť jedinečnú IP adresu a názov hostiteľa pre každý kontajner.

Cgroups zabezpečujú rovnováhu medzi zdrojmi t.j. zabezpečujú prideľovanie zdrojov každému kontajneru a zabraňujú nadmernému využívaniu daných zdrojov niektorým z kontajnerov.

UFS (Union File System) je súborový systém ktorý umožňuje, aby sa niekoľko systémových súborov navzájom prekrývalo a javilo sa ako jeden súborový systém.  Obraz súborového systému je tvorený viacerými vrstvami -  každá vrstva je systémový súbor určený len na čítanie a každá z týchto vrstiev je zahrnutá v každej inštrukcii, ktorá je uvedená v súboroch Dockerfiles. Docker má viaceré dostupné ovládače úložiska pre UFS, tie sú však väčšinou závislé od systému.

Vďaka UFS je v Dockeri každá nová vrstva umiestnená na vrchu predchádzajúcich vrstiev.  Posledná vrstva sa zobrazí po spustení obrazu ako kontajner.

Architektúra Docker kontajnera

Obr. 2 Architektúra Docker kontajnera

Docker Engine ešte pridáva nad všetky predchádzajúce vrstvy súborový systém na čítanie a zápis, ako aj ďalšie parametre nastavenia, ako napríklad meno, ID, zdroj, limity a IP adresu. Okrem toho je možné v UFS zdieľať bežné súbory a knižnice.

Komponenty Docker architektúry

Docker Engine - je základná súčasť technológie Docker. Umožňuje tvorbu, beh a správu kontajnerov, čo je zabezpečované prostredníctvom Docker démona ktorý beží na pozadí hosťujúceho systému. Na komunikáciu s ním je použitý protokol http. Pomocou Docker klienta možno ovládať vzdialeného Docker démona, ktorý beží napr. na inom serveri. Docker klient je prostredie príkazového riadku pre používateľov, ktorí komunikujú s Docker démonom.

Docker obraz – je to jedna zo základných súčastí systému Docker (základná jednotka, alebo šablóna pre tvorbu kontejnerov). Obrazy sú zdielané cez Docker HUB. Každý používateľ Docker, si môže vytvoriť vlastný obraz a potom ho zdielať na Docker HUB-e. Docker HUB poskytuje mnoho oficiálnych obrazov: jednotlivých OS (Ubuntu, Debian, CentOS), alebo konkrétnych programov, aplikácií a technológií (napr. MySQL).

Docker kontajner - je jeden z komponentov Docker. Kontajnery sú vytvorené a rozmiestnené pomocou obrazov, ktoré obsahujú niektoré aplikácie a služby a jeden alebo viac procesov, ktoré sú spustené vo vnútri kontajnera.

Obrazy sú považované za základný stavebný prvok systému Docker a kontajnery za jeho výkonnú funkciu.

Každý kontajner má vo vnútri jediný softvérový obraz a má schopnosť vykonávať množstvo operácií, ako je vytváranie, spustenie, zastavenie, odstraňovanie a presun kontajnerov.

Docker Registry je služba alebo tiež register pre ukladanie a zdieľanie Docker obrazov. Východiskovým a oficiálnym registrom je Docker HUB (každý si môže na svojom serveri prevádzkovať svoj vlastný register).

Spustenie  Docker kontajnera

Obr. 3 Spustenie  Docker kontajnera

Ako príklad uvedieme postup spustenia kontajnera, ktorý obsahuje operačný systém Linux (vid. Obr. 3):

  1. Docker klient kontaktuje Docker démona so žiadosťou o spustenie kontajnera, ktorý je vytvorený z obrazu Linux OS.
  2. Docker démon skontroluje, či je obraz dostupný na lokálnom počítači. Ak nie, tak ho stiahne z registra Docker HUB.
  3. Ak je obraz dostupný, vytvorí z neho nový kontajner a spustí v ňom definovaný proces, napr. „bash“.

Práca s docker kontajnermi vyžaduje práva administrátora. Častým riešením je dať práva na prácu s kontajnermi vybranému používateľovi. Postup udelenia práv používateľovi „student“ je nasledovný: 

     usermod  -aG  docker  student
     systemctl  enable  docker


Ďalšie nástroje na podporu Docker kontajnerov

Docker Compose - je nástroj na definovanie a spustenie multikontajnerovej Docker
aplikácie. Zjednodušuje konfiguráciu a nasadenie kontajnerov a aplikácií. Na popis konfigurácie používa čitateľné súbory s koncovkou .yml a .yaml.  

Docker SWARM - je riešenie pre vytvorenie klastra z viacerých serverov, na ktorých je nainštalovaný Docker. (Pôvodne išlo o samostatný  nástroj, od verzie 1.12 je integrovaný do Docker Engine.) SWARM je tvorený jedným alebo viacerými Docker Engine, ktoré využívajú funkciu „swarmkit“ pre všetky funkcie správy klastra a orchestrácie. Režim SWARM sa môže povoliť buď vytvorením nového alebo pripojením existujúceho SWARM klastra.          
SWARM je tvorený tzv. uzlami (Docker Engine). Existujú dva typy uzlov:

  • správcovia               (manager)
  • pracovné uzly          (worker)

Docker SWARM

Obr. 4 Docker SWARM

Docker SWARM uzly vykonávajú tiež funkciu orchestrácie klastra, ktorá je potrebná na udržanie požadovaného stavu. V rámci SWARM môže byť niekoľko správcovských uzlov, ale vždy len jeden tzv. líder. SWARM líder je zvolený všetkými ostatnými správcami a vykonáva všetky úlohy orchestrácie.

Pracovné uzly prijímajú a vykonávajú úlohy z uzlov správcu. V predvolenom nastavení sú uzly správcu tiež pracovné uzly, ale môžu byť nakonfigurované tak, aby neprijímali žiadne pracovné zaťaženie. Na každom pracovnom uzle je agent, ktorý posiela hlásenia o stave svojich úloh správcom.

Pri používaní Docker SWARM sa nepublikujú kontajnery, ale služby. Služba je definícia jednej, alebo viacerých úloh, ktoré sa majú vykonať na pracovných uzloch. Pri vytváraní služby je potrebné určiť obraz kontajnera, ktorý sa má použiť a príkazy, ktoré sa majú vykonať vo vnútri kontajnerov.

Služba môže byť globálna alebo replikovaná. Rozdiel medzi nimi je nasledovný:

  • globálna služba – spustí sa raz na každom dostupnom uzle,
  • replikovaná služba - správca distribuuje daný počet úloh na uzly na základe požadovaného počtu replík.


Architektúra siete Docker

Docker kontajnery a služby je možné prepájať priamo na hosťovskom OS. V predvolenom nastavení sú ovládače, ktoré poskytujú funkčnosti:

  • Bridge - predvolený ovládač.  Používa sa, keď aplikácie bežia v samostatných kontajneroch, ktoré potrebujú medzi sebou komunikovať.
  • Host - pre samostatné kontajnery odstraňuje izoláciu siete a to menovite medzi kontajnerom a hostiteľom Docker pre priame použite siete hostiteľa.
  • Macvlan - umožňujú priradiť kontajneru MAC adresu, čím sa v sieti zobrazí ako fyzické zariadenie.
  • None - pri tejto voľbe sa na kontajneri vypínajú všetky siete. Obvykle sa používa v spojení s vlastným ovládačom siete.
  • Overlay - prekrývajúce siete spájajú viacero démonov Docker a umožňujú navzájom komunikovať službám v rámci SWARM. Môžu sa použiť aj na uľahčenie komunikácie medzi SWARM službou a samostatným kontajnerom alebo medzi dvoma samostatnými kontajnermi na rôznych démonoch Docker. (Odstraňuje potrebu robiť smerovanie na úrovni OS medzi kontajnermi.)

Docker Overlay sieť

Obr. 5 Docker Overlay sieť

Overlay sieťové prepojenie v Dockeri používa tunely VXLAN (VXLAN umožňujú vytvárať virtuálnu sieť druhej vrstvy nad existujúcou infraštruktúrou tretej vrstvy.) Každý koniec tunelu VXLAN je ukončený koncovým bodom VXLAN Tunnel Endpoint (VTEP). Ten vykonáva zapuzdrenie, rozbalenie a ďalšie procesy, ktoré sú potrebné pre prenos.