A Docker szerver alkalmazások kipróbálására, tesztelésére is nagyszerű. Ebben a bejegyzésben azt járom körül, hogy mire kell ilyenkor figyelni és mutatok pár konkrét példát, amiket az elmúlt pár évben én is használtam.

Nem mindig egyértelmű, hogy egy szerver alkalmazást hogyan lehet egyszerre két példányban futtatni egyazon gépen. Arról nem is beszélve, ha nem ugyanazt a verziót akarjuk futtatni egyszerre. Ezek természetesen nem megoldhatatlan feladatok, de mindenesetre annál bonyolultabbak, mint amikor Dockerben átírom a verziószámot, mert ott kb. ennyit kell csak tennem. Természetesen, ha te több éve MySQL szerverek üzemeltetésével foglalkozol, akkor nem feltétlenül érted meg ezt a problémát, de ez a bejegyzés nem is neked szól. Azonban, ha te nem szívesen látnál neki egy ilyen próbának, akkor érdemes elolvasnod ezt a bejegyzést, hogy lásd, Dockerrel mennyire egyszerű ez.

Nézzük milyen docker run paramétereket kell ismerned ehhez.

Első körben a -d opció lesz számodra fontos, mivel ez gondoskodik arról, hogy az adott szerver a háttérben fusson és ne a terminálba hányja ki a különböző log üzeneteit az adott szerver. Ezeket az üzeneteket úgy is meg fogod tudni nézni a docker logs [container azonosító vagy név] paranccsal.

Én javaslom a --name opció használatát, mert ekkor könnyedén fogsz majd tudni hivatkozni erre a konténerre a későbbiek során. Ez fontos lesz akkor, amikor a logokat akarod nézni, mint ahogy láttuk az előbb vagy le akarod állítani a konténert, esetleg szeretnél egyéb parancsokat futtatni a conténeredben.

A -p paraméterrel tudod majd a konténer portjait a host gépen elérhetővé tenni, amire akkor van szükséged, ha a host gépen is el akarod majd érni az adott szolgáltatást. Több -p opciót is megadhatsz.

Megjegyzés: Használhatod a --network host kapcsolót is a -p helyett, ekkor a host géped hálózati csatolóját fogja használni a konténer, tehát “pont úgy fog” működni, mintha a hoston indítottad volna el a szerveredet. Miért nem ezt javaslom? Egyrészt ezzel a megoldással nem fogosz tudni több szervert elindítani párhuzamosan a gépeden. Másrészt a PHP-nak van egy olyan megodlása, hogy ha a mysqnél a localhost címre kapcsolódsz, akkor file socet-en keresztül kapcsolódik, ami természetesen nem fog működni. Harmadrészt és ez a legfontosabb: válts szemléletet és a programkódban mindig környezeti változókból vett host és port értékeket használj. Bővebben a témáról a 12 Factor App oldalán olvashatsz.

Végezetül fontos lesz számodra a -e paraméter, mely lehetővé teszi, hogy környezeti változókat állíts be az alkalmazás futtató környezetében; ezzel fogod tudni beállítani az alkalmazásodat.

Mivel alapvetően most az eldobható fejlesztői környezetekről szeretnék írni, így nem foglalkozunk azzal, hogy az esetleg keletkezett adatokat megőrizzük. Fontos ezt megjegyezni, hisz így minden adatunk el fog veszni, ha töröljük a konténert. Az adatok megőrzéséről majd egy másik blogbejegyzésben lesz szó.

SMTP szerver

Kezdjük mindjárt az egyik személyes kedvencemmel, egy olyan SMTP szerverrel, amivel bármilyen webalkalmazást tudunk tesztelni, ami képes SMTP-n keresztül levelet küldeni. Ez pedig a Mailcatcher. Ha terminálban kiadjuk a következő parancsot, akkor a szerver el is indul és lehet használni.

docker run -d --name mailcatcher -p 1080:1080 -p 1025:1025 sj26/mailcatcher

A http://localhost:1080 url-en tudjuk elérni a webes felületet, ahol nézhetjük, hogy milyen levelek lettek kiküldve. Az smtp hostnak localhost-ot, a portnak pedig 1025-öt kell beállítani. Manuális teszten túl a Mailcatcher-t egy api felületen is el tudjuk érni, így akár automata tesztekbe is be tudjuk kötni, ha egy komplett regisztrációs folyamatot tesztelnénk.

Tudom, hogy mint konténer, ez nem a legjobb példa, hisz a README-je az ami a projekt oldalán is van, de sok mindent nem lehet benne beállítani.

MySQL szerver

Bár a mysql szerver elég jól fel van készítve arra, hogy egymás mellett több példányban is fusson, még hivatalos dokumentáció is van hozzá, mégis érdemes a hivatalos Docker konténert használni.

Adjuk ki a következő parancsot, hogy elinduljon a MYSQL szerver:

docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=titok -p 3306:3306 mysql:8

Ebben a pillanatban lesz egy mysql szerver, amit a localhost:3306 útvonalon fogunk tudni elérni… Vagyis nem egészen. Egyrészt, a mysqlnek kell idő, amíg elindul, így várnunk kell egy percet, amíg elérhető lesz. Másrészt, a host gépről csak TCP kapcsolaton keresztül fogjuk tudni elérni ezt a szervert, márpedig a dokumentáció szerint, ha localhost a host, akkor mindenképpen socket-en keresztül szeretné elérni a mysql client a szervert, ami nem fog menni. Szóval türelem és 127.0.0.1:3306 a kapcsolódási adatok. Ha van mysql kliens telepítve a gépünkre, akkor mindig használjuk a -h 127.0.0.1 kapcsolót, különben nem fogunk tudni kapcsolódni a szerverhez. Ha szeretnénk adminisztrálni a szerverünket, de nincs kliens telepítve a gépünkre, ne essünk kétségbe könnyen be tudunk lépni a konténerbe a következő paranccsal:

docker exec -it mysql bash

Természetesen csak akkor igaz, ha a --name mysql opciót használtuk az elindítására. Ha nem, akkor a konténer azonosítójára lesz szükségünk a mutatványhoz. A fenti parancs hatására egy promptot kapunk, ahova nyugodtan írhatjuk be a parancsainkat. Próbáljuk ki:

mysqladmin ping -ptitok

Ennek hatására kapunk egy figyelmeztetést, hogy nem kéne a root passwordot csak így beadnunk, valamint egy mysqld is alive üzenetet, ha minden rendben van.

Redis

Amennyiben még nem próbáltuk, akkor érdemes kipróbálni a Redis szervert. Én általában akkor használom, ha párhuzamosítani kell dolgokat és szükségem van egy task queue-ra amiből a tetszőleges számú workerem ki tudja venni a feladatait.

docker run --name redis -d redis

Ezt aztán el tudjuk érni a redis-cli-vel, ha elindítjuk azt a konténeren belül:

docker exec -it redis redis-cli

Gondolom feltűnt, hogy nem használom a -p kapcsolót és neked sem javaslom, ennek ellenére egy -p 6379:6379 opcióval elérhetővé tehetjük a szerverünket. Mivel alapból a Redis semmifajta védelemmel nem rendelkezik, ezért van azt, hogy ezt nem javaslom. Amit javaslok az az, hogy egy közös hálózatba tegyük az alkalmazásunkat és a Redis-t, amit a docker-compose segítségével könnyedén megtehetünk. Hogy hogyan? Többek között erről is szó lesz a Konténerizált Fejlesztői Környezet kialakítása workshopomon.