Ako „kontajnerizovať“ ASP.NET Framework aplikácie v Azure – krok za krokom.


Windows Server 2016 podporuje prevádzkovanie aplikácií v Windows kontajneroch. Kontajnery môžete spravovať aj cez Docker nástroje a ponúknu vám izolované aplikačné behové prostredie. Vytvorené rýchlo, podľa vzoru. Množstvo dostupných príkladov sa špecializuje na vytvorenie aplikačných kontajnerov pre .NET Core. Ale ako vytvoriť Windows kontajnery pre aplikácie používajúce „veľký“ .NET ( čiže .NET Framework) a ešte konkrétnejšie, ako rozbehať ASP.NET webové aplikácie nad vlastne konfigurovaným IIS serverom v Windows kontajneroch podľa jedného vzoru? Pre jednoduchosť a pružnosť vám detailný postup popíšem v prostredí Microsoft Azure. Ak staviate hostiteľské servery pre Windows kontajnery, môžete síce použiť aj domáci server s Windows Server 2016, ale cloud vám umožní flexibilne reagovať na systémové nároky kontajnerov jednoduchým preškálovaním výkonu ich hostiteľa.

 

Ktorý bázový „image“ – Windows Server Core alebo Nano Server?

Najnižšou úrovňou vzoru pre Windows kontajner je „holý“ operačný systém. „Low-level“ vzormi pre Windows kontajnery sú Windows Server Core alebo Nano Server. Ak chcete v kontajneroch prevádzkovať .NET framework aplikáciu, musíte použiť Windows Server Core, pretože Nano Server nepodporuje .NET Framework, ale .NET Core.
Windows Server Core „image“ pre kontajnery je vhodným vzorom pre kontajnerizované .NET Framework aplikácie. Je síce bez grafického rozhrania, ale umožní vám „dokerizovať“ väčšinu aplikácií funkčných na Windows Server-och (napr. Microsoft SQL Server, Apache, IIS webový server, spomínaný plný .NET Framework) s minimálnym úsilím. Napriek tomu, že Windows Server Core „image“ zaberie takmer 9 GB priestoru, váš vlastný „image“ vystavaný na ňom už využije „docker-ovské“ vrstvenie vzorov a bude podkladovo využívať dotiahnutý „core image“.
Nano Server je minimalistická verzia Windows, ktorá podporuje už dnes dôležité základné aplikácie a frameworky (napr. IIS web server, nový .NET Core, Node.js), má výrazne menej softvérových závislostí vyžadujúcich pravidelné aktualizácie. Pre náš scenár je ale chýbajúca podpora .NET Frameworku v Nano servri limitujúca, napriek tomu, že podpora IIS v Nano „image“ existuje. Nano server je viac vhodný pre nové .NET Core aplikácie alebo ako prostredie mikroslužieb zapadajúcich do väčšieho celku.

 

Vytvorenie hostiteľa Windows kontajnerov v Azure.

Od októbra máme k dispozícii finálnu verziu Windows Server 2016, všetky nasledujúce postupy sú teda popísané a odskúšané voči „RTM“ vydaniu, pričom budem simulovať postup na vytvorenie kontajnerov slúžiacich na akceptačné testy webovej aplikácie („user acceptance testing“ = UAT).
1. Prihláste sa na Azure portál, vyberte z ľavého menu „New“ a do položky „Search in marketplace“ zadajte „Windows Server 2016 with Containers“. Zo zoznamu nájdených položiek vyberte „Windows Server 2016 Datacenter – with Containers“ a následne potvrďte tlačidlo „Create“. Ponechajte pritom vybraný model „Resource Manager“.
2. Zadajte názov servera (napr. uatserver) a diskovú konfiguráciu nastavte na “HDD”, pretože pre webovú aplikáciu postačia aj o niečo „pomalšie“, lacnejšie typy diskov. Vyplňte prihlasovacie meno administrátora („user name“) a jeho heslo. Pre lepšiu orientáciu v zdrojoch, ktoré budú mať čo do činenia s kontajnerizačným projektom, vytvorte novú „resource grupu“ (napr. „rg_win_kontajnery“). Vyberte si dátové centrum, v ktorom chcete hostiteľský server kontajnerov prevádzkovať a potvrďte „OK“.

clanok_obr1n

3. Na hostiteľskom servri bude bežať operačný systém samotného servera a Windows Server Core systémy v kontajneroch. Pre produkčné prostredie doporučujem začať s veľkosťou servera D2_v2 Standard (2 jadrá, 7 GB RAM, SSD swap disk). Potvrďte tlačidlo „Select“.
Poznámka: Po nábehu UAT prostredia môžete kedykoľvek bez reinštalácie veľkosť servera navýšiť alebo znížiť.
4. VHD disky hostiteľského servera je lepšie ukladať na samostatný Azure Storage účet („Storage account“) a kedže simulujeme testovacie/UAT prostredie, dáva zmysel umiestniť server do samostatnej siete („Virtual Network“). Pre „remote“ prístup na server použijeme prednastavenú verejnú IP adresu. To, čo Azure portál prednastaví v paneli „Settings“, nám teda úplne postačuje a stačí potvrdiť „OK“.

