Docker EXPOSE vagy nem EXPOSE. Ez itt a kérdés

Borító kép a videóból kivágva

Ebben a videóban a Docker EXPOSE funkcióját fogom bemutatni. Valószínűleg sokaknak nem egyértelmű, ahogy nekem sem volt az, hogy mire való, mikor számít. Ráadásul többféleképpen is lehet definiálni. Ideje a végére járni tehát, hogy mi is ez valójában. A videóhoz angol felirat is elérhető.

Megosztás/Mentés

Docker image készítése ős image nélkül, manuálisan a fájlok szerkesztésével

Borító kép a videóból kivágva

Az előző részben már elkészült az első Docker image Dockerfile nélkül, viszont használtunk ős image-et. A kérdés így még megmaradt: tudunk-e image-et készíteni ős image nélkül? A válasz igen. Ehhez kicsit jobban kell értenünk a Docker adatkönyvtárának a felépítését, de a videó végére pusztán a /var/lib/docker mappában levő fájlok írásával készítünk egy nagyon alap Docker image-et bármiféle ős nélkül.

Megosztás/Mentés

Docker image készítése docker build parancs használata nélkül

Borító kép powerpointtal szerkesztve

A Docker build-ről nem először van szó az I.T. szigeten és nem is utoljára. De vajon érted-e, mi zajlik a build parancs mögött? Lehet, hogy elsőre úgy tűnik, erre nincs is szükség, hiszen épp az a lényeg, hogy a Docker megoldjon mindent. Ha viszont hibát kell keresni, nagyon sokat jelent, hogy tudjuk-e, mire utalhat egy hibajelenség. Hacsak nincs valamilyen fizetős támogatásunk, akkor nem árt kicsit a színfalak mögé nézni. A következőkben azt mutatom be, hogyan lehet saját buildert is készíteni, amihez persze meg kell ismerni, milyen lépéseket végez el a builder és ezek alapján milyen lépéseket kel nekünk leprogramozni. A docker build összes funkcióját nem programozzuk le, de éppen eleget ahhoz, hogy egy hiba esetén már legyen fogalmad arról, hogyad légy önmagad supportja.

Megosztás/Mentés

Systemd indítása Ubuntu 20.04-es Docker konténerben

Borító kép powerpointtal szerkesztve

A Systemd egy olyan init rendszer és processzkezelő, ami rengeteg funkciót ellát és nem telepítjük Docker konténerben, ha van más mód. És általában van más mód. De előfordulhat, hogy mégis szükséges konténerben alkalmazni, mert egy olyan szoftvert kell telepíteni majd egy szerveren, amit jó lenne kipróbálni előtte. Ansible esetén gyakori megoldás. De az is lehet, hogy tényleg tegnapra kell valami és valamiért nem opció a hoszt rendszerre telepítés, viszont nincs idő jól megoldani. Ilyenkor marad a konténerben, csomagkezelővel telepítés, ami viszont gyakran Systemd-t igényel. Bemutatok egy megoldást Ubuntu 20.04-es konténerben és kitérek arra is, mi bajt okozhat a grafikus felületünknek a hibás konfiguráció.

Megosztás/Mentés

Több processz indítása Docker konténerben

Borító kép powerpointtal szerkesztve

Hogy mi a jelentősége annak, hogy a Docker konténerekben megfelelően állítsuk össze a futtatandó parancsot és a "docker stop" parancs ne vezessen adatvesztéshez, arról már volt szó. Minden eddigi megoldás viszont leginkább egyetlen program esetén volt jó, ráadásul megfelelő gyakorlat nélkül nagyobb az esélye annak, hogy valamit elhibázunk. Ha ráadásul több, a háttérben futó programot kellene kezelni egyetlen konténerben, annak leprogramozása shell szkriptben még nagyobb odafigyelést igényelne. Bár általában elkerüljük ezt a utat és minden program külön konténert kap, vannak olyan esetek, amikor ezt nem tudjuk megtenni. Ilyenkor kell keresnünk egy olyan eszközt, ami kezeli a háttérben futó szolgáltatások processzeit, beleértve a standard inputot és az error streamet is. Docker konténereknél talán a legelterjedtebb megoldás a Supervisor. A következőkben a korábban használt Python HTTP servert és az Apache HTTPD szervert fogom egy konténerben indítani.

Megosztás/Mentés

Kis méretű Docker image készítése Go nyelven

Borító kép zöld GO gombbal a pixabay.com-ról powerpointtal szerkesztve

A Docker konténerekkel találkozva nem telik el sok idő, míg szembesülünk Go nyelvvel vagy legalább a Go template-tel, mivel a Docker is Go nyelven készült és a Docker kliensnél is használhatunk Go template-et bizonyos kimenetek formázására. Talán már hallottál arról is, hogy lehet készíteni Go-ban olyan programokat is, amikből egyetlen bináris generálható, ami aztán könnyedén használható konténerben is. Ha minden függőségünk benne van ebben a fájlban, mivel a legtöbb esetben a konténerben levő alap Linux fájlrendszert úgysem használjuk ki, azt akár teljesen el is hagyhatjuk és egy "scratch" image-re építve elkészíthetjük az egyetlen binárist tartalmazó Docker image-ünket, így egy nagyon kis méretű image-et eredményezve. Mutatom, hogy build-elheted a legegyszerűbb Go programot, mik azok, amikre valószínűleg még szükséged lehet és mi kell ahhoz, hogy Docker konténerben is működjön a build.

Megosztás/Mentés

Docker konténerek helyes leállítása adatvesztés nélkül

Borító kép stop táblával a pixabay.com-ról powerpointtal szerkesztve

Van egy fajta bizalmatlanság a Docker konténerekkel szemben, aminek az egyik oka az is lehet, hogy ha a Docker image-et nem jól készítjük el, vagy az indításkor rosszul használjuk a paramétereket, akár olyan jelenséghez is vezethet, hogy a konténer leállításakor adatok sérülnek és az alkalmazás legközelebb akár el sem indul. Ez persze nem egy mindennapos dolog, de tény, hogy aki konténerekben szeretne programokat futtatni, jobban meg kell ismerkedjen a Linuxszal, a processzek közti kommunikációval, signalok kezelésével és azzal, hogy ezeket hogyan befolyásolják a Dockerfile-ban definiált SHELL, ENTRPYOINT és CMD direktívák. Ha te is szeretnéd elkerülni az említett problémát, vagy csak régóta töprengsz azon, mi történik a Docker konténerek leállításakor, akkor ez a cikk neked készült.

Megosztás/Mentés

A SHELL signalok ereje videóban, mellékelt forráskóddal

Borítókép címmel és súlyzós ember alakkal a pixabay-ről, PowerPoint-tal generálva.

Az előző alkalommal végigjártuk a konfigurációs fájlok újratöltésének módját SHELL szkriptekben, amihez a HUP signalt használtuk, de ennél sokkal több signal létezik. A videóbann bemutatok néhányat, amit talán még nem is hallottál, valamint arra is látsz majd példát, hogyan lehet az egyik processzből továbbítani egy másik felé a jeleket. Ez felhasználható arrra is, hogy egy több processzt indító szkript a leszármazottakat is leállítsa megfelelően, vagy éppen a leszármazottak jelezzenek a szülőnek, hogy már leállhat ő is.

Megosztás/Mentés

Konfigurációs fájl újratöltése SHELL-ben a program leállítása nélkül

Borítókép címmel és pingvin képpel PowerPoint-tal generálva.

Korábban megmutattam, hogy tölti újra az NginX proxy a konfigurációs fájlt, miután a docker-gen újragenerálta. Ezt a módszert saját szkripteknél is lehet alkalmazni, de a használt parancs nem működik automatikusan, hanem az egyes programoknak maguknak kell lekezelni, hogy mit kezdenek a nekik küldött utasítással. Utasítások alatt pedig most a signalokat, magyarul jeleket értjük, amikből több is létezik, most viszont kifejezetten arra fogunk koncentrálni, amit a háttérben futó démon programoknál jellemzően a konfigurációs fájl újratöltésére használunk. A videóban megmutatom, hogyan tudsz saját szkriptet írni, ami menet közben képes utasításra leálllás nélkül változtatni a beállításain.

Megosztás/Mentés

Minden, amit tudni akartál a Docker konténerekben futtatott parancs összeállításáról

Borítókép címmel és SHELL ikonnal PowerPoint-tal generálva.

A Docker konténerekben időnként anélkül is el lehet veszni, hogy egy három komponensből álló parancs elemeinek kapcsolatán kellene gondolkodni és megválasztani a helyes megoldást. Bár első ránézésre egyszerűnek tűnik, van azért néhány olyan tényező, amit talán te sem ismertél. A videó befejezése után viszont már te is bevetésre készen állsz majd, hogy mindig pontosan úgy fussanak a programok a konténereidben, ahogy azt megálmodtad.

Megosztás/Mentés