Docker (Windows containers)

Docker (Windows containers)
« kdy: 04. 12. 2020, 11:06:26 »
Ahoj rád bych si nějak ucelil informace o kontejnerech (konkrétně na Windows), přečetl jsi spustu informací a zajímalo by mě jestli to tedy chápu správně  :)

Pomocí kontejnerů se dá vytvořit v operačním systému izolované prostředí pro běh aplikace, pro správný běh aplikace je třeba do kontejneru přidat služby které aplikace vyžaduje. Pokud by tedy v kontejneru byla samotná aplikace tak by nefungovala správně? (pokud tedy nebude udělaná tak že nepotřebuje žádné další služby)

V praxi to funguje jak? Pomocí dockeru se vytvoří jeden soubor -> image který obsahuje všechny potřebné soubory a služby pro běh aplikace a tento image se spustí opět pomocí dockeru. Jakou roli nebo co je tedy vlastně Windows Containers když je k tomu stejně potřeba docker?

EDIT: mám to na seminární práci a nechci to jen tupě opsat z internetu ale abych to opravdu pochopil.

Díky za pomoc
« Poslední změna: 04. 12. 2020, 11:09:09 od Artii »


Mlocik97

  • *****
  • 531
  • In love with Linux
    • Zobrazit profil
    • E-mail
Re:Docker (Windows containers)
« Odpověď #1 kdy: 04. 12. 2020, 11:40:23 »
Windows containers ani neviem že existujú, ak áno, predpokladám že fungujú podobne ako LXC v Linuxu. Takže napíšem sem porovnanie LXC a Docker. Síce mám s dockerom skôr len základné skúsenosti, ale dúfam pomôžem.

LXC je izolované prostredie, v ktorom môže bežať service (služba) resp. daemon alebo aplikácia... je viazané na OS, a využíva volania systému s omezeným prístupom, kde sa napríklad pre aplikáciu vyčlenujú izolované prostriedky. Ale v podstate tá aplikácia aj tak beží hneď nad systémom.

Docker bych ani nepovedal že je kontajner než skôr image file a nástroj pre obsluhu imagu. Všetky závislosti aj s appkou samotnou sú zapísané v image (neviem či celé knižnice alebo len meta informácie) a funguje ďalej od systému... typicky sa image dockeru používa pre beh serverovskej aplikácie alebo web stránky, pričom docker image sa spúšťa v PaaS, určitých virtualizacnych softwaroch, alebo orchestrealnych nastrojoch typu Kubernetes (K8s), a až tieto nástroje zabezpečujú samotnú izoláciu.
« Poslední změna: 04. 12. 2020, 11:44:13 od Mlocik97 »
I literally don't want to be human... humans are so dumb... I'm ashamed to be part of "humanity".

Re:Docker (Windows containers)
« Odpověď #2 kdy: 04. 12. 2020, 12:54:18 »
Je potreba rozlisit kontejner a Docker.

Kontejner obecne je izolovany prostredi, kterymu muzes priradit vypocetni zdroje. Izolovany znamena, ze aplikace v kontejneru nemuze svevolne komunikovat s aplikacema mimo kontejner, nemuze cist/zapisovat data mimo kontejner, atp. To je implementovany v linuxu pomoci "namespaces". Prirazovani zdroju, znamena, ze muzes priradit limity (pamet, CPU, ...) pro urcity kontejner, to chrani pred tim, aby kontejner vycerpal vsechny zdroje systemu. Toto je implementovany v linux pomoci "cgroups". V kontejneru muze bezet samotna aplikace pokud nepotrebuje sluzby jinych aplikaci nebo knihoven, v takovym pripade je nutny pridat i tyto aplikace/knihovny do kontejneru.

Vytvorit kontejner rucne neni trivialni vec (vytvorit namespace, nastavit cgroups), proto vznikly nastroje pro management techto operaci, napr.: Docker, LXC. Tyto nastroje umozni spravovat vytvaret image (balicky aplikaci + dat + knihoven), nastavovat namespaces, alokaci zdroju, atp.

Ve windows to bude fungovat obdobne (pokud ne, tak me snad nekdo opravi). Docker vytvori/ziska image kontejneru a nastavi mechanismus Windows Containers tak aby spustil tento image se zadanyma parametrama.



Jose D

  • *****
  • 647
    • Zobrazit profil
Re:Docker (Windows containers)
« Odpověď #3 kdy: 04. 12. 2020, 13:07:36 »
pokud se nepletu, tak Docker na Windows nefunguje nativně, ale vytvoří si Linux VM a v té pak funguje standardně.

Relativně novější přístup/Docker backend používá WSL, což je ale opět linux kernel běžící skrze windows virtualizaci.

Re:Docker (Windows containers)
« Odpověď #4 kdy: 04. 12. 2020, 13:27:00 »
Nevím, čemu říkáte „přiřadit služby“. Obecně kontejnery fungují tak, že pro aplikaci uvnitř kontejneru to vypadá,jako by běžela ve svém operačním systému. Ve skutečnosti ale služby operačního systému zajišťuje hostitelský operační systém, akorát je zajišťuje tak, aby program uvnitř kontejneru neviděl mimo svůj kontejner. Uvnitř kontejneru tedy musí být programy, které program v kontejneru přímo volá, a musí tam být knihovny, které ty programy používají. Takže typicky bude v kontejneru runtime knihovna pro C a další používané knihovny. Pokud budete mít třeba kontejner, který naklonuje Git repository a třeba aplikaci (třeba v Javě), bude v tom kontejneru Git, Java, Gradle – a pak nějaký váš skript, který se spustí při startu kontejneru a spustí potřebné kroky.

