Windows Containers

Jednou z velmi očekávaných novinek chystaného serverového operačního systému Microsoftu – Windows Server 2016, je podpora kontejnerů.

Microsoft ve Windows Server 2016 přináší podporu pro 2 druhy kontejnerů - Windows Containers a Hyper-V Containers. My se dnes budeme věnovat prvnímu z nich.

Historie

Kontejnery jako technologie nebyly prapůvodně určeny pro Microsoft Windows, nýbrž pro Linux. Prvním Linuxovým projektem rozvíjejícím myšlenku kontejnerů byl vServer Linux , který spatřil světlo světa v roce 2001, tedy před dlouhými 15ti lety. Velký “kontejnerový” boom ovšem přišel až s projektem zvaným Docker, který byl vypuštěn jako Open Source v roce 2013. Docker dokázal během velmi krátké doby nalákat velké množství vývojářů, včetně velkých hráčů, jako je Red Hat nebo Amazon a tak se stal jakýmsi standardem.

S příchodem Technical Preview 3 Windows Serveru 2016 si můžeme tuto technologii vyzkoušet i ve světě Windows. Microsoft se vůbec netají tím, že na implementaci kontejnerů do Windows úzce spolupracoval právě s Dockerem. Microsoft se rovněž stal zakládajícím členem Open Container Initiative (OCI), což je organizace zabývající se vývojem a standardizací technologie kontejnerů.

Co je to kontejner

Kontejner si lze představit jako virtuální stroj, který ovšem nedisponuje vlastním kernelem, nýbrž využívá kernel systému, nad kterým je spuštěn. V případě, že máme 2 aplikace, které nejsou schopny běžet na jednom OS společně, pak je nutné, je separovat tak, aby se navzájem neovlivňovali. K tomu obvykle použijeme 2 virtuální servery. V datacentru nám tedy běží 2 servery, které jsou naprosto totožné, jen s tím rozdílem, že každý z nich hostuje jinou aplikaci. Každý virtuální server nám ukousne část diskového prostoru a využije část paměti RAM jen pro vlastní provoz. Aplikace běžící na těchto virtuálních serverech ale mohou být na paměť i diskový prostor velice nenáročné. Není to zbytečné plýtvání prostředky? Oba servery jsou přece stejné, nedalo by se to zařídit tak, aby se aplikace navzájem nemohli ovlivňovat, ale sdílet jeden OS? Dalo, pomocí kontejnerů!

Jak vzniká kontejner

Kontejner je vždy nutné vytvořit ze zdrojového image. Ten získáme při konfiguraci Windows Server 2016 pro použití s kontejnery, jak si ukážeme později v tomto článku. Image není v podstatě nic jiného, než k použití připravená instance Windows Server 2016 ve verzi Core nebo Nano. Druhou cestou, jak kontejner vytvořit je jako image použít již existující kontejner.

Při tvorbě kontejneru vznikne kopie zdrojového image, který dostane aplikace k dispozici. Může provádět změny ve svém systému, ukládat další data na disk atd., ale na zdrojový image ani hostující operační systém to nebude mít žádný vliv. Tento proces by se dal přirovnat k tvorbě diferenciálního virtuálního disku, kde diferenciální disk používá obsah původního disku a v sobě obsahuje pouze změny od doby vzniku sebe sama. Výsledkem je oddělený systém nepodobný virtuálnímu serveru, stále využívající prostředků zdrojového OS, ovšem od doby svého vzniku se chovající jako samostatná instance.

K čemu použít kontejnery

Kontejnery jsou v dnešní době zajímavou technologií zejména pro vývojáře. Pro větší rozšíření této technologie na Windows platformě bude třeba zejména jich, neboť právě oni jsou těmi, komu mohou kontejnery zprvu přinést největší benefity.

Jako scénář pro využití kontejnerů je např. vývoj webové aplikace. K tomu, aby vývojářova webová aplikace fungovala, obvykle potřebujete několik komponent. Ve světě Windows by to mohlo vypadat následovně:

· OS - tedy Windows Server 2016

