Már golyózott a szemed a hosszú parancssortól? Eljött a Te időd, ma megnézzük, hogyan lehet kevesebb gépeléssel megúszni, ha konténereket szeretnénk használni. Ismerkedjünk meg a Docker Compose-zal.

Nekem kb. a második napon elegem lett abból, hogy kilóméter hosszú parancsokat írogassak a terminálba és folyamatosan a fejembe tartsam a különböző kapcsolókat. Készítettem is gyorsan egy-egy up.sh és down.sh szkriptet. Az elsővel elindítani lehetett a konténert, a másodikkal megállítani. Aztán megismerkedtem a Fig-el, mellyel ezt sokkal egyszerűbben és elegánsabban is meg lehetett tenni. Ezt a projektet ne keresd, már nem elérhető. Itt a szövegbe az oldal archive változata van belinkelve, az eredeti domain-en már egy egészen más projekt fut. A Figet ugyanis szárnyai alá vette a Docker Inc és Docker Compose néven vitte tovább. Ez kezdetben egy a Dockertől külön telepítendő python projekt volt, de ma már egy GOban írt docker plugin, amit a legtöbb esetben nem kell külön telepíteni. Legalább is a Rancher Desktop és a Docker Desktop tartalmazza azt. Amennyiben telepítened kellene, úgy én a compose plugin telepítését javaslom. Azt, hogy nálad fent van a következő paranccsal ellenőrizheted:

docker compose version

Amennyiben ez működik, akkor már neki is láthatunk életünk első compose projektjének. Hozzunk létre egy könyvtárat jupyter néven és benne egy fájlt docker-compose.yaml néven a következő tartalommal:

services:
  jupyter:
    image: jupyter/minimal-notebook
    volumes:
      - ./work:/home/jovyan/work
    ports:
      - 127.0.0.1:8888:8888
    environment:
      JUPYTER_TOKEN: jupyter

Lépjünk be a jupyter könyvtárba, ahol létrehoztuk a docker-compose.yaml fájlt és adjuk ki a következő parancsot:

 docker compose up -d

Amennyiben mindent jól csináltunk a http://127.0.0.1:8888/?token=jupyter url-en ugyanúgy elérjük a Notebookot mint a korábbi kétsoros paranccsal. Nézzük akkor végig, hogy mi mit jelent.

Beszélnünk kell azt első sorban ma már nem található version kulcsszóról, mivel rengeteg példát találsz majd a neten, ahol ez a kulcsszó ott lesz az első sorban. Ez mondta meg a docker compose fájl sémájának a verzióját. Ez ma már deprecated, vagyis elavult. A Docker Compose ha nem ismer egy kulcsot, akkor arról tájékoztatni fog minket.

Na és akkor nézzük a tényleges első sort a services kulcsszót. Erre azért van szükség, mert a Compose nem csak egy konténer futtatására jó, hanem egyszerre több konténert is tud futtatni, valamint nem csak konténereket, hanem voluemokat és networkoket is tudunk vele kezelni. De ezekről majd máskor lesz szó. Most koncentráljunk a hosszú docker parancs kiváltására.

A services alatt kell felsorolni azokat a konténereket, amiket futtatni szeretnénk. Itt a kulcsokat úgy nevezzük el, ahogy akarjuk. Én itt most a jupyter kulcsszót használtam de ez lehetett volna bármi más is.

A következő kulcsszó az image, amely megmondja, hogy mely image és annak mely verzióját használjuk. Itt most nem adtam meg verziót, ezért a latest image kerül felhasználásra, valamint image repositoryt se adtam meg, ezért a Docker Hub tárolóból fogja letölteni az imaget.

A következő a volumes kulcsszó és az utána található bajuszos tömb megadás. Ez sokkal olvasmányosabb, mint a parancssoros megadásnál használt ${PWD}. Arra ott azért volt szükség, mert a docker cli-nek abszolút útvonalat kell megadni. A Compose viszont relatív útvonalakat is elfogad. Egy nagyon fontos dolog van. Vagy perjellel(/), vagy - mint itt a példában is - ponttal kell kezdeni a host útvonalat. Amennyiben a következő hibaüzenetet kapjuk ezt kell ellenőriznünk:

service "jupyter" refers to undefined volume work: invalid compose project

Ekkor ugyanis a Compose egy már létező Volumeot keres és az - lévén most lett telepítve a Dockert - nem létezik.

Amennyiben elsősorban fejlesztői környezetre használjuk a dockert, úgy a fentieket mindig vegyük figyelembe. Azonban, ha éles üzemeltetést szeretnénk, akkor pont fordított a helyzet, ott ezt a fajta csatolást el kell majd kerülnünk. Mint ahogyan a compose használatát is, de erről is később lesz szó. Most elég annyit megjegyeznünk, hogy a Compose-t a fejlesztői környezetre találták ki, nem az élesre.

A következő sor a ports, mely a dokcer cli -p, --publish kapcsolója. Itt nincs semmi látnivaló, itt ugyan azokat az értékeket kell felvenni, mint amit korábban használtunk.

Végül az environment kulcsszó, mely segítségével környezeti változókat adhatunk át a konténernek. Ez egyébként a parancssoros -e, --env kapcsoló megfelelője.

A --name kapcsoló megfelelőjét nem használjuk, mert a compose automatikusan elnevezi a konténereket. Arra kell csak figyelni, hogy mindig abban a könyvtárban futtassuk a Composet, ahol a docker-compose.yaml van. Számos példát lehet találni a neten, ahol használják a container_name opciót, amivel megadható, hogy mi legyen a konténer neve. Én nem javaslom ennek használatát, de erre is térjünk majd vissza, amikor skálázásról és Continuous Intergration felhasználásról lesz szó.

Amennyiben végeztünk nyugodtan adjuk ki a következő parancsot:

docker compose down

Ez leállítja a konténert és minden felesleges dolgot letöröl. Ezért nem kell --rm kapcsoló sem, ha Composet használunk.

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ó Ray Shrewsberry • képe a Pixabay-en.