Section author: Luka Brumnić, Vedran Miletić

Kontejnerizacija alatom Docker

Hint

Za više informacija proučite službenu dokumentaciju.

Docker je skup alata za kontejnerizaciju (poznatu još i pod nazivom kontejnerska virtualizacija ili virtualizacija na razini operacijskog sustava, engl. operating-system-level virtualization) i dijeljenje aplikacija putem interneta (gdje mu je princip rada vrlo sličan Gitu). Sve je popularniji u svijetu, koristi ga vrlo veliki broj poslovnih subjekata i danas je dostupan kao paket u gotovo svim distribucijama Linuxa.

Primjer primjene

Kao alat, Docker ima vrlo široku primjenu. U ovom projektu iskoristiti ću ga kao alat za dijeljenje kompaktnog OS-a za rad sa JSON-om.

Ideja jest da se napravi mali OS koji ce se moci pokrenuti na svakoj mašini gdje god se nalazio, i da ču na toj mašini imati instalirane sve potrebne alate za rad u JSON-u i podizanje izmjenjenih fileova na GitHub.

Distribucija prilagođenog OS-a

Proces kreće se instaliravanjem Docker alata na mašinu, što je već i učinjeno. Sljedeći korak jest pokretanje samom dockera i prijavljivanje na online repozitorij. Iskoristio sam postojeći account sa github-a za izradu docker repozitorija te sam se na taj način prijavio. Odabrao sam sinatru za sustav koji ću prilagoditi svojim potrebama pa za početak povlačim na lokalnu mašinu:

$ sudo docker pull training/sinatra

Sljedeći korak jest pokretanje preuzetog sustava i izvršavanje željenih izmjena u sustavu, instaliravanje i brisanje paketa i sl, u ovom slučaju demonstracije radi sam instalirao json i jos neke dodatne alate:

$ sudo docker run -t -i training/sinatra /bin/bash
$ gem install json
$ sudo apt-get install git

i dodatno sam preuzeo stari repozitorij sa bitbucketa koji sam napravio na distribuiranim sustavima:

$ git clone https://lbrumnic@bitbucket.org/lbrumnic/ds_projekt.git

Nakon toga izlaskom iz trenutne slike, vrši se commit napravljenih izmjena prema trenutnom “kontejneru” koji se kreirao pokretanjem slike:

$ sudo docker commit 79de9d702c2e lukabrumnic/sinatraluka

Svaki kontejner pri pokretanju dobije svoj individualni id koje se može provjeriti naredbom:

$ sudo docker ps

Na kraju ta ista slika se “push-a” na online repozitorij:

$ sudo docker push lukabrumnic/sinatraluka

U sljedećem koraku sljedi testiranje napravljenih izmjena a to ću napraviti tako da podignem novi virtualni stroj sa sutavom Fedora 20, te se na njemu ulogiram u svoj Docker repozitorij, preuzmem traženu sliku i provjerim imam li instaliran json na njoj.

Fedora 20 ima Docker u službenom repozitoriju paketa stoga je dovoljno instalirati paket docker-io. Nakon instalacije paketa, vrši se loginna docker repozitorij, zatim se preuzima željeni image te se istog pokreće.

$ sudo docker login
$ sudo docker pull lukabrumnic/sinatraluka
$ sudo docker run -t -i lukabrumnic/sinatraluka /bin/bash

Provjeru da je riječ o istom imageu nalazim u home folderu gdje sam preuzeo repozitorij sa Bitbucketa.

Ostale primjene

Od ostalih primjena postoji mogućnost pokretanja daemon aplikacije u pozadini čime se zapravo pokreće novi container u kojem se neka aplikacije vrti. Još jedna korisna mogućnost je pokretanje web aplikacija u Dockeru. Uzmimo primjer:

$ sudo docker run -d -P training/webapp python app.py

Aplikacije se pokrene na portu 49153 no može se ručno podesiti da aplikacije se izvršava na željenom portu. Primjer prema gornjem primjeru:

$ sudo docker run -d -p 5000:5000 training/webapp python app.py

Dodatno se još može specificirati i interface na kojemu će se pokrenuti aplikacije, po defaultu će vezati specificirani port na sva sučelja no to se može ograničiti. Primjer za gonji primjer:

$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py

Također se mogu pokrenuti u pozadini i izvršavati određene aktivnosti bez smetnje za klijenta.

$ sudo docker run -d -p ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

Konfiguracija

U datoteci /etc/default/docker mogu se podešavati različiti parametri za rad naredbe docker, kao primjerice lokacija spremanja privremenih fileova i slično. Isto tako moguće je definirati na kojem se defaultnom portu pokreću daemon docker apps.

Za prikupljanje logova o aktivnostima na pokrenutim containerima postoje mnogi alati. Specijaliziraju se u prikupljanju i centraliziranju logova sa svih pokrenutih kontejnera i šalju ih na centralni poslužitelj gdje se isti premaju. Neki od alata su Loggly i Fluentd.