Hogyan tudhatja, hogy a Dockerre van szüksége, nem pedig VM-re? Meg kell határoznia, mit szeretne elkülöníteni. Ha garantáltan elkülönített erőforrásokkal és virtuális hardverrel rendelkező rendszert szeretne, akkor a VM a megfelelő választás. Ha viszont működő alkalmazásokat szeretne elkülöníteni a rendszer különálló folyamataiként, akkor Önnek a Dockerre lesz szüksége.
Miben különböznek a Docker-kontejnerek a VM-től?
Virtuális gép (VM) — ez egy virtuális számítógép, amely minden virtuális eszközzel és virtuális merevlemezzel rendelkezik, amelyre egy új, független operációs rendszert telepítenek virtuális eszközmeghajtókkal, memóriakezeléssel és más komponensekkel együtt. Ezáltal a fizikai hardver absztrakcióját kapjuk, amely lehetővé teszi, hogy egy számítógépen több virtuális számítógép fusson.
A telepített VM különböző módon foglalhat helyet a számítógép merevlemezén:
- fix mennyiségű helyet a merevlemezen, amely gyorsabb hozzáférést biztosít a virtuális merevlemezhez, és megakadályozza a fájlfragmentálódást;
- dinamikus memóriaallokációval. További alkalmazások telepítésekor a memória dinamikusan ki lesz allokálva ezekhez, amíg el nem éri a maximális kibővített mennyiséget.
Minél nagyobb virtuális gépekhez a szerveren, annál nagyobb helyet foglalnak el, és folyamatos támogatást igényelnek a működéséhez szükséges környezethez.
Docker ez egy szoftver a konténer alapú alkalmazások létrehozásához. A konténerek és virtuális gépek hasonló előnyökkel rendelkeznek, de másképp működnek. A konténerek kevesebb helyet foglalnak el, mivel több közös erőforrást használnak újra a hoszt rendszeren, mint a VM, mivel a VM-mel ellentétben az operációs rendszer szintjén biztosít virtualizációt, nem hardver szinten. Ez a megközelítés kevesebb memóriahasználatot, gyorsabb telepítést és egyszerűbb skálázhatóságot biztosít.
A konténer hatékonyabb mechanizmust biztosít az alkalmazások elkapszulázására, lehetővé téve a szükséges interfészeket a hoszt rendszer számára. Ez a lehetőség lehetővé teszi a konténerek számára, hogy megosszák a rendszer kernelét, ahol minden egyes konténer a fő operációs rendszer külön folyamataként működik, amely saját memóriaterületekkel rendelkezik (saját virtuális címterével). Mivel minden konténer virtuális címtérrel rendelkezik, a különböző memóriaterületekhez tartozó adatok nem módosíthatók.
A Docker natív operációs rendszere a Linux (a Dockert Windows-on és MacOS-en is lehet használni), amely a fő előnyeit hasznosítja, lehetővé téve a kernel megosztását. A Docker konténerek Windows-on Linux operációs rendszerű virtuális gépen belül fognak futni, mivel a konténerek megosztják a hoszt rendszer operációs rendszerét, és az alap operációs rendszerük a Linux.
Mi az a konténer és hogyan működik?
Konténer — ez egy alkalmazási szintű absztrakció, amely egyesíti a kódot és a függőségeket. A konténerek mindig képekből készülnek, hozzáadva egy írásra elérhető felső réteget, és inicializálva a különböző paramétereket. Mivel a konténer saját írási rétegével rendelkezik, és minden módosítás ebben a rétegben kerül tárolásra, több konténer is együtt használhatja ugyanazon alap képhez való hozzáférést.
Minden konténert a docker-compose projektfájl segítségével lehet konfigurálni, amely a fő megoldás része — docker-compose.yml. Itt különféle paramétereket lehet beállítani, például a konténer nevét, portokat, azonosítókat, erőforrás-korlátokat és más konténerekkel való függőségeket. Ha a beállításokban nem adunk meg konténernevet, a Docker minden alkalommal új konténert fog létrehozni, véletlenszerű nevet rendel a konténerhez.
Amikor a konténer egy képből elindul, a Docker a fájlrendszert olvasási-írási módban csatlakoztatja az alatta lévő bármely réteghez. Itt fognak végrehajtódni azok a folyamatok, amelyeket szeretnénk, hogy a Docker konténereink végrehajtsanak.
Amikor a Docker először indít egy konténert, a kezdeti olvasási-írási réteg üres. Amikor módosítások történnek, azok ebbe a rétegbe kerülnek; például, ha meg szeretné változtatni egy fájlt, az a fájl a csak olvasási rétegről a olvasási-írási rétegbe lesz másolva.
A fájl csak olvasható verziója továbbra is létezni fog, de most már egy másolat mögött rejtve van. Az adatok tárolására, a konténer életciklusától függetlenül, kötetek használatosak. A köteteket a konténer létrehozásakor inicializálják.
Hogyan kapcsolódik a kép a konténerhez?
Kép — a legfontosabb elem minden konténer számára. A kép a projektbe hozzáadott Dockerfile-ból készül, és egy egymásra halmozott, és együtt csoportosított, csak olvasható fájlrendszerek (rétegek) halmaza; a maximális számú réteg 127.
Minden kép alapja egy alap kép, amelyet a FROM parancs határoz meg — a Dockerfile képének létrehozási pontja. Minden réteg egy readonly réteg, amelyet egy parancs képvisel, amely módosítja a Dockerfile-ban rögzített fájlrendszert.
Ezeknek a rétegeknek egy képpé való egyesítéséhez a Docker az Advanced multi layered Union file system-t használja (Az AuFS a UnionFS alapjain épül), lehetővé téve, hogy különböző fájlok és könyvtárak különböző fájlrétegekből átláthatóan fektessenek egymásra, létrehozva egy kapcsolt fájlrendszert.
A rétegek metainformációkat tartalmaznak, amelyek lehetővé teszik, hogy minden régréteghez tartozó kísérő információt megőrizzünk a végrehajtás és a build során. Minden réteg egy hivatkozást tartalmaz a következő rétegre; ha egy réteg nem hivatkozik másikra, akkor ez a legfelső réteg a képben.
A Dockerfile tartalmazhat olyan parancsokat, mint:
- FROM — a kép létrehozási pontja;
- MAINTAINER — a kép tulajdonosának neve;
- RUN — a parancs végrehajtása a kép buildje során;
- ADD — fájl másolása a gazdagépről az új képbe; ha URL-t adunk meg, a Docker letölti azt a megadott könyvtárba;
- ENV — környezeti változók;
- CMD — új konténer létrehozása a kép alapján;
- ENTRYPOINT — parancs, amely a konténer indításakor hajtódik végre.
- WORKDIR — a parancs CMD végrehajtásához szükséges munkakönyvtár.
- USER — az UID beállítása a kép alapján létrehozott konténer számára.
- VOLUME — könyvtár beszerelése a gazdagépről a konténerbe.
- EXPOSE — a konténerben figyelő portok készlete.
Hogyan működik a UnionFS?
UnionFS — szolgáltatási réteges fájlrendszer (FS) Linux és FreeBSD számára. Ez a fájlrendszer a másolás írási mechanizmusát (Copy-On-Write, COW) valósítja meg. A UnionFS munkai egysége egy réteg, amelyet úgy kell tekinteni, mint különálló, teljes értékű fájlrendszert, hierarchikus könyvtárstruktúrával a gyökértől kezdve. A UnionFS egyesített csatolást hoz létre más fájlrendszerek számára, és lehetővé teszi a felhasználó számára, hogy különböző fájlrendszerek fájljait és könyvtárait (ágaknak nevezett) átláthatóan egy összekapcsolt fájlrendszerben egyesítse.
Az azonos útvonalú könyvtárak tartalma egy helyen fog megjelenni, egyesített könyvtárban (az egyesített névtérben) a kapott fájlrendszeren belül.
A UnionFS a következő elveket követve egyesíti a rétegeket:
- az egyik réteg a legfelső szintű réteg lesz, a második és a továbbiak alsó szintű rétegek;
- a felhasználó számára a rétegek objektumai "felülről lefelé" érhetők el, azaz ha a kért objektum a "felső" rétegben létezik, az visszaadódik, függetlenül attól, hogy van-e ugyanilyen nevű objektum az "alsó" rétegben; különben az "alsó" réteg objektuma kerül visszaadásra; ha a kért objektum egyik helyen sem létezik, akkor "Nincs ilyen fájl vagy könyvtár" hibaüzenet kerül visszaadásra;
- a munkaréteg a "felső" réteg, tehát a felhasználó adatmódosítási műveletei csak a legfelső szintű rétegen tükröződnek, anélkül, hogy hatással lennének az alsó szintű rétegek tartalmára.
A Docker a legelterjedtebb konténertechnológia az alkalmazások működésében. Ez a terület standardjává vált, amely a cgroups és a névtér alapelvein alapul, amelyeket a Linux magja biztosít.
A Docker lehetővé teszi számunkra, hogy gyorsan telepítsük az alkalmazásokat és optimálisan kihasználjuk a fájlrendszert a rendszerkern és az összes konténer közötti megosztás révén, működve, mint a rendszer különálló folyamatai.
Forrás: habr.com
