Blog

Uvod u Docker

Robert Jambrečić

U ovom ćemo vas blogu upoznati s platformom za kontejnerizaciju Docker. Objasnit ćemo razliku između kontejnera (engl. container) i virtualnih strojeva (engl. virtual machine – VM) te nabrojati neke prednosti i nedostatke. Zatim ćemo vas provesti kroz osnovne naredbe te na kraju pokrenuti jednostavnu Django aplikaciju unutar Docker kontejnera.

Kontejneri vs virtualni strojevi

Kontejneri i virtualni strojevi su zapakirana računalna okruženja koja kombiniraju različite IT komponente i izoliraju ih od ostatka sustava. Kontejneri se stvaraju povrh jezgre operacijskog sustava (engl. operating system – OS) te sadrže samo najvažnije datoteke potrebne za rad sustava. S druge strane, svaki virtualni stroj koristi svoj operacijski sustav [1]. Iz tog razloga, kontejneri se najčešće mjere u megabajtima dok se VM-ovi mjere u gigabajtima. Kod VM-ova se za raspolaganje fizičkim resursima poput CPU-a i RAM-a brine tzv. “Hypervisor”.  Za istu stvar, Docker koristi Docker motor (engl. engine).

Slika 1. VM i kontejner arhitektura

Brzina pokretanja jedna je od prednosti korištenja kontejnera. Za pokretanje VM-a potrebno je nekoliko minuta, dok se kontejneri pokreću u samo nekoliko sekundi. S druge strane, VM-ovi su potpuno izolirani jedni od drugih te su iz tog razloga i sigurniji.

Docker slike (engl. images) i kontejneri

Prilikom korištenja Dockera, najčešće ćete se susresti sa sljedeća dva pojma: slike i kontejneri. Docker slika je predložak koji dolazi s uputama za postavljanje kontejnera.

Slika se sastoji od skupa datoteka (ili slojeva) koje sadrže sve potrebne elemente, kao što su ovisnosti, izvorni kod i knjižnice potrebne za postavljanje potpuno funkcionalnog okruženja kontejnera. Docker kontejner je virtualizirano okruženje koje omogućava odvajanje izvršavanja aplikacija od temeljnog sustava. Kontejner je jedan primjerak slike [2].

Docker osnovne naredbe

Preduvjeti za daljnje aktivno praćenje ovog bloga je ugrađen Docker. Ako već niste, to možete učiniti prateći uputstva na službenoj stranici get-docker.

Uspješnost instalacije možete provjeriti pokretanjem sljedeće naredbe unutar terminala:

docker run hello-world

U prvoj liniji nakon pokretanja naredbe možete vidjeti kako Docker prvo lokalno traži sliku “hello-world”. Kako ju nije pronašao, traži ju u Docker registru te ju od tamo preuzima.

Pomoćupullnaredbe, preuzimamo Docker slike iz Docker registra te ih spremamo lokalno na naše računalo. Sljedećom naredbom preuzimamo “alpine” sliku (najmanja Docker slika bazirana na Alpine Linuxu):

docker pull alpine

Za stvaranje kontejnera iz slike, potrebno je pokrenuti sljedeću naredbu:

docker run -it alpine

Trenutno se nalazite unutar kontejnera i pokretanjem naredbe ls dobivate popis datoteka u trenutnom direktoriju unutar kontejnera. Za izlazak iz kontejnera potrebno je upisati exit.

docker ps naredba prikazuje sve aktivne kontejnere. Kako trenutno nema aktivnih kontejnera, dobiva se sljedeći ispis.

Pomoću naredbe docker ps -a dobivamo sve kontejnere, aktivne i one koji su završili s radom (u stupcu “STATUS” piše je li kontejner aktivan).

Za brisanje kontejnera, koristi se naredba docker rm container_name (npr. docker rm youthful_mcclintock).

Ako želimo kontejneru dodijeliti ime, možemo to učiniti pomoću zastavice –name :

docker run –name alpinko -it alpine

Zatim kontejner s imenom “alpinko” možemo aktivirati ili gasiti pomoću sljedećih naredbi:

