Ebben az írásban a Compose igazi erősségét a több konténer összehangolt futtatását szeretném bemutatni. Erre az egyik legjobb példa az, ha szeretnénk az XAMPP/MAMPP rendszerünket lecserélni egy rugalmasabb rendszerre.

Cserébe le kell mondanunk a csilli-villi felhasználói felületről, ahol egy kattintással tudtunk szolgáltatásokat indítani és leállítani, meg minden fajta beállítást megtenni. Cserébe viszont nem csak azokat fogjuk tudni beállítani, amit kivezettek a felületre.

Vegyünk figyelembe, hogy most egy tanulási folyamat elején vagyunk. Kényelmetlenebb lesz használni ezt a környezetet, mint az XAMPP-ot, de ez azért van, mert még nem ismerjük annyira. Idővel nem fogjuk érezni a különbséget és remélhetőleg a rugalmassága miatt sokkal jobban kezünkben tarthatjuk az irányítást majd.

Természetesen az is előfordulhat, hogy sose fogjuk megkedvelni a paranccsort és mindig is valamilyen grafikus felületen érezzük magunkat otthonosan. Ekkor jöhet jól a Docker Desktop Dev Environments (beta), Portainer vagy a Yacht. Amennyiben van igény ezekről is szívesen írok egy-egy rövid bemutatót.

Most azonban térjünk vissza a parancssorhoz.

Első körben rakjunk össze egy MySQL szervert és egy PHPMyAdmin adatbázis adminisztrálót. Hozzunk létre egy xampp nevű könyvtárat és benne egy docker-compose.yaml fájlt a következő tartalommal:

services:
  mysql:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: database
  phpmyadmin:
    image: phpmyadmin
    environment:
      PMA_HOST: mysql
      PMA_USER: root
      PMA_PASSWORD: root
    ports:
      - 127.0.0.1:8080:80

Mielőtt elindítanánk, nézzük végig mit is hoztunk létre. Ezt egyébként mindig érdemes megtenni mindennel, amit a neten összevadásztunk. Amennyiben fontos számunkra a biztonság, úgy nem csak ezt a fájlt, hanem a benne hivatkozott image-ket is érdemes átvizsgálni, mint ahogyan egy random composer/npm/bármi csomaggal is megtesszük ezt mielőtt használnánk. trollface

Én mindenesetre igyekszem a docker közösség által kiadott hivatalos, vagy saját készítésű imageket használni.

A services kulcs alatt két konténer van: mysql és phpmyadmin. A mysql egy hivatalos kiadású mysql image-et használ. A beállítási lehetőségeit és a használatát az image oldalán el lehet olvasni. Én most két dolgot állítok be. Egyrészt beállítom a root jelszót a lehető leggyengébb “root” jelszóra a MYSQL_ROOT_PASSWORD környezeti változóval. Ez elsőre nagyon veszélyesnek tűnik, de figyeljük meg, hogy ennek a konténernek semelyik portját se kötöm ki a host gépre, így az nem lesz elérhető kívülről. Természetesen nem csak porton keresztül lehet kapcsolódni egy MySql szerverhez, hanem fájl socketen keresztül is, de azt is csak a konténerből (és a host gépről) lehet elérni. Ez azt jelenti, hogy kívülről védve vagyunk, ugyanakkor azt is jelent, hogy ha valaki hozzáfér a host-hoz, vagy el tudja érni, hogy fusson rajta egy általa készített konténer, no akkor bajban leszünk. Szóval ne engedjünk senki se a gépünkhöz és ne használjuk ezt éles rendszeren, vagy osztott környezetben.

A másik beállítás a MYSQL_DATABASE környezeti változó, mely hatására a mysql konténer létre fog hozni egy database nevű adatbázist, amennyiben az nem létezik.

Figyeljük meg, hogy semmifajta hosszú távú adattárolás nincs a fenti konfigurációban. Szóval, ha leállítjuk docker compose down paranccsal a konténert és elindítunk egy újat az adatok el fognak veszni. Azonban ezt várjuk egy fejlesztői környezettől, szóval ez nem bug, hanem feature ebben az esetben.

