Windows kontejneri - Sve u kutije!
Za poznavatelje Linuxa, kontejneri nisu neka novost, međutim, za ljude iz Microsoftova okruženja ovo je velika novost i evolucija u svijetu Microsofta. Što je Windows kontejner?
Windows kontejner je izolirano, kontrolirano i prenosivo radno okruženje u kojemu pokrećemo aplikaciju bez bojazni da će utjecati na ostatak sustava, kao i da će sustav utjecati na rad aplikacije. Zavirimo li unutar kontejnera, isto je kao da pogledamo u svježe instalirano fizičko ili virtualno računalo.
Kada počnemo raditi s Windows kontejnerima vidjet ćemo mnogo sličnosti između kontejnera i virtualnih strojeva, ali samo sličnosti. Kontejner pokreće operacijski sustav, ima datotečni sustav, možemo mu pristupiti preko mreže te ga možemo smjestiti na fizički ili virtualni stroj, ali tehnologija i koncept kontejnera u mnogočemu su različiti od virtualnih strojeva. Virtualnom stroju potrebno je poprilično resursa kako bi radio. Kako bi virtualni stroj radio, potreban mu je kompletan operacijski sustav, mnogo radne memorije i procesorske snage koje koristi od domaćina na kojemu se nalazi. Za razliku od virtualnog stroja, kontejneri dijele operacijski sustav koji koristi domaćin na kojem se nalaze, kao i mnogo manje resursa koji su mu potrebni kako bi ispravno radio. Što to znači u praksi? S obzirom na to da za kontejner treba mnogo manje resursa, na jednog domaćina možemo smjestiti mnogo više kontejnera nego virtualnih strojeva i time pokretati veći broj potrebnih servisa. Osim toga, s kontejnerima je mnogo lakše i jednostavnije manipulirati nego što je to s virtualnim strojevima.
U mnogočemu drugačiji
Windows kontejneri pojavili su se izlaskom Windows Servera 2016 Technical Preview. Što su to kontejneri? Najjednostavnije objašnjenje je, još jedan tip virtualizacije, međutim u tekstu koji slijedi vidjet ćemo da je u mnogočemu drugačiji nego u klasičnoj virtualizaciji na koju smo dosad navikli. Kontejneri rade na sustavu namespace izolacije, odnosno izolacije aplikacije koja se pokreće u jednom kontejneru. Kontejner koristi sve potrebne resurse potrebne za rad aplikacije koja se u njemu nalazi, kao primjerice, mrežu, pristup datotekama, potrebne procese i tako dalje. Ovakva tehnika izolacije daje domaćinu mogućnost da svakom kontejneru omogući virtualni pristup samo resursima koji su potrebni za rad određenog kontejnera na kojemu je smještena aplikacija. S ovako restriktivnim pristupom resursima nitko ne može komunicirati s aplikacijom ukoliko nije dio kontejnera, odnosno aplikacije koje se vrte na kontejnerima potpuno se izolirane od ostatka svijeta. Budući da svaki pojedini kontejner omogućuje potpunu izolaciju, ne postoji opasnost da će biblioteka ili alat koji koristimo za rad jednog dijela softvera biti nekompatibilni s nekom drugom bibliotekom koju koristi neki drugi dio softvera koji se izvršava u drugom kontejneru. Zbog prirodne izolacije kontejnera, ne moramo se brinuti o kompatibilnosti dijelova našeg rješenja. Također, kontejner, kao i aplikacija koja se vrti u jednom kontejneru, nisu svjesni toga da se pored njih nalazi još stotine drugih kontejnera s drugim aplikacijama.
Kao što smo prethodno spomenuli, kontejneri su upravo zbog male potrošnje resursa, lakoće i portabilnosti, vrlo pogodni kao izvršno okruženje u scenarijima razvojnog ili testnog okruženja. Za svaki novi scenarij možemo kreirati novi predložak u kojem se nalazi nova verzija aplikacije i na temelju njega pokrenuti novi kontejner, te tako svako novo okruženje dobiva prilagođeni kontejner.
Kontejnersku infrastrukturu u mogućnosti smo implementirati na fizički ili virtualni stroj, a sam način implementacije vrlo je jednostavan i nadasve brz. Instalirati kontejnersku ulogu možemo na dva načina, preko korisničkog sučelja ili pomoću Powershella. Osnovna instalacija dolazi s dva imidža, WindowsServerCore i NanoServer. Koristeći imidž WindowsServerCore kreirat ćemo Windows Server kontejnere, a pomoću imidža NanoServer kreirat ćemo Hyper-V kontejnere. Razlika između ove dvije vrste kontejnera je u izolaciji, o čemu ćemo pisati u nastavku. Na temelju dobivenih kontejner imidža, kreiramo kontejnere i imidže iz kojih želimo kreirati kontejnere prema našim potrebama. Kako ne bismo svaki put iznova trebali konfigurirati potrebno razvojno ili testno okruženje, iz jednog od dva gore navedena preddefinirana kontejner imidža kreiramo kontejner u koji instaliramo željeni servis ili aplikaciju te iz tog kontejnera kreiramo kontejner imidž koji će nam uvijek biti dostupan i konfiguriran prema našim potrebama, a koji spremamo u kontejnerski repozitorij. Nakon što smo napravili kontejner imidž, iz njega kreiramo nove kontejnere na kojima možemo testirati aplikaciju te ga jednostavno izbrisati i u nekoliko trenutaka iz postojećeg kontejner imidža kreirati nove kontejnere, ako nismo zadovoljni radom aplikacije. Ovaj način rada možemo usporediti s kontrolnim točkama (Checkpoints) u virtualizaciji.
Olakšanje i ubrzanje rada
Windows kontejneri zasigurno će olakšati i nadasve ubrzati rad i implementaciju, kako za razvojne, tako i za sistemske inženjere. Sistemski inženjeri bit će u mogućnosti vrlo jednostavno i brzo implementirati infrastrukturu prema potrebama, bilo za razvojni tim ili za testiranje standardnog okruženja za koji su odgovorni, kako bi bez bojazni za produkcijsko okruženje mogli napraviti testove servisa i nakon toga pustiti ih u produkciju. S druge strane, kontejneri su veliko olakšanje za razvojne inženjere i testno okruženje na kojemu rade, jer rješavaju niz složenih problema. Jedan od takvih je izgradnja razvojnog okruženja. Umjesto ručnog konfiguriranja razvojnog okruženja, instalacije, konfiguriranja potrebnih alata, kao do sada, razvojni će inženjer jednostavno uzeti kopiju produkcijskog kontejnera i pokrenuti ju samo za sebe, izolirano od ostatka infrastrukture u nekoliko trenutaka. Ovakvim načinom rada, razvojni inženjer postaje mnogostruko produktivniji. Budući da svaki pojedini kontejner omogućuje potpunu izolaciju, ne postoji opasnost da će alat koji koristimo za rad jednog dijela softvera biti nekompatibilan s drugim koji koristi neki drugi dio softvera koji se izvršava u drugom kontejneru. Radi ovakvog načina izolacije kontejnera ne moramo se brinuti o kompatibilnosti dijelova rješenja. S kontejnerima je stvar vrlo jednostavna i jasna; ako se greška koju tester nađe može ponoviti u kontejneru koji koristimo u produkciji, moći će se ponoviti i u njegovoj kopiji.
Kao što možemo pretpostaviti iz navedenog, s Windows kontejnerima otvaraju nam se mnoge mogućnosti i jednostavnost implementacije, kako testnog okruženja u kojem možemo unedogled isprobavati mogućnosti i stabilnost aplikacija, tako i produkcijskog okruženja. Osim navedenih mogućnosti, kreiranja kontejnera, kontejner imidža s verzijom Windows Servera 2016 TP4, dobili smo i značajku imena dijeljene mape, (Shared Folders). Ova značajka daje mogućnost dijeljenja iste mape između kontejner domaćina (Container host) na kojemu se kontejner nalazi i kontejnera. Dakle, ukoliko trebamo istu datoteku podijeliti sa svim kontejnerima na domaćinu, dovoljno je da kreiramo dijeljenu mapu na kontejner domaćinu i svi kontejneri će imati pristup. Dok pišemo ovaj tekst, trenutačna probna verzija (Technical Preview) Windows Servera 2016 je u svojoj četvrtoj fazi, TP4, u kojoj, kako smo već naveli, imamo mogućnost instalacije kontejner uloge preko korisničkog sučelja i pomoću PowerShella, kreiranje kontejnera pomoću baznih imidža WindowsServerCore i NanoServer. Napominjemo kako ovo nije konačna verzija te da slika postaje jasnija kako se približava izlazak konačne verzije Windows Servera 2016, i uvjerenja smo da će doći do još nekih promjena, dodataka i poboljšanja vezano za Windows kontejnere.
Terminologija kontejnera
Navedeni koncepti pomoći će nam da shvatimo terminologiju Windows kontejnera. Container Host je fizički ili virtualni stroj gdje se kreiraju kontejneri i kontejnerski imidži, a Container Image je predložak pomoću kojega kreiramo nove kontejnere. Prilikom instalacije kontejnerske role na serveru dobivamo dva preddefinirana kontejner imidža, WindowsServerCore i NanoServer imidže. Uzmimo za primjer da smo kreirali Windows Server Container na koji smo instalirati servis MySQL te želimo kreirati nekoliko takvih kontejnera za buduće korištenje i testiranje. Kako ne bismo svaki put iznova morali instalirati MySQL, jednostavno iz postojećeg konfiguriranog kontejnera napravimo kontejner imidž i iz tog kontejner imidža kreiramo već pripremljene kontejnere na kojima ćemo raditi.
Container Repository je mjesto gdje se spremaju kontejnerski imidži za kasniju upotrebu. Kontejnerski repozitorij može biti privatan ili javan. Ukoliko kontejnerske imidže spremamo u privatni repozitorij, u mogućnosti su ga koristiti samo osobe kojima omogućimo pristup, dok pristup javnom kontejnerskom repozitoriju imaju osobe izvana. Kontejnerske imidže koje pohranjujemo u javni repozitorij možemo smjestiti u spremišta kao što su Docker Hub ili GitHub i time omogućiti javni pristup.
Container Management ili upravljanje kontejnerima moguće je isključivo preko PowerShella ili Dockera. S ova dva alata u mogućnosti smo stvoriti nove kontejnere, kontejnerske imidže, kao i upravljati njihovim vijekom trajanja.
NAPOMENA: Ovaj tekst je izvorno objavljen u časopisu Mreža.