To oddělení funguje (velmi zjednodušeně řečeno) tak, že aplikace z kontejneru zavolá funkci operačního systému, třeba „dej mi seznam všech běžících procesů“. Zavolá přímo funkci jádra hostitelského operačního systému, není tam žádné další jádro systému, jako u klasické virtualizace. Ale jádro operačního systému ví, který proces tu funkci volá, zjistí, že je to proces uzavřený v kontejneru, a tak profiltruje seznam všech procesů v systému a vrátí jenom ty, které běží ve stejném kontejneru. A takhle ošetřena jsou i všechna ostatní volání operačního systému – takže jakmile po jádru operačního systému chce něco proces uzavřený v kontejneru, jádro o tom ví a vrací procesu informace tak, aby to pro ten proces vypadalo, že existuje jenom vnitřek toho kontejneru a nic víc.

Naopak tam nemusí být (a neměly by být) služby, které kontejner volá přes síť. Třeba pokud budete mít aplikaci používající databázi, databáze typicky nebude součástí kontejneru, ale bude se používat přes síť )a může běžet třeba v jiném kontejneru).

Na Windows je to pak ještě trochu komplikovanější. Můžete tam spouštět kontejnery určené pro Linux (těch je většina). To se pak ve Windows spustí normální virtuální počítač, ve kterém běží Linux, a uvnitř linuxu se spustí ten linuxový kontejner. Existují ale také Windows kontejnery, které běží přímo pod Windows. Mohou využívat jen základní funkce Windows (pro kontejnery nejsou dostupné všechny služby Windows, jen některé, bez GUI). Takový kontejner pak běží přímo pod Windows, tj. není tam ten Linux spuštěný ve virtuálním počítači.


Re:Docker (Windows containers)
« Odpověď #5 kdy: 04. 12. 2020, 20:42:22 »
"kontajner" je termin pre akekolvek oddelene prostredie pre beh aplikacie. Kontajner sa da velmi vagne predstavit ako virtualna masina, ktora ale bezi na rovnakom kerneli, a teda vie selektivne zdielat resources s vonkajsim svetom. Linux ma na vytvaranie kontajnerov nastroje cgroups a namespaces, Windows ma HCS (Host Compute Service, alebo aj Windows Containers).

Tieto nastroje umoznuju na nizkej urovni nastavit potrebne urovne izolacie (izolaciu diskov (kontajner vidi svoj obraz disku, nie vonkajsie disky (C:, D:, ...), ale vie vidiet aj ich casti, alebo celky, podla toho ako mu to dovolis), izolaciu sieti (kontajner vie vidiet niektore tvoje sietove adaptery, alebo nemusi mat ziadny, alebo mu vies vytvorit bridge, ...), izolaciu CPU/Memory (kontajner vie pripadne vidiet iba cast tvojich CPU alebo pamati), izolaciu procesov (kontajner moze nemusi byt informovany o tom, co sa deje mimo neho), .........)

Docker je jednoduchy user interface pre pouzivanie tychto low level nastrojov. Jeho najvyraznejsia funkcia je, ze umoznuje jednoducho vytvarat obraz kontajneru pomocou prikazov vykonavanych nad existujucim obrazom disku (zober zakladny Windows Core, nainstaluj donho tento .msi subor, pridaj tychto X suborov, etc..), a jednoducho distribuovat obrazy kontajnerov cez verejne aj sukromne registre obrazov. Pouzivam termin "obraz kontajneru", a nie "obraz disku", lebo docker image nie je len obraz disku, ale obsahuje aj rozne metadata o tom, akym sposobom z toho obrazu sa ma vytvorit kontajner ak clovek neuvedie inak (i.e. informacie, ktore porty forwardnut (defaultne Docker vytvara pre kontajner podsiet za NATom), informacie, ktoru aplikaciu a s akym cmdline z dockeru defaultne pustit, s akymi ENV premennymi pustit danu aplikaciu, ...).

Cely backend Windows Containers bol dost prisposobovany Docker-u, ale pouzivaju ho aj ine Windows sluzby, napr. Windows Sandbox a WSL2 (Da sa teda povedat, ze ked pouzivas na Windows-e Linuxovy Docker cez WSL2, bezis kontajner vnutri kontajnera).

Docker okrem toho umoznuje so standardizovanym User Interface / API robit vselijake veci, ako napr. spustat veci vzdialene na inych pocitacoch, spustat veci pre inu architekturu vo virtualnej masine (napr. viem na x86-64 procesore spustit ARM64 image a Docker ho automaticky spusti v QEMU), vytvarat klastre pocitacov na ktorych vedia sluzby bezat redundantne (docker swarm), umoznuje existenciu rovnako nazvaneho image pre rozne platformy a teda pouzitie toho isteho prikazu pre spustenie dockerizovanej aplikacie na ARM64 aj na x86-64, apod...,