A másik szervíz már érdekesebb. Első körben azt kell látnunk, hogy a ports résznél a konténert csak a loopback ip címre engedem ki, így kívülről nem lesz elérhető. Amennyiben szeretnénk megbizonyosodni arról, hogy működik, úgy a http://127.0.0.1:8080 url keresztül tudjuk ezt megvizsgálni. Természetesen azután, hogy a docker compose up -d paranccsal elindítottuk azt. A PMA_USER és PMA_HOST változók segítségével tudjuk megadni az adatbázis felhasználót és a jelszót. Így nem kell begépelnünk azokat.

A PMA_HOST változónál található mysql beállításról érdemes lenne egy picit többet beszélnünk, de most legyen elég annyi, hogy ez a mysql szervíz neve kell, hogy legyen. Az a kulcs, amit a services tömbben használunk. Igen, jól látod! Bármilyen nevet is használjunk ott, azt majd a docker dns-e feloldja és az egyszerre indított konténerek ilyen néven látják majd egymást. Próbáld ki:

  1. Készíts egy xampp2 nevű könyvtárat a mostani xampp könyvtár mellett.
  2. Másold bele a docker-compose.yaml fájlt.
  3. Írd át a PHPMyAdmin portjákt 8080-ról 8081-re.
  4. Indítsd el a docker compose up -d paranccsal.

Ekkor a http://127.0.0.1:8081 url-en elérhető lesz egy másik “xampp”. Teszteld! Hozz létre táblákat, adatokat az egyikben és nézd meg, hogy a másik ettől még tök üres marad.

Pedig a két PHPMyAdmin ugyanazt a hostnevet kapja (mysql), de mégis másik szerverhez kapcsolódik. Arra azért figyelj, hogy ha nem xampp2 néven hoztad létre a könyvtárat, hanem egy másik szülő könyvtárban de ugyan úgy xampp néven, mint az elsőt, akkor az két stack össze fog akadni, mert ugyanaz lesz a nevük. A két PMA elérhető lesz, de hol az egyik, hol a másik mysql példányhoz fog kapcsolódni. A docker DNS-e ugyanis Round-robin DNS. Ha egy domain névhez több ip cím tartozik, akkor kérésenként mindig mást fog kiszolgálni, hogy ossza a terhelést.

Ezt a problémát úgy lehet orvosolni, hogy használod a docker compose -p/--project-name kapcsolóját. Ilyenkor Te adhatod meg mi legyen a stack neve és nem a könyvtár nevéből szedi azt a Compose.

Azt ígértem, hogy egy XAMPP klónt fogunk készíteni, de ahhoz még kéne egy PHP értelmező is, amivel az éppen fejlesztett kódunkat futtatjuk. A rossz hír az, hogy ezt bizony el kell készítenünk. A hivatalosan kiadott PHP image-ben ugyan benne van a Mysql Native Driver, de sem a Mysqli, sem a PDO nincs hozzáadva. Azokat nekünk kell majd hozzáadnunk. Természetesen használhatnánk valamilyen kész megoldást is, de miért tennénk ezt, ha megtanulhatjuk, hogy hogyan tudunk saját image-t készíteni.

Amennyiben felmerülne benned a kérdés:

“Miért szív itt szerencsétlen boomer a PHP-vel amikor node-nál csak ki kéne adnia az npm install --save mysql2 parancsot és minden sokkal egyszerűbb lenne”

Szeretnélek megnyugtatni, hogy node-nál is eljutnánk oda, hogy szeretnénk készíteni egy image-et.

Ne feledd! Amennyiben szeretnél fejlődni keress meg nyugodtan. Csoportos és személyes Docker oktatással és tanácsadással tudlak téged vagy csapatodat, cégedet támogatni.

A Docker gyorstalpaló cikksorozat részei

  1. Bevezetés - Docker gyorstalpaló
  2. Telepítés - Docker gyorstalpaló
  3. CLI avagy a parancssori értelmező - Docker gyorstalpaló
  4. Konténer futtatása - Docker gyorstalpaló
  5. Compose - Docker gyorstalpaló
  6. Stack futtatása - Docker gyorstalpaló
  7. Image készítése, Dockerfile - Docker gyorstalpaló

Borító Nguyen Hoang képe a Pixabay-en.