clanok_obr2n

5. Skontrolujte v paneli „Summary“ vybrané nastavenia a potvrďte „OK“.

clanok_obr3n

6. Za niekoľko minút bude hostiteľský server pre kontajnery pripravený a nájdete ho po výbere „Resource groups“ z ľavého menu Azure portálu v skupine zdrojov „rg_win_kontajnery“.
7. Predpokladajme, že náš UAT server s testovacími kontajnermi budeme pravidelne kvoli úspore nákladov vypínať, preto si prístup k nemu uľahčime nastavením verejného DNS mena a statickej IP adresy. Zo zoznamu zdrojov vyberte typ „Public IP Address“ (v našom príklade „uatserver-ip“) a následne menu „Configuration“.

clanok_obr4n

8. Zmeňte adresu z „Dynamic“ na „Static“ a prideľte serveru DNS meno, ktoré bude jedinečné v domené doméne dátového centra. Uložte zmeny verejnej IP adresy cez menu „Save“.

clanok_obr5n

Od tohto momentu bude server pre kontajnery dostupný cez DNS meno, ktoré nájdete aj priamo v nastaveniach servera.

 

Príprava Docker image ako vzoru pre tvorbu kontajnerov prevádzkujúcich ASP.NET Framework aplikácie.

Aby sme vedeli za pár sekúnd po požiadavke na testovanie vytvoriť kontajner, v ktorom bude plný .NET Framework, podľa našich predstáv nastavený IIS server a skriptovacie nástroje pre IIS, musíme najskôr vytvoriť vzor pre kontajnery – „Docker image“. Zvolíme takýto postup:
a. Vytvorenie „prázdneho“ Windows kontajnera podľa vzoru bázového Windows Server Core
b. Skonfigurovanie aplikačného prostredia v kontajneri
c. Vytvorenie nového vzoru z upraveného kontajnera

Detailné kroky, ktoré na vytvorenie vlastného „docker image“ budeme potrebovať, sú takéto:
1. Pripojte sa „remote“ na naštartovaný hostiteľský server kontajnerov vytvorený podľa návodu v predošlom odseku cez tlačidlo „Connect“ a pri prihlásení zadajte meno a heslo administrátora zadané pri tvorbe servera.

clanok_obr7n

2. Cez Windows Update aktualizujte operačný systém, pretože medzi aktualizáciami sa nachádzajú aj opravy pre Windows kontajnerizáciu. Po dokončení aktualizácie server reštartujte. Po jeho naštartovaní sa opäť pripojte na server cez „remote session“.
3. Otvorte si mód príkazového riadku („cmd“) a prepnite sa do Powershell-u príkazom „powershell“. Zadajte za sebou príkazy, ktorými postupne stiahnete na server modul poskytovateľa „dokerizácie“ pre Windows a balíček poskytovateľa kontajnerizácie pre Windows.

Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
Install-Package -Name docker -ProviderName DockerMsftProvider

4. Zadajte „docker“ príkaz, ktorým vytvoríte prvý kontajner odvodený z vzoru „windowsservercore“:

docker run -it --name prvykontajner microsoft/windowsservercore cmd

Poznámka: Parameter „cmd“ na konci zadaného príkazu znamená, že po úspešnom vytvorení kontajnera budete prepnutý do príkazového riadku v session kontajnera.
5. V session kontajnera, ktorý sa otvorí po vytvorení kontajnera, zadajte príkaz „powershell“ a postupne zadajte príkazy, ktorými v kontajneri oživíte službu webového servera, priinštalujete ASP.NET 4.x a skriptovacie nástroje pre správu webového servera:
Add-WindowsFeature -Name Web-Server
Add-WindowsFeature -Name web-asp-net45
Add-WindowsFeature -Name web-scripting-tools

clanok_obr8n

6. Vytvorte priečinok, ktorý bude obsahovať aplikačný kód (, najjednoduchšie príkazom „mkdir c:\aplikacia”). Nakoniec prejdite do priečinka s nástrojmi pre správu IIS ( „cd c:\windows\system32\inetsrv“) a potvrďte príkaz na na vytvorenie webovej aplikácie hostovanej IIS:

.\AppCmd.exe ADD APP /site.name:"Default Web Site" /path:/mojweb /physicalPath:"c:\aplikacia"

7. Priamo z kontajnera pretestujte, či webový server beží príkazom:

curl -uri http://localhost –UseBasicParsing

8. Po úspešnom teste webového servera ukončite v kontajneri session Powershellu príkazom „exit“ a vzápätí aj celú session kontajnera rovnako príkazom „exit“.
9. V session servera sa presvedčte príkazom „docker ps“, že kontajner „prvykontajner“ nie je v zozname bežiacich kontajnerov.
10. Predpripravený kontajner nám poslúži na vytvorenie vzoru pre všetky ďalšie kontajnery, v ktorých budeme požadovať predpripravené prostredie webového servera a webovej aplikácie s obsahom v priečinku „c:\aplikacia”. Všetko teda zavŕšime vytvorenímdocker image” príkazom:

