Godina 2007. poznata je po mnogo toga, ali vjerojatno najpoznatije događanje bila je prezentacija iPhonea. Mnogi su govorili da od tog uređaja neće biti ništa i da će propasti, no već sljedeće godine pojavio se AppStore. Aplikacije su ga u kratkom vremenu preplavile i bilo je nevažno jesu li besplatne ili komercijalne, ako su vrijedile, ubrzo bi se pojavile na većini telefona. No, što je s njihovim razvojem? Iako autor ovih redova nema nikakvog iskustva u programiranju bilo kakvih aplikacija, niti se želi baviti programiranjem, danas je svima jasno da bez aplikacija ne možemo funkcionirati. Možda se čini da bi ovaj tekst mogao ići u smjeru govora o razvoju, no odmah ću reći da to neće biti slučaj. Poanta je da je razvoj aplikacija i broj dostupnih razvojnih platformi danas napravio tržište za svakoga. Danas postoji mnoštvo aplikacija i platformi za sve moguće uređaje i operativne sustave i tu se javlja jedan od čestih izazova; kako dovesti aplikaciju na sve uređaje i platforme bez pretjeranog utroška vremena na razvoj za specifičnu platformu? Plavi kit Platforma Docker je mnogima danas još uvijek nepoznata. Docker se pojavio 2013. godine i postao dostupan za korištenje. Što je u biti Docker? Ideja iza Dockera je jednostavna; kako postaviti aplikaciju sa svim njezinim popratnim zahtjevima, frameworkom, dakle sa svime što je potrebno kako bi aplikacija radila, na platformu koja je izvorno ne podržava? Drugo, kako aplikaciju koja je konfigurirana i spremna za korištenje migrirati na novi stroj u što kraćem vremenu ili prebaciti s testne u produkcijsku okolinu? Drugim riječima, bilo bi odlično kada bi aplikacija bila u svojem sandboxu sa svim elementima spremna za pokretanje neovisno o hardveru i operativnom sustavu na kojem korisnik radi. U takvim situacijama upravo Docker dolazi kao rješenje. Sloj između OS-a i sandbox aplikacije koji će razumjeti kako Dockerov paket radi i u konačnici prezentirati aplikaciju krajnjem korisniku. Često pitanje koje se nameće jest koja je onda uopće razlika između neke virtualne okoline (VM) i Dockera? Najbolje je to objasniti uz jednostavnu sliku koja jasno prikazuje razliku ovih dvaju pristupa. Usporedba između virtualne okoline i Dockera
Sa slike je vidljiv pristup virtualnog stroja i njegova pripadajućeg hosta/, dok je s desne strane prikazan Dockerov pristup. Razlika je poprilična i vidimo da osim što je za punokrvnu virtualizaciju potreban nekakav hipervizor (VMWare Fusion, ESXi, Parallels, VirtualBox; dakle tip 1 ili 2 nebitno) uz to nam je potreban i OS virtualnog stroja na kojem će se u konačnici pokrenuti neka aplikacija (App A, B...). Iako su neki hipervizori kao i OS-ovi besplatni, to ne mora uvijek biti slučaj, no čak i da je tako, postoji glad za resursima. Svaki virtualni stroj traži određenu količinu procesorske snage, nešto radne memorije i slično, a sve to da biste vi pokrenuli neko aplikacijsko rješenje. Dockerov pristup je različit. Vidimo sa slike da je jasno kako će nam trebati neki stroj (što jači to bolje, ali ne mora biti serverskih performansi), OS koji će pokretati taj uređaj i nakon toga nam je potrebna Dockerova platforma (Docker Engine sloj sa slike). Dakle, instalacija platforme sa svojim instrukcijama i "jezikom" koji razumije manipuliranje (sandbox) aplikacijskim kontejnerima. Treba napomenuti da nemamo potrebu za specifičnim OS-om već se aplikacija direktno oslanja na Dockerovu platformu. To znači da resursno gledajući ne moramo imati CPU i RAM koji će se morati odvojiti samo kako bi se računalo pokrenulo i da bismo tek onda došli do svoje aplikacije (kao u slučaju virtualnih okolina, tj. računala). U ovom slučaju trošit ćemo resurse samo na zadovoljavanje potreba navedene aplikacije. Rješenja zasnovana na virtualnim okolinama dovode nas do situacija u kojima u konačnici možemo koristiti aplikaciju koja nije sama po sebi gladna resursa, ali činjenica da nam treba virtualno računalo samo zato da bismo je mogli i pokrenuti, velik je zahtjev. A što je tek s održavanjem OS-a virtualnog stroja? Treba ga redovito ažurirati i brinuti se o antivirusnoj zaštiti ako se radi o nekom izdanju Windowsa. Ukratko - boli glava! Synology DSM + Docker Prikazat ću kako Dockerovo rješenje radi na Synology NAS platformi na kojoj se pojavio unazad nekoliko godina. Prije nego krenem s primjerima, odmah bi naveo da ne podržavaju svi Synologyjevi modeli Docker. Postoje hardverski preduvjeti kako bi radio. U Synologyjevu svijetu to su uglavnom "+" uređaji (dakle oni koje pogone Intelovi procesori). 3rd party scena dostupnih aplikacija za DSM je sada, možemo reći, solidna. Zajednica je velika i razvoj se svakodnevno ubrzava i širi. Kao što je na početku članka spomenut Appleov AppStore i njegovo značenje za platformu, tako i popularnost DSM-a, pa tako i Synology imena, čine upravo aplikacije i servisi kojima možemo proširiti funkcionalnost našeg NAS uređaja. Synology je podrškom za Docker otvorio mnoštvo drugih servisa i aplikacija koje izvorno nisu podržane, točnije nisu dostupne iz njihovog službenog Package Centrea. Primjerice, kako bi bilo na NAS-u (koji ima dovoljno fizičkih resursa) koristiti Ubuntu OS? Ili recimo CentOS? Možda Ghost Blog platformu ili jednostavno neko aplikativno rješenje koje vam treba, ali službeno za Synology nije podržan kao one-click paket? Instalacija i korištenje Dockera Kao i svaki drugi paket, Docker se mora instalirati preko Package Centera prije nego li se može koristiti. Nakon svega jednominutne instalacije, platforma će biti dostupna preko svoje ikone unutar DSM-a. Ovdje treba naglasiti da je Synology napravio vlastito sučelje za lakše upravljanje dijelom platforme i taj UI će varirati od OS-a do OS-a na kojem se Docker nalazi. Filozofiju smo prošli, a sada da vidimo drži li cijela priča vodu. Kako bismo nešto koristili putem Dockera moramo učiniti dva koraka: 1. preuzeti image željene aplikacije, 2. kreirati container temeljem instalacije iz prvoga koraka sa svim popratnim konfiguracijskim parametrima. Otvaranje Dockerove aplikacije prikazat će grafičko sučelje koje se može, ali i ne mora koristiti. Naime, neke instalacije mogu se lijepo konfigurirati putem sučelja, ali s druge strane, neke će se moći samo izvesti putem terminala, tj. naredbenog retka. U nastavku će se pokazati primjeri za obje situacije. Sučelje Kao što vididte s donje slike, pregled svih trenutno aktivnih aplikacija vidljiv je s prikazom potrošnje dvaju glavnih resursa (CPU i RAM). Dodatno se vidi i njihovo ukupno opterećenje na razini cijelog DSM-a (dakle ovo se ne odnosi samo na Dockerove aplikacije). Pregled korištenja resursa
S druge strane, ako želimo vidjeti koje su sve aplikacije složene i konfigurirane, možemo koristiti "Container” tab. Preko ovog pregleda aplikacije se mogu pokretati te zaustavljati koristeći odgovarajući “prekidač”. Pregled "Container" taba
Konfiguracija aplikacije Prije sam naveo da za početak moramo preuzeti instalaciju putem Dockerova repozitorija. Izvor može biti zadana putanja koja je već prethodno postavljena, ali s druge strane mogu se definirati i dodatne putanje (recimo ako se radi neki lokalni razvoj). Prije korištenja neke instalacije bilo bi uputno provjeriti konfiguraciju kako bismo bili sigurni da neće biti problema prilikom korištenja. Za svaku aplikaciju bit će sigurno nekoliko dostupnih instalacija (ovisno o tome koliko je popularna) i zato će neke biti bolje ili lošije dokumentirane. Većina dobro dokumentiranih instalacija ima poveznicu na dokumentaciju i konfiguraciju, primjerice: https://hub.docker.com/r/linuxserver/radarr/ Nakon preuzimanja instalacije može se krenuti s postupkom konfiguracije putem sučelja ili putem naredbenog retka. Treba reći da se i preuzimanje samih instalacija također može izvesti na oba načina. Ekran s općenitim postavkama" taba
Važno je napomenuti da prije nego li se krene raditi s nekom aplikacijom putem Dockerova okružja, svi podaci, kao i sama aplikacija, bit će sandboxani. To znači da neće postojati elegantan način za pristup eksternim podacima ili recimo konfiguracijskim datotekama same aplikacije. Dodatno, prilikom svakog pokretanja samoga "kontejnera", on će se postaviti od nule (resetirati) kao da prvi put pokrećete aplikaciju. Naravno, tome se može doskočiti i to je upravo ono oko čega većina korisnika ima problema. Ovo je, što se kaže, by design ponašanje i kao takvo traži konfiguriranje same aplikacije na ispravan način kako se spomenuta situacija ne bi događala. Zato moramo prilikom konfiguracije definirati osnovne parametre, ali najbitnije je razdvajanje same aplikacije od konkretnih podataka koji će se stvarati i modificirati. Nakon što se zada ime budućeg kontejnera možemo na početnom ekranu odabrati i kontrolu nad CPU/RAM resursima kako aplikacija ne bi nepotrebno divljala. Nakon ovoga koraka prelazi se u definiranje naprednih postavki. Jedna od najbitnijih postavki, kako je prije spomenuto, jest razdvajanje podataka od same aplikacije. Za te potrebe koristi se tab "Volume" putem kojeg se izvodi mapiranje kontejner-direktorija s nekom stvarnom lokacijom na stroju koji služi kao Dockerova platforma (recimo NAS i njegov datotečni sustav). Dockerova virtualizacija radi na principu mapiranja resursa iz kontejnera prema fizičkom stroju, kao i mapiranja između više kontejnera ako je potrebno. Pravila igre su uvijek ista: svaki element ima svoj aktivator, switch (više primjera kasnije), ovisno o tome što želimo konfigurirati, te nakon naziva switcha ide mapiranje i to prvo host destinacija, a zatim parametar unutar samoga kontejnera. Primjerice: -v (putanja do neke lokalne mape):/config Ovo je upravo primjer kako se spaja lokacija neke mape (ili datoteke) prema specifičnoj mapi (datoteci) unutar samoga kontejnera. Započinje se sa switchem -v (volume) te se nakon toga uvodi putanja gdje želimo da se podaci pohranju i budu dostupni. Dvotočka (:) služi kao simbol koji govori da putanja koja slijedi jest lokacija do mape/datoteke unutar samoga kontejnera. Na ovaj način može se napraviti proizvoljan broj putanja kako bi se mapiralo sve što želimo imati pod prstima i kontrolom izolirano od ostatka kontejnera. Korištenjem ovog postupka znamo da prilikom ponovnog pokretanja aplikacije (recimo uslijed resetiranja Dockerova hosta ili nadogradnje aplikacije na novu verziju) neće biti problema s podacima. Dodatno, možemo izraditi sigurnosnu kopiju podataka i konfiguracije koju smo izdvojili na neki konvencionalan način. Pregled postavki
Po ovom modelu možemo raditi razna mapiranja ostalih parametara, primjerice portova, varijabli i slično: -p 1024:8000 (primjer mapiranja porta na kojem želimo konkretnu aplikaciju i njezina internog porta na kojem se aplikacija javlja) -e PGID= U konačnici broj parametara može biti popriličan - kao što je vidljivo s prethodne slike. Preostaje pokrenuti aplikaciju i pristupit istoj preko lokalne IP adrese računala na kojem se nalazi Docker aplikacija i specifičan port. Drugi način kreiranja containera aplikacije je preko naredbenog retka i neke parametre možemo definirati samo ovom metodom. Kao primjer ću koristiti odličan deamon - alat za dijagnostiku i statistiku resursa u stvarnom vremenu. Ukratko, DSM monitor je u najmanju ruku jednostavan, ali spor i škrt na informacijama. Kao njegovu zamjenu koristim NETData alat. Navedeni deamon ćemo dakle instalirati tako da ćemo ga preuzeti iz repozitorija, ali njegovo kreiranje će se izvesti putem SSH konzole. Koristim NETData paket pod imenom titpetric/netdata što ne znači da se ne može koristiti neki drugi. Kako bismo pristupili Dockerovim naredbama, nakon pristupa vašem NAS-u putem SSH-a i prijavom kao root user, možemo izvršiti slijedeću naredbu (ovo je samo primjer): docker run --name netdata_titpetric -d --cap-add SYS_PTRACE -v /volume1/docker/netdata/config:/etc/netdata:rw -v /volume1/docker/netdata/log:/var/log/netdata:rw -v /proc:/host/proc:ro -v /sys:/host/sys:ro -p 19999:19999 titpetric/netdata Cijela priča počinje s naredbom docker nakon koje ide ili create ili run naredba ovisno o tome što konfiguracija traži. U ovom slučaju deamon se pokreće pa zato imamo run naredbu. --name (je switch kojim se definira ime containera; proizvoljno) --cap-add (definiranje Linuxovih mogućnosti; točnije containeri zadano ne mogu pokretati deamone unutar sebe pa se definira navedena naredba kako bi to bilo moguće) -v - već prije spomenuto mapiranje fizičke lokacije gdje želimo neke podatke iz samoga kontejnera. Tu posebno treba naglasiti mapiranje proc i sys NAS mount pointova koji gledaju na host/proc i host/sys destinacije našeg hosta (u ovom slučaju NAS-a) i to s RO (read only) dozvolama. Ukratko, s tih destinacija će se i povlačiti najviše parametara vezanih za hrpu značajki vašeg NAS uređaja. Za kraj treba navesti da se sve ovo slaže kao jedna naredbena linija. Po samom izvršavanju kreirati će se kontejner i samoj stranici možemo pristupiti putem lokalne IP adrese NAS-a i porta (u ovom slučaju port je 19999, što je definirano -p switchem). Zašto je ovo trebalo učiniti putem naredbenog retka, a ne preko sučelja? Iz razloga što za -v mapiranja ne možemo izvoditi na mapama koje nisu vidljive unutar samog sučelja (a proc i sys to zasigurno nisu). Također, switch za definiranje Linuxovih mogućnosti -cap-add nije moguće uvesti nigdje unutar sučelja. Možda sve ovo djeluje pomalo komplicirano i naporno, ali jednom kada se shvate osnovna načela, stvar je vrlo jednostavna, a i ovakve se naredbe ne moraju nužno pamtiti već se kreiraju i pohrane. Dovoljan je jednostavan copy paste ako je potrebno kreirati novi kontejner u nekom trenutku. Nadogradnja aplikacije Doći će vrijeme kada će, kao i sve ostale aplikacije, biti potrebno nadograditi aplikacije unutar Dockerova svijeta. Kako i kada to raditi? Ovo je jedan od trenutaka kada Dockerove prednosti zaista dolaze do izražaja. Pretpostavimo da je nova verzija aplikacije (image) spremna, a vi koristite neku stariju verziju koja radi, no želite je nadograditi iz ovog ili onog razloga. Registry tab
U svega dva koraka možemo nadograditi aplikaciju. Prvo, odlazimo unutar sučelja na Registry tab i preuzimamo novu verziju. Nakon toga zaustavljamo aplikaciju preko odgovarajućega kontejnera. Iz Action izbornika odabiremo Clear opciju (koja neće uništiti konfiguraciju niti podatke, već će samo natjerati aplikaciju da počne koristiti novu verziju pri sljedećem pokretanju) te za kraj opet pokrećemo kontejner. Gotovo! Docker također nudi i opciju kloniranja kontejnera, recimo u svrhu testiranja više verzija postavki ili raznih verzija same konkretne aplikacije. Primjerice, može se koristiti ista aplikacija preko dva različita kontejnera (na različitim portovima), ali recimo s drugim postavkama. Na ovaj način možemo testirati i troubleshootati neki problem. Zaključak Evidentno je da se Dockerom mogu znatno proširiti mogućnosti nekog uređaja koji, iako ima tehničkih mogućnosti, možda zbog OS-a ima neka ograničenja. Dockerom sve to možemo zaobići i koristiti željene aplikacije bez neke "ekstra-kemije" (Ipkg, optware). Također i migracija s jednog hardvera na drugi (uz pretpostavku da na oba može biti instaliran Docker) je posao od svega nekoliko minuta. Osobno sam u zadnjih godinu dana gotovo 90% korištenih aplikacija prebacio u Docker (osim nekolicine koje su Synologyjeve aplikacije i kao takve se instaliraju iz njihova Package Centra) i moram priznati da je odličan. Prebacivanje iz sustava konfiguracije gdje je aplikacija instalirana izvorno na stroju, u sustav Dockerova svijeta je također trivijalan posao. Nakon slaganja aplikacije u Dockeru i spajanja na postojeće podatke (konfiguraciju, bazu itd.) stvar funkcionira bez da aplikacija razazna da sada radi kao sandbox rješenje. Ako imate vremena i potrebe za testiranje aplikacija i njezinih načina korištenja ili jednostavno želite čistu sandbox situaciju koja neće brljati po ostatku vašeg OS-a, Docker je rješenje za vas. Dajte si malo vremena i probajte, sigurno nećete požaliti. Za kraj još samo napomena da je izuzetno je važno imati sigurnosnu kopiju svojih podataka i konfiguracija koje koristite unutar aplikacija kako bi rekreiranje bilo što brže i bezbolnije. |
Komentari
Ili drugi primjer: imam Windows aplikaciju koja traži podatke s CD-a koji je zapravo samo mountani ISO image (neki katalog s dijelovima). Bilo bi mi super da mogu sve to skupa zajedno zapakirati u jedan izvršni file koji mi radi na Macu i da mogu u trenu doći do podataka koji mi trebaju bez cijele predstave s VirutalBoxom, AVG-om za viruse i stalnim updateima. Prolaze li takve stvari ili ne?
Ili je sve to skupa zamišljeno samo na nekakvoj developerskoj razini, pa da onima koji pišu softver bude lakše portati stvari nabrzaka gdje treba, ali nema mogućnosti da se već gotove stvari izoliraju? Sjećam se Wine sustava, ali nisam ga nikada isprobao.
Docker je prvenstveno napravljen da olaksa deployment server aplikacija (CI/CD pipeline), da se infrastruktura (dependencyji) skriptira (dockerfile), i njeno upravljanje olaksa (docker swarm, kubernetes).
Prije par godina za takvo nešto je trebala u biti kompletna virtualka unutar koje bi se onda vrtio docker container. Trenutne vezije Dockera za mac i windows u biti imaju taj sloj još 'tanje' napravljen tako da je u biti moguće tako nešto napraviti. Dakle Docker engine se u biti vrti na Apline Linux distibuciji preko xhyve virtualnog stroja na macos-u ili hyperV (rola) na windows strani. Managment te 'male virtualke' hendla Docker aplikacija ne punokrvni hypervisor.
Poanta je da ti na cross strani ne treba u biti ni framwork ni runtime. Recimo imaš java app u docker, ne treba ti java support na bare metal instalaciji.
Jasno je da ukoliko ostaješ na istoj arhitekturi da je to najlakše i najbolje, ali Docker će sigurno i dalje raditi na tome da transparentnost postane sve bolja i bolja i trenutno je bolje nego što je bilo kada se pojavio na sceni, a vjerojatno će biti još bolje.
Svakako je primarno zamišljeno i napravljeno da se olakša rad developerima i testerima no pošto se neke aplikacije razvijaju za više platformi očito je da se krenulo i u tom smjeru. Dodatno, jednostavnost je više naglašena kada su u pitanju neke web aplikacije, a ne appovi vezani za konkretnu arhitekturu, no uz nešto truda može se napraviti.
Kada je prvi put predstavljen, tamo 2013, onda je sluzio za izolaciju aplikacija primarno na EC2 virtualci. Ali kako se tu nije moglo zaraditi dovoljno novaca, dosli su novi manageri i direktori, te se okrenuli problemu deploymenta opcenito, znaci nevezano za platformu.
Dosbox ti ne pomaže?
https://www.macupdate.com/app/mac/14973/dosbox
Inače, kad smo već kod NAS-a moram onaj push tutorial proučiti koji si negdje u temi ostavio.
http://www.jabucnjak.hr/forum/razno/162053-synology-notifikacije-putem-push-servisa.html#162053