Docker kontejnerska virtualizacija
- Objavljeno u Novosti
Ideja virtualnog stroja (engl. virtual machine) nije nikakva novost. Dapače, dobro je znana još iz vremena „velikih“ centralnih računala koja su omogućavala korištenje resursa većem broju korisnika istovremeno, ali uz određena ograničenja. Naime, svaki program imao je potpune resurse na raspolaganju, ali je bilo moguće izvoditi samo jedan program. U slučajevima „prebacivanja“ stanje programa moralo se pospremiti, a okruženje za izvođenje drugog programa moralo se povratiti i obnoviti. Tako je to bilo nekad.
Međutim, sam pojam virtualizacije ima mnogo širi kontekst. Ona podrazumijeva apstraktno predstavljanje pojedinih funkcionalnosti i resursa. To znači da za korisnika nema razlike između stvarnog i virtualnog ostvarenja funkcionalnosti, ali stvarne vrijednosti i aktivnosti u virtualnoj izvedbi razlikuju se od onih prikazanih korisniku. Što se sve može „virtualizirati“? Mnogo toga. Naprimjer: virtualne mreže (VPN), virtualizacija memorije i virtualizacija programa. Tako kaže standardni koncept virtualizacije i danas se na tržištu mogu pronaći brojna virtualizacijska rješenja kao što su Oracle VM Server, Microsoft Hyper-V , VMware ESX/ESXi, VMware Workstation, VirtualBox i dr. Postoje i različiti pristupi u virtualizaciji – tzv. „bare metal“ hipervizori i „hosted“ hipervizori. Dok se jedni oslanjaju na hardver i pokreću direktno na njemu, drugi između sebe i hardvera imaju operacijski sustav domaćina (host).
Nešto drugačiji pristup
Virtualni strojevi funkcioniraju u izolacijskoj okolini, odnosno pri izvođenju procesa ne smiju utjecati jedni na druge te se ponašaju kao jedan fizički stroj.
Međutim, pojavom Dockera uveden je nov pristup u konceptu koji je bio poznat i ranije (naprimjer: BSD – Jails, Solaris – Zones, Linux – OpenVZ) , a to je uspostava tzv. kontejnera (eng. containers) kao izoliranog računalnog okruženja. Zašto su nam potrebni kontejneri? Koji su benefiti? U današnjem vremenu eksplozivnog rasta raznovrsnih aplikacija one, da bi se izvršavale na stroju, imaju različite zahtjeve prema okruženju u kojem se izvršavaju (eng. environment), poput različite verzije programskih biblioteka (runtimes), verzija Jave i dr. U praksi to možemo zamisliti u situaciji potrebe za razvojem i korištenjem većeg broja aplikacija specifičnih zahtjeva na istom fizičkom stroju. Takav pristup može se riješiti uporabom standardne „hosted“ virtualizacijske tehnologije, koja podrazumijeva instalaciju zasebnog „guest OS-a“ i dodataka za svaku od aplikacija. Već sama pomisao da moramo instalirati „X“ gostujućih OS-ova na jedan stroj ukazuje na potrebu za većim HW resursima te se takvim pristupom povećava broj instanci operacijskog sustava.
Docker u osnovi koristi client-server arhitekturu gdje Docker client „razgovara“ s Docker daemonom, koji je pak zadužen za podizanje, pokretanje i distribuciju Docker kontejnera. Docker client i daemon razgovaraju putem REST API-ja, UNIX socketa ili putem mrežnog sučelja.
Naprijed ili nazad?
Svakako naprijed. Docker je svojim kontejnerskim pristupom ponudio jednostavnost u kreiranju i manipulaciju kontejnerima i njihovim puštanjem u rad, a sve to na temeljima raznih Linux distribucija. Zamislite koliko vremena i HW resursa gubimo klasičnim virtualizacijskim tehnikama samo da bismo sve „naselili“ na fizički stroj (HW -> OS -> Hypervizor -> Guest OS -> App). Sustav Docker razvijen je na temeljima najnovije verzije kernela Linux, odnosno njegovih sastavnica: tzv. Kontrolne grupe (eng. Control group) i Imenički prostori (eng. Kernel namespaces). Kontrolne grupe zadužene su za izolaciju HW resursa fizičkog stroja (CPU, RAM, HDD, Network) za točno određene procese ili grupu procesa, dok imenički prostori izoliraju resurse (PID, hostname, user ID, network) te omogućavaju pokretanje više različitih izoliranih imeničkih prostora.
Što je uopće taj kontejner?
Kontejnere možemo ukratko opisati kao „lagana“ virtualna računala, a svaki pokrenuti kontejner možemo opisati kao procese operacijskog sustava (host). Osnovni koncept Dockera jest izolacija aplikacija na razni kontejnera unutar istog hosta gdje aplikacija izravno poziva sistemske pozive (eng. syscalls) OS-a. U odnosu na standardni virtualizacijski pristup, smanjuje se broj instanci OS-a, štedi se na hardverskim resursima, a povećava broj korisnih aplikacija na istom fizičkom stroju. Kontejneri kao alternativan arhitekturni pristup virtualizaciji omogućuju bolju iskoristivost novih, ali i postojećih resursa organizacije u odnosu na danas prevladavajuća virtualna računala. Spomenimo i to da Docker podržavaju sve platforme, uključujući Windows, Mac OS i Linux.
Da pojednostavimo, u kontejner postavljamo svoju buduću aplikaciju sa svim njezinim potrebnim dijelovima. Ne baš doslovce , ali jednostavno rečeno.
Kontejner je image datotečnog sustava koji definira sve potrebno za izvršavanje određene aplikacije u prilagođenoj okolini, odnosno kontejner sadrži runtime biblioteke koje su potrebne za rad aplikacije. Ono što u standardnom virtualizacijskom konceptu predstavlja hypervizor i gostujući OS s aplikacijom, to u okruženju Docker predstavlja jedan kontejner.
Iako nije ispravno kazati da je Docker = VMWare, npr. može se reći da je kontejner = virtualno računalo na neki način. Koncept kontejnera u Dockeru eliminira potrebu za višestrukim operacijskim sustavima, a izolacija između kontejnera odvija se na razini datotečnog sustava i kernela OS-a.
Docker kontejneri izvode se u istom operacijskom sustavu kao i domaćin (eng. host), što im omogućava optimizirano dijeljenje sistemskih resursa. Za zapis podataka koristi se slojeviti datotečni sustav AUFS (eng. Advanced multi-layered Unification FileSystem), koji omogućava segmentaciju dijelova za čitanje i pisanje. Svaki pojedini kontejner ima zajedničke dijelove operacijskog sustava koje koristi samo za čitanje, dok svaka aplikacija ima svoj prostor na disku samo za zapis.
Docker omogućava izvođenje svake aplikacije sigurno i izolirano u kontejneru te je orijentiran prema aplikaciji koja se izvodi, za razliku od „klasičnih“ virtualnih strojeva koji se temelje na Hypervizoru i gostujućem OS-u.
Nakon kontejnera docker datoteka
Docker omogućava kreiranje imagea, a kreiranje Docker datoteke (eng. Dockerfile) omogućava automatizaciju procesa instalacije imagea i kontejnera. Dockerfile sadrži popis naredbi preko kojih Docker gradi novi image koji se potom pohranjuje na server. Docker putem središnjeg repozitorija (hub.docker.com) upravlja imageima, a postoji nekoliko Docker repozitorija koji sadrže gotove slike aplikacija u obliku kontejnera (Jenkins, Java...) i njih možemo koristiti za kreiranje vlastitog imagea. Ukratko, kreiranje vlastitog imagea započinjemo na nekom gotovom imageu.
Potrebno je naglasiti da su svi kreirani imagei uvijek dostupni samo za čitanje. Aplikacije koje imaju potrebu trajno pohranjivati podatke moraju spremati image na neku lokaciju koja nije sastavni dio slike. Ako se podaci spremaju na lokaciju koja je dio slike, oni će se obrisati u trenutku brisanja kontejnera.
Što to znači za korisnika?
Docker u odnosu na „tradicionalna“ virtualizacijska rješenja nudi bolju iskoristivost HW resursa, brže stvaranje novih radnih okolina koja ga čine pogodnim za razne razvojne okoline, bile one testne ili produkcijske. Upravo zbog takvog koncepta kontejneri su prilagođeni za distribuciju u oblak. Uporabom Docker „nadogradnji“ za administraciju kontejnera poput Portainera Docker postaje vrlo jednostavan i zanimljiv alat ako imamo potrebu instalirati i pokretati aplikacije u različitim okolinama. Naravno, sve to na istom stroju.