docker commit prvykontajner windowsiisaplikacia

11. Príkazom „docker images“ sa presvedčte, že do zoznamu pribudol nový vzor s názvom „windowsiisaplikacia“.

clanok_obr9n

 

Kontajnery pre ASP.NET Framework aplikácie z vlastného „docker image“.

Nastal ten správny čas zúžitkovať čaro kontajnerov spočívajúce v tom, že máme vytvorený predpripravený vzor (docker image – vzor kontajnera) a môžeme z neho „vyklonovať“ koľko chceme kontajnerov.
Našim cieľom bolo vytvoriť Windows kontajnery, na ktorých bude bežať ASP.NET aplikácia používajúca .NET Framework. Aby sme si výrazne uľahčili aktualizáciu aplikácie, využijeme možnosť mapovania priečinkov kontajnera na priečinky hostiteľského servera. Nebudeme teda pre nasadzovanie aplikácie do kontajnerov komplikovane zisťovať interné IP adresy a porty inštanciovaných kontajnerov, ale vytvoríme si pre každý kontajner aplikačný priečinok priamo na „host-e“.
1. Ak názov prvej aplikácie bude „aplikacia1”, vytvorte na disku “C” hostiteľského servera kontajnerov pre ňu priečinok s rovnakým názvom. ( Napr. priamo cez „command-line“ príkazom „mkdir c:\aplikacia1”.)
2. Vytvorte kontajner podľa nášho vzoru „windowsiisaplikacia“ pre prvú aplikáciu príkazom:

docker run -it --name winkontajner_aplikacia1 --restart always -p 5555:80 -v c:\aplikacia1:c:\aplikacia windowsiisaplikacia cmd

„Dešifrujme“ parametre zadané v príkaze „docker run“:
– “-it“ – interaktívne spustenie s presmerovaním vstupu
– „–name winkontajner_aplikacia1“ – vytvorenie kontajnera s názvom „winkontajner_aplikacia1“
– „–restart always“ – politika reštartovať kontajner vždy, ked ukončí činnosť
– „-p 5555:80“ – vnútorný port 80 v kontajneri sa bude prekladať na port 5555 hostiteľského servera
– „-v c:\aplikacia1:c:\aplikacia” – priečinok „c:\aplikacia1” na hostiteľskom servri je mapovaný na priečinok „c:\aplikacia” vo vnútri kontajnera
– „windowsiisaplikacia“ – názov vzoru (docker image), z ktorého sa kontajner vytvorí
– „cmd“ – názov aplikácie, ktorá sa spustí pri naštartovaní kontajnera. Z praktických dôvodov nám „cmd“ pomôže z vnútra kontajnera v príkazovom riadku sledovať stav služieb a systému kontajnera.

3. Prostredie pre „kontajnerové“ hostovanie ASP.NET aplikácie postavenej nad plným .NET frameworkom je pripravené. Otestujte ho. Vo Visual Studiu vytvorte vzorový projekt typu „ASP.NET Web Application (.NET Framework)“ podľa šablóny MVC alebo WebForms a zeditujte mu niektorú nestatickú stránku.

clanok_obr10n

4. Obsah projektového priečinka prekopírujte cez „remote session“ na hostiteľský server kontajnerov do priečinka „c:\aplikacia1”.
5. Kontajner, v ktorom chceme spustiť webovú aplikáciu je navonok prístupný cez port 5555, preto musíme tento port povoliť pre verejnú IP adresu hostiteľa kontajnerov. Na Azure portále vyberte zo zoznamu zdrojov kontajnerizačnej „resource grupy“ službu Network Security Group, ktorá obsahuje pravidlá firewallu. Zatiaľ iba pravidlo na „remote desktop protokol“.

clanok_obr11n

6. Pridajte do zoznamu „Inbound security rules“ cez tlačidlo „Add“ nové pravidlo povoľujúce aj port 5555.

clanok_obr12n

7. Otvorte internetový prehliadač a zadajte do neho verejnú URL adresu kontajnera, ktorá pozostáva z DNS mena hostiteľa kontajnerov (, tak ako sme ho zadali v kroku 6. pri tvorbe hostiteľského servera) , portu, ktorým sa konkrétny kontajner prezentuje navonok (, v našom príklade 5555) a nakoniec z názvu webovej aplikácie (, tak ako sme ho zadali v kroku 6. pri tvorbe docker „image“):

http://<verejné_DNS_meno_hostiteľa_kontajnerov>:5555/mojweb

8. Aplikácia používajúca .NET framework beží v Windows kontajneri.

clanok_obr13n

Nasadzovanie „klasickej“ ASP.NET aplikácie priamo z vývojárskeho počítača do Windows kontajnera kopírovaním je samozrejme otravné, nesystémové a ťažko automatizovateľné bez zapojenia do celého cyklu aplikačného vývoja. V voľnom pokračovaní tohto článku krok za krokom popíšem, ako vyvíjať a nasadzovať ASP.NET Framework aplikácie do Windows kontajnerov pomocou Visual Studio Team Services.

Miroslav Kubovčík

 

Comments (0)

Skip to main content