Docker: hogyan működik és mire tudod használni


Fejlesztőként lépten nyomon abba a helyzetbe kerülhetsz, hogy a saját gépeden kell utánoznod azt a környezetet, ami a szerveren is fut.

Ez a cikk arra hivatott, hogy bemutassa hogyan teheted meg ezt a Docker program segítségével.

 

A Docker a virtuális géppekkel szemben nem a hardware-t utánozza, hanem csak az operációs rendszert.

Pontosabban szólva, az oprendszernek, könyvtáraknak és egyéb segédprogramoknak is csak azon részét, ami feltétlenül szükséges a folyamathoz.

Az így létrehozott környezet másodpercek alatt elindul és azonnal fejlesztésbe kezdhetsz.

Ha egy ilyen működő rendszert akarsz, akkor pár egyszerű lépést kell megvalósítanod.

 

Az első lépés, hogy létre kell hoznod az úgynevezett docker file-t

 

Ebben a fájlban annak a receptje van leírva, hogy milyen lépések szükségesek a kívánt fájlrendszer előállításához.

Például egy Node.js-es processz kapcsán ez a recept az alább látható módon nézne ki.

Ezt a receptet kell odaadnod a docker-nek és ő ebből, valamint a fájlrendszered egy megadott részéből összeállítja a végeredményt, az úgynevezett docker image-et.

Az image összeállításához futtasd a docker image build parancsot és ekkor a következő történik:

 

 

 

 

Miután kész az image nincs más dolgod, mint futtatni a docker container run parancsot

 

Amikor beküldöd docker run parancsot, akkor a docker létrehoz egy úgynevezett konténer réteget, ami az image rétegeken nyugszik, de azokkal szemben nem csak olvasható, hanem írható is és ezen a konténer rétegen fut végső soron a folyamat, tehát jelen esetben a node.js-es program.

Az összes változtatás, ami a futó konténerben történik, pl új fájlok írása, megélvő fájlok módosítása, fájlok törlése, az a konténer rétegben lesz nyilvántartva.

Az image rétegek fájljait érintő változtatás esetén, szintén copy-on-write stratégiával az adott fájl a konténer rétegbe másolódik és ott történik meg a változtatás.

A konténer megállítás után is elérhető marad, így nagyon gyorsan újraindítható, viszont ha a konténert törlöd, akkor a rétegre megtörtént változtatások elvesznek.

 

 

Minden külön folyamatod kapcsán érdemes külön image-et létrehozni, pl ha a programunkban futna két node js-es app, az egyik mondjuk egy webszerver, a másik egy időszakosan lufutó processz és emellett lenne egy harmadik mongodb-s folyamat is, akkor ezeknek külön-külön image-et kell létrehozni.

 

A konténerek létrehozását automatizálhatod, a docker-compose segítségével.

 

Ebben az esetben a docker-compose.yml fájlban meg kell adnod a docker számára, hogy miként kell létrehoznia a konténereket.

És utána nem a docker container run parancsot kell futtatnod, hanem a docker-compose up-ot:

 

 

Ha bekötsz a konténerbe volume-ot, akkor azzal ráerősítesz a konténer fájlrendszerére egy mappát a gazda fájlrendszerből és engeded, hogy a konténer ebbe írjon és ebből olvasson. 

Tipikusan azokat a fájlokat szokás bemount-olni, amit fejlesztés során szerkesztesz, tehát a forrásfájljaid, másrészről pedig azokat a fájlokat amiket meg akarsz őrizni a konténer törlését követően is.

 

Az ideális módon üzemeltetett docker konténer az olyan mint egy állapotmentes process. Ez azt jelenti, hogy minden olyan adat, aminek meg kell örződnie (pl. adatbázisba és fájlrendszer-be írt adatok) az mountolva van a gazda fájlrendszerből és a container az csak a számítások végrehajtását végzi.

 

Ebből adódik, hogy a konténer úgy kell legyen megkonstruálva, hogy pl egy újraindítás, code deploy vagy konfig változás miatti memória vagy fájlrendszerbeli adatvesztés ne okozzon semmi fejfájást, hanem azonnal fel lehessen pörgetni egy új konténert, ami az előzővel azonosan tud működni.

 

Teljes videó:



Ajánlott cikk: A gyors fejlődés receptje kezdőknek