Preskočite na sadržaj

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.

Jedan od osnovnih razloga toj popularnosti je Docker Hub, web sjedište na kojem se dijele slike kontejnera. Posebna vrsta slika su službene slike (engl. official images), čiji razvoj i održavanje financira sam Docker. Osim slike hello-world kojom se testira ispravnost instalacije Dockera, u službene slike spadaju httpd, python, php, node, haproxy, mariadb, mongo, postgres, redis, nextcloud, memcached, docker (da, Docker može pokrenuti drugi Docker u kontejneru koji onda može pokretati Docker kontejnere) i brojne druge. Na stranici svake od službenih slika dane su detaljne upute za njeno korištenje.

Tip

U nastavku koristimo službene Dockerove alate naredbenog retka, ali moguće je koristiti i Visual Studio Code koji nudi službeno proširenje za Docker (pregled značajki).

Dodatno, korištenjem službenih proširenja za udaljeni rad moguće je razvijati softver unutar Docker kontejnera. Za one koji žele znati više o razvoju softvera u kontejnerima, dobro mjesto za započeti je Microsoftov službeni tečaj za Docker početnike.

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"

Baratanje kontejnerima aplikacija

Baratanje kontejnerima vršimo naredbom docker container. Provjerimo popis pokrenutih kontejnera naredbom docker container list:

$ sudo docker container list
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

Vidimo da ih nema. Dodamo li parametar -a (--all), bit će prikazani svi kontejneri:

$ sudo docker container list -a
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS                     PORTS               NAMES
1e470c81b80a        httpd               "httpd-foreground"   12 minutes ago      Exited (0) 3 minutes ago                       eager_mcnulty

Među njima je i kontejner koji smo stvorili pokretanjem slike httpd. Pokrenimo ga naredbom docker container start korištenjem ID-a:

$ sudo docker container start 1e470c81b80a
1e470c81b80a

ili korištenjem imena:

$ sudo docker container start eager_mcnulty
eager_mcnulty

Kako god smo izveli pokretanje, uvjerimo se da je pokrenut naredbom docker ps:

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS               NAMES
1e470c81b80a        httpd               "httpd-foreground"   14 minutes ago      Up 6 seconds        80/tcp              eager_mcnulty

Naposlijetku, naredbom docker logs pročitajmo poruke koje je kontejner ispisao nakon pokretanja:

$ sudo docker logs eager_mcnulty
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Thu May 07 23:25:00.371329 2020] [mpm_event:notice] [pid 1:tid 139777378702464] AH00489: Apache/2.4.43 (Unix) configured -- resuming normal operations
[Thu May 07 23:25:00.371673 2020] [core:notice] [pid 1:tid 139777378702464] AH00094: Command line: 'httpd -D FOREGROUND'
[Thu May 07 23:33:30.363896 2020] [mpm_event:notice] [pid 1:tid 139777378702464] AH00491: caught SIGTERM, shutting down
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Thu May 07 23:39:07.310914 2020] [mpm_event:notice] [pid 1:tid 140007882990720] AH00489: Apache/2.4.43 (Unix) configured -- resuming normal operations
[Thu May 07 23:39:07.311262 2020] [core:notice] [pid 1:tid 140007882990720] AH00094: Command line: 'httpd -D FOREGROUND'

Poruke su iste kao i kod pokretanja naredbom docker run iznad.

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.

Author: Luka Brumnić, Vedran Miletić