docker

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

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

Naplózás Docker konténerekben

Borítókép címmel és neon fény hatású háromszöggel PowerPoint-tal generálva.

A Docker konténerekben futó alkalmazások naplóbejegyzéseit általában a "docker logs" paranccsal kérdezhetjük le.
Hogyha ezt lefutattom a parancssorban, akkor minden naplóbejegyzés ki fog kerülni a képernyőre. A kérdés az, hogy hogy kerül ide. Honnan tudja a "docker logs", hogy honnan kell a naplóbejegyzéseket lekérdezni? A mellékelt videóban bemutatom a Docker konténereknél a naplóbejegyzések kezelésének alapjait, majd benézünk a motorháztető alá, miért is működik a logok lekérdezése és hogyan érhetjük el az aktuális logokat akkor is, ha a korábbi logok mentése le van tiltva.

Megosztás/Mentés

Nginx és docker-gen futtatása külön konténerben

Borítókép címmel és hálózati csatlakozó képével PowerPoint-tal generálva.

A múlt alkalommal megmutattam, hogyan lehet úgy Docker konténerekkel konfigurálni weboldalakat, hogy előttük van egy NginX proxy, ami a különböző domainekre érkező kéréseket továbbítja különböző konténerek felé. Ezt viszont eddig egy darab konténerrel oldottuk meg, ami tartalmazta egyszerre a "docker-gen"-t, ami generálta a konfigurációs fájlt és az NginX szervert is. A "docker-gen"-nek viszont fel kell csatoltunk a Docker socket fájlt, hogy el tudja érni a Docker API-t, amiből le tud kérni információkat, hogy le tudja generálni a konfigurációs fájlt. Ilyenkor viszont, ha valaki mégis csak be tud jutni az NginX szerveren keresztül a konténerbe, akkor gyakorlatilag minden Docker konténerünkhöz hozzáfér. Ezt elkerülendő szét fogjuk választani a "docke-gen"-t az NginX szervertől két külön konténerbe, és ezek után már csak a "docker-gen" fogja tudni elérni a Docker API-t.

Megosztás/Mentés

WSL2-es gépben futó konténerek elérése LAN hálózaton mobiltelefonról

villanykörtében villámlás a pixabay.com-ról PIRO4D felhasználótól

A hosszú tartalmak után végre lehet szusszanni egyet a következő villámtippel. Ha Windows 10-ben szeretnél Linuxos Docker konténert futtatni, akkor a Windows Subsystem For Linux is egy jó megoldás lehet, de az ilyen gépekben kiengedett portokat nem lehet elérni a LAN hálózaton. Vagy mégis? A cikkből és a mellékelt videóból kkiderül.

Megosztás/Mentés

Virtuális hosztok Dockerbarát módon NginX reverse proxy-val

proxy network felirat a pixabay.com-ról kevinandthepup felhasználótól

Minden eddigi megközelítésünk lényege az egyszerűség volt, hogy kis lépésekben haladjunk előre. Eljött az a pont, amikor már elhagyjuk a kényelmes hoszt network-öt és a konténerek saját IP-t kapnak. Ezzel viszont bonyolódik a több weboldal elérése, amennyiben minden weboldalt külön konténerben indítunk. Bár a HTTPD-vel is konfiguráltunk proxy-t, jellemzően nem azt használjuk erre a célra, hanem például NginX-et vagy HAProxy-t. A következőkben az NginX proxy konfigurálását mutatom be dinamikusan generált konfigurációs fájllal, hiszen nem tudjuk előre a konténerek IP címeit, ráadásul meg is változhatnak időnként. Innentől kezdve minden konténert, beleértve az előző alkalmakkor konfigurált fájlfeltöltőt és letöltőt, illetve alapértelmezett weboldalt is ugyanazon a proxy-n keresztül fogjuk elérni. Bár élesben a fájlfeltöltő mögötti PHP sem a parancssori PHP-ból indított webszerverrel fog működni, ezt most hagyjuk, ahogy van és csak a proxy-ra koncentrálunk.

Megosztás/Mentés

A legegyszerűbb HTTPD Docker image elkészítése

LEGO keret kép felhasználásával a pixabay.com-ról AnnaliseArt felhasználótól docker image build felirat.

Folytatjuk az utunk az előző részben indított HTTPD Docker konténer után, de már saját Docker image-et is készítünk. Ez az image még egy nagyon egyszerű megoldás lesz a koncepció megértéséhez, ami még nem a végleges, éles környezetre szánt verzió, de innentől nagyon jó úton fogunk haladni afelé. Ez nem jelenti azt, hogy ne lehetne élesben is alkalmazni a leírtakat, de a legtöbb esetben ez még nem elég. Ha viszont egy statikus oldalad van, vagy egy állapotmentes alkalmazásod (pl. webes számológép, konvertáló alkalmazás), esetleg egy demo alkalmazásod, ami nem igényel konfigurációt sem, akkor már ezzel is el tudod készíteni.

Megosztás/Mentés