docker start alpinko

docker stop alpinko

Te ga na kraju izbrisati:

docker rm alpinko

Django aplikacija unutar Docker kontejnera

Nakon što ste savladali osnove Dockera, vrijeme je za kreiranje svoje vlastite Docker slike.

Prije nego što se bacimo na posao, potrebno je iz Git repozitorija skinuti našu jednostavnu Django aplikaciju te se pozicionirati u repozitorij:

git clone https://github.com/robijam/hello.git

cd hello/

Unutar repozitorija nalazi se datoteka Dockerfile. U ovom primjeru, Dockerfile specificira sve što naš kontejner treba imati, kako bi se unutar njega mogla pokrenuti Django aplikacija.

Slika 2. Dockerfile

FROM instrukcija definira već postojeću Docker sliku, koju će naša slika koristiti kao baznu sliku.

ENV instrukcija definira varijable okruženja (engl. environment variables).

WORKDIR instrukcija definira naš radni direktorij unutar kontejnera.

COPY instrukcija služi za kopiranje naših lokalnih datoteka u kontejner.

RUN instrukcija pokreće instrukciju na slici.

Sljedećom naredbom stvaramo Docker sliku pomoću Dockerfile-a:

docker build -t django-image.

Pomoću zastavice -t , slici dodjeljujemo ime. “.” označava da kreiramo sliku iz Dockerfile-a koji se nalazi u trenutnom direktoriju.

Zatim iz slike “django-image” koju smo stvorili, možemo napraviti kontejner i unutar njega pokrenuti Django server:

docker run -p 8000:8000 -v $(pwd):/you_can_do_it -it django-image bash

python manage.py runserver 0.0.0.0:8000

-p označava prosljeđivanje portova (engl. port forwarding) tj. svi zahtjevi koji lokalno dođu na port 8000 bit će proslijeđeni u kontejner na port 8000

-v označava volumen (engl. volume) i pomoću te zastavice se lokalne datoteke dijele s kontejnerom

Ako u internetskom pregledniku odete na adresu 127.0.0.1:8000, trebali biste dobiti sljedeću stranicu:

Nadamo se da ste uspješno došli do ovoga dijela te da ste primili naše tople pozdrave 🙂

Gdje mi koristimo Docker?

Pokušat ćemo vam ukratko opisati arhitekturu našeg sustava za detekciju i klasifikaciju proizvoda na policama te objasniti prednosti korištenja Dockera. Naš sustav koristi više servisa: Django aplikacija, baza podataka, servis za posluživanje AI modela (npr. TensorFlow Serving ili TorchServe), servis za asinkrono izvršavanje zadataka (npr. Celery) te još nekoliko servisa.  Također, sustav razvijamo na nekoliko poslužitelja te lokalno na našim računalima. Kada bismo sve te servise išli ručno postavljati na svim računalima (zatim postavljati različite varijable okruženja…), izgubili bismo veliku količinu vremena. Docker registar sadrži veliku većinu slika (Django, PostgreSQL, TensorFlow Serving…) koje već imaju sve postavljeno i na nama je samo da ih preuzmemo, stvorimo kontejnere iz njih te da ih koristimo. Tim načinom štedimo vrijeme pri prvoj konfiguraciji sustava kao i pri svakoj sljedećoj selidbi.

Zaključak

Docker je platforma za kontejnerizaciju. Kontejneri se stvaraju povrh jezgre operacijskog sustava te sadrže samo najvažnije datoteke potrebne za rad sustava. Slika je predložak koji dolazi s uputama za postavljanje kontejnera. Glavne prednosti Dockera su brzina pokretanja, skalabilnost i prenosivost. Korištenje Dockera pri izgradnji kompleksnih sustava uvelike će ubrzati i olakšati razvoj vašeg sustava.

Literatura:

[1] Containers vs. virtual machines, https://docs.microsoft.com/en-us/virtualization/windowscontainers/about/containers-vs-vm

[2] Comparing Docker Images To Docker Containers, https://www.whitesourcesoftware.com/free-developer-tools/blog/docker-images-vs-docker-containers/