· Webserver - tedy Microsoft IIS

· Runtime – Např. ASP.NET

Vývojář tedy použije tyto 3 základní komponenty, napíše aplikaci a předá jí k testování spolu s popisem prostředí, kde a jak by aplikace měla být testována. Testeři používají také Windows Server 2016 s IIS, ale aplikace nefunguje, jak by měla. Vývojář si tedy láme hlavu nad tím jak je možné, že jemu aplikace fungovala, ale testerům zlobí. Po x hodinách troubleshootingu se zjistí, že testeři neměli správně nakonfigurované IIS. Ztráta času. Kdyby vývojář aplikaci k testování předal ve formě kontejneru, pak by se problémům předešlo.

Dalším benefitem pro vývojáře může být snazší oddělení prostředí jednotlivých zákazníků a tím i zvýšení bezpečnosti. Zůstaňme u příkladu s vývojářem a jeho webovou aplikací. Aplikace je hotová a připravená k nasazení pro více zákazníků. Obvykle by vývojář měl jeden nebo více serverů s IIS (podle velikosti aplikací a počtu zákazníků), kde by provozoval aplikace. Bohužel každý software má nějaké chyby, kterých může být využito k neoprávněnému proniknutí do systému a úniku dat. Kontejnery mohou pomoci s oddělením jednotlivých instancí IIS (a databází) tak, aby když už se někomu do systému podaří proniknout, pak bude mít možnost získat data jen jednoho zákazníka.

Správa kontejnerů

Windows kontejnery lze spravovat buď pomocí PowerShell cmdletů, které jsou nově dostupné ve Windows Server 2016, nebo pomocí Dockeru. My si dnes ukážeme správu pomocí PowerShellu.

Jak kontejnery komunikují

Kontejner se, co se týče jeho síťové konektivity, nijak výrazně neliší od ostatních Windows Server Core/Nano virtuálních strojů - má vlastní virtuální síťový adaptér připojený k virtuálnímu switchi svého hostitele.

Existují 2 typy síťové komunikace kontejnerů:

· NAT Mode – Virtuální síťový adapter kontejneru je připojen k internímu virtuálnímu switchi svého hostitele a je mu přidělena interní IP adresa. NAT následně překládá tuto interní adresu na externí adresu hostitele kontejneru.

· Transparent Mode – Virtuální síťový adapter kontejneru je připojen k externímu virtuálnímu switchi svého hostitele a přijímá IP konfiguraci z DHCP server. Statickou adresu kontejneru nelze nastavit přímo, jedinou možností je rezervace na příslušném DHCP serveru. Toto omezení zajišťuje zvýšenou škálovatelnost a přenositelnost mezi prostředími.

Který z uvedených typů komunikace je použit, určujeme konfigurací virtuálního switche hostitele. Pokud je virtuální switch vytvořen s parametrem -SwitchType NAT, pak se použije NAT Mode, jinak je použit Transparent Mode.

Síťové adaptéry kontejnerů se spravují pomocí následujících PowerShell příkazů, které se používají nikoliv z kontejneru samotného, nýbrž z kontejner hostitele, typicky Windows server 2016, ve kterém kontejner provozujeme.

· Add-ContainerNetworkAdapter - Přidá kontejneru virtuální síťový adaptér.

· Set-ContainerNetworkAdapter - Mění vlastnosti virtuálního síťového adaptéru kontejneru.

· Remove-ContainerNetworkAdapter - Odebere kontejneru virtuální síťový adaptér.

· Get-ContainerNetworkAdapter - Vrátí informace o virtuálním síťovém adaptéru kontejneru.

· Connect-ContainerNetworkAdapter - Připojí síťový adaptér kontejneru k virtuálnímu switchi hosta

· Disconnect-ContainerNetworkAdapter - Odpojí síťový adaptér kontejneru od virtuálnímu swithe hosta

Ukázka práce s kontejnery

Konfigurace systému

Podporu kontejnerů je ve Windows server 2016 třeba zapnout a to přidáním funkce „Containers“.

k1

Zapnutím této funkce ovšem proces konfigurace systému nekončí. Zatím ještě nemáme v systému žádný Container image.

k2

Dále je třeba stáhnout konfigurační PowerShell skript, jehož pomocí mimo jiné do systému přidáme i základní Windows Server Core image, ze kterého můžeme dále vytvářet vlastní kontejnery.

k3

Skript máme stažený, stačí ho tedy spustit.

k4 k5

Po úspěšném doběhnutí skriptu v systému máme kýžený image, můžeme začít s tvorbou kontejneru.

k6

Vytvoření kontejneru

Před samotným vytvořením kontejneru je třeba si vytvořit virtuální switch, do kterého kontejner připojíme. Standardně je v systému přítomen switch typu NAT. V případě, že nám NAT switch vyhovuje, můžeme ho rovnou použít, pokud však NAT použít nechceme, je třeba si vytvořit nový switch bez podpory NATu a to pomocí cmdletu New-VMSwitch.

k7

Pokud provozujeme Windows Server 2016 jako virtuální stroj a chceme použít Transparent Mode, pak je třeba na virtuálním adaptéru tohoto stroje zapnout tzv. MAC address spoofing.

k8

Nyní již můžeme konečně přistoupit k vytvoření nového Windows kontejneru. Použijeme k tomu cmdlet New-Container a přidáme následující parametry:

· Name – Název kontejneru, který vytváříme.

· ContainerImageName – Název image, ze kterého kontejner tvoříme.

· SwitchName – Název virtuálního swithe, ke kterému kontejner připojujeme.

k9

Konfigurace kontejneru jako WebServer

Kontejner je vytvořen. Můžeme ho tedy zapnout pomocí cmdletu Start-Container a připojit se k němu. Připojení ke kontejneru se provádí pomocí PowerShell remotingu stejně, jako k jakémukoli jinému Windows serveru, tedy například pomocí cmdletu Enter-PSSession.

k10

Nyní si můžeme do kontejneru přidat roli WebServer (IIS) a vytvořit si tak třeba kontejner s webovou aplikací.

k12 k13

Pro kompletnost si ještě změníme výchozí stránku za něco vlastního.

k14 k15

Tvorba image z existujícího kontejneru

Pro vytvoření vlastního image (V tomto případě s již nainstalovaným WebServerem) je třeba zdrojový kontejner vypnout cmdletem Stop-Container.

Image vytvoříme pomocí cmdletu New-ContainerImage s následujícími parametry:

· ContainerName – Název zdrojového kontejneru ze kterého bude image vytvořen.

· Name – Název nového image.

· Publisher – autor image.

· Version – verze image.

k16

Více kontejnerů na jednom hostiteli

Kontejnerů můžete mít na jednom Windows server 2016 hostiteli samozřejmě více. Pojďme si tedy stejným způsobem vytvořit další kontejner a vypublikovat si z něj jinou webovou stránku.

k17 k18

V případě, že bychom chtěli šetřit IP adresy, pak by bylo řešením připojení obou kontejnerů ke switchi s podporou NATu (NAT Mode).

Budoucnost kontejnerů patří vývojářům

Windows Containers mohou být výborným nástrojem jak pro vývojáře tak následně i pro administrátory aplikací. Bude ovšem třeba, aby se vývojáři chopili tohoto nástroje a začali jej aktivně využívat, tzn. začít tvořit aplikace tak, aby se daly distribuovat v kontejnerech namísto klasických instalací nebo velkých virtuálních appliance. Provozovatelé těchto aplikací tím mohou získat vysokou škálovatelnost aplikací, snadnější nasazování nových verzí, snazší migraci do jiných nebo novým prostředí a v neposlední řadě i zvýšenou úroveň zabezpečení.

- Marek Kopečný, KPCS CZ

 

Mohlo by vás také zajímat:

Container Fundamentals | Part 1 – Introduction

 

Container Fundamentals | Part 2 - Images, Networking & Portability Container Fundamentals | Part 3 - Shared Folders Container Fundamentals | Part 4 - Resource Management Container Fundamentals | Part 5 - Hyper-V Containers