Automatizálás
Docker
A Docker nyílt konténerplatform: képekből futtat elkülönített szolgáltatásokat, a Compose pedig egyetlen YAML fájlban írja le a teljes stacket.
A Docker nyílt platform arra, hogy egy alkalmazást becsomagoljunk, szállítsunk és futtassunk. Az alkalmazás egy elkülönített környezetbe, konténerbe kerül, és magával viszi a függőségeit, így a futtatáshoz nem kell mindent a gazdagépre telepíteni. A Docker kliens-szerver felépítésű: a kliens parancsokat küld a démonnak, ami a képeket, konténereket, hálózatokat és köteteket kezeli. A kettő REST API-n keresztül beszél, Unix socketen vagy hálózati felületen, és a kliens távoli démonhoz is kapcsolódhat.
Egy konténer egy kép futó példánya, a kép pedig csak olvasható sablon, amit Dockerfile-ból építünk. Mivel a kép rétegekből áll, egy módosítás után csak a megváltozott rétegek épülnek újra. Ez teszi lehetővé, hogy ugyanaz a szolgáltatás a Windows-os munkaállomáson és a Linux szerveren azonosan viselkedjen.
Compose: egy fájl, egy stack
Egy szolgáltatás ritkán áll egyetlen konténerből. A Docker Compose több konténeres alkalmazások leírására való: a szolgáltatásokat, hálózatokat és köteteket egyetlen YAML fájl tartalmazza, egy paranccsal indul a teljes stack, és ugyanaz a fájl használható fejlesztéshez, teszthez és éles üzemhez. Az életciklus-parancsok is a Compose-hoz tartoznak: indítás, leállítás, újraépítés, állapot, naplófolyam, illetve egyszeri parancs futtatása egy szolgáltatásban.
- Nálunk minden self-hosted szolgáltatás külön Compose stack: n8n, PostgreSQL, ClickHouse, Qdrant, a nginx fordított proxy és a többi, saját compose.yaml fájllal.
- Egy stack egy mappa, benne a Compose fájl és a környezeti változók, így a mentés és a visszaállítás fájlszintű marad.
- A Compose gyorsítótárazza a konténer létrehozásához használt beállításokat: ami nem változott, azt újraindításkor újrahasználja, ezért egy módosítás gyorsan átvihető.
- A Linux szerver ugyanazt a felépítést futtatja Docker Engine alatt, a Windows-os gépen pedig a Docker Desktop hozza a démont, a klienst és a Compose-t.
Adat, hálózat, frissítés
A konténer írható rétege a konténerrel együtt tűnik el, ezért a tartós adat kötetbe vagy bind mountba kerül. A kötetet a Docker kezeli, a konténer törlése után is megmarad, és könnyebben menthető vagy vihető át, mint egy bind mount; bind mountot akkor érdemes használni, ha a gazdagépről is látni akarjuk a fájlokat. Ha üres kötetet csatolunk olyan könyvtárra, amelyben már vannak fájlok, azokat a Docker alapértelmezés szerint átmásolja a kötetbe; nem üres kötet esetén viszont eltakarja a meglévő tartalmat.
Minden konténer kap hálózatot: alapból a default bridge-en indul, felhasználó által definiált hálózaton viszont a konténerek név szerint is elérik egymást. Kifelé csak a publikált portok látszanak, ezért az adatbázis portját nem kell kitenni a gépre. Egy konténer több hálózatra is csatlakozhat, például a proxy az egyikre, a belső szolgáltatás a másikra.
Frissítéskor a sorrend kézzel ugyanaz, mint a dokumentációban: húzzuk az új képet, majd építsük újra és hozzuk létre újra az érintett szolgáltatást. Éles üzemhez külön override fájlt használunk, abban többek között az újraindítási politika és a hoszt portok szerepelnek.
Amire figyelni kell
- Alapértelmezés szerint egy konténernek nincs erőforrás-korlátja. Linuxon memóriahiány esetén a kernel bármely folyamatot kilőhet, ezért a memóriára és a CPU-ra érdemes hard limitet adni.
- A memórialimit és a swap együtt értelmezendő, az OOM-killer kikapcsolása pedig csak beállított memórialimit mellett biztonságos.
- Néhány korlát kernel-támogatást igényel; a docker info figyelmeztet, ha valamelyik hiányzik.
- A kötet önmagától nem törlődik, a használatlan köteteket a docker volume prune takarítja.
- Mentéshez a kötet tartalmát külön konténerből olvassuk ki, jellemzően tar-ba csomagolva, és a visszaállítás útját is tesztelni kell.
Tovább olvasás
A CyberElectrónál a Docker az alap, amin a saját szolgáltatásaink futnak: minden stack egy verziókövetett Compose fájl, és egy tiszta gépen egy paranccsal felhozható.