A konténerképek: Docker és OCI rétegek és verziókezelés
Korábban már beszéltünk a Kubernetes-ről, Docker-ről és a különböző konténerkép kezelési megoldásokról, mint az AWS ECR és Azur ACR. Azonban arról még nem esett szó: Mi az a képfájl? Hogyan épül fel? Milyen, számunkra fontos típusokról kell beszélnünk?
A konténerizáció egyik legfontosabb eleme a konténerképek használata, amelyek a futtatható környezeteket biztosítják. A Docker és az OCI (Open Container Initiative) képek szerkezete hasonló, mivel az OCI a Docker formátumának egy nyílt ipari szabványa lett. Az OCI létrejötte azért fontos, mert egy iparági szabványt biztosít a konténerképek kezelésére, elősegítve az interoperabilitást és a hordozhatóságot különböző konténer futtatókörnyezetek között. Ezzel kiküszöböli a vendor lock-in problémát, amely egyetlen technológiai ökoszisztémához kötné a fejlesztőket és üzemeltetőket.
Most szeretném nektek bemutatni a képek szerkezetét, a rétegek kezelését, a manifest-ek szerepét és a verziókezelés módját.
Docker és OCI képek alapjai
A Docker és az OCI képek egy rétegelt fájlrendszert használnak, amely lehetővé teszi a hatékony tárolást és a gyors betöltést. Egy konténerkép három fő részből áll:
- Rétegek (Layers): A képfájl tartalma rétegekre van bontva, amelyek egymásra épülnek.
- Manifest fájl: Egy JSON-alapú leírófájl, amely meghatározza a kép struktúráját és annak különböző attribútumait.
- Config (Konfigurációs fájl): A futási beállításokat tartalmazza, mint például a környezeti változók és az alapértelmezett parancsok.
Rétegek kezelése
A konténerképek rétegei a Copy-on-Write (CoW) elv alapján működnek. Ez azt jelenti, hogy egy újabb réteg csak a módosított fájlokat tárolja, miközben az előző rétegek változatlanok maradnak. A rétegek kezelésének főbb szempontjai:
- Rétegek építése: Minden egyes
RUN
,COPY
ésADD
utasítás egy új réteget hoz létre aDockerfile
feldolgozása során. (Példa) - Rétegek optimalizálása: Érdemes minél kevesebb réteget létrehozni, és a gyakran módosuló fájlokat a végső rétegbe helyezni, hogy a cache hatékony maradjon.
- Rétegek megosztása: Ha több kép ugyanazokat az alaprétegeket használja, a konténer futtatókörnyezet (pl. Docker) csak a különböző rétegeket tölti le, így csökkenti a letöltési és tárolási igényt.
A Manifest szerepe
A manifest fájl egy JSON struktúra, amely meghatározza a kép rétegeit és meta adatait. Egy tipikus manifest a következő információkat tartalmazza:
- SchemaVersion: A manifest formátum verziója.
- Layers: A képet felépítő rétegek listája (digest formátumban).
- Config: A konfigurációs fájl hash-e, amely tartalmazza a környezeti változókat és az indítási parancsokat.
- MediaType: A fájlformátum meghatározása (Docker vagy OCI specifikus).
Az OCI és Docker image manifest formátumok nagyon hasonlóak, de az OCI teljesen nyílt és szabványosított formátumot biztosít.
Képverziók és a rétegek kezelése
A konténerképek verziókezelése többnyire címkék (tags) és digest-ek segítségével történik:
- Tag (Címke): Egy könnyen olvasható név, például
ubuntu:24.04
vagywebalkalmazas:1.2.0
. A címkék bármikor új képverzióhoz rendelhetők. - Digest (SHA256 azonosító): Egy egyedi azonosító (pl.
sha256:abcd1234...
), amely garantálja, hogy a megadott kép mindig ugyanaz marad. - Rétegek újrahasznosítása: Ha egy új verzióban csak néhány fájl változik, akkor a rétegek nagy része változatlan marad, és a Docker vagy OCI runtime csak az új rétegeket tölti le. Ezzel tárhelyet és internet sávszélességet is spórol.
A konténerképek rétegei az alábbiak szerint épülnek fel:
- Base Image (Alapkép): Az operációs rendszer és a minimális futtatókörnyezet.
- Layer 1 (Alapcsomagok és függőségek): A szükséges könyvtárak és függőségek telepítése.
- Layer 2 (Alkalmazáskód hozzáadása): Az egyedi alkalmazás fájljainak bemásolása.
- Layer 3 (Konfiguráció és optimalizáció): A futtatási beállítások és optimalizációk alkalmazása.
- Final Image (Végleges kép): Az összes réteg egyesítésével elkészült futtatható konténerkép.

Mi a különbség a Docker és az OCI között?
Bár az OCI a Docker formátumából fejlődött ki, a kettő között van néhány alapvető különbség:
- Nyílt szabvány: Az OCI egy iparági konszenzusra épülő nyílt szabvány, míg a Docker formátumát eredetileg a Docker Inc. hozta létre.
- Kompatibilitás: Az OCI szabvány célja a konténerképek hordozhatóságának biztosítása bármely futtatókörnyezet között, míg a Docker esetén elsősorban a Docker Engine-re optimalizált képekkel dolgozunk.
- Modularitás: Az OCI szabvány különválasztja a runtime és az image specifikációkat, így rugalmasabb, és más futtatókörnyezetek is könnyen alkalmazhatják.
Összegzés
A Docker és OCI képek rétegelt felépítése lehetővé teszi a hatékony tárolást, gyors letöltést és verziókezelést. A manifest fájl kulcsfontosságú szerepet játszik a kép struktúrájának meghatározásában, míg a rétegek megosztása és optimalizálása jelentősen csökkentheti az erőforrásigényt.
Az OCI formátum szabványosította ezt a struktúrát, így biztosítva a kompatibilitást és a jövőbeli skálázhatóságot.
Remélem kicsit sikerült érhetővé tennem a képfájlok struktúráját. 🙂