Laravel Sail - konténerizált projekt

Attila | 2023. 01. 08. 19:09 | Olvasási idő: 4 perc

Címkék: #Container #Docker #Image #Laravel #Laravel 9 #MySQL #PHP #Sail #Telepítés (Installation) #Virtualizáció (Virtualization) #Volume

Mivel az elmúlt időszakban eléggé jól megismerkedtünk a Docker használatával, most megnézzük, hogy hogyan lehet egy Laravel projektet is Docker alapokra helyezni, így egy virtuális környezetben, együttműködő konténerekkel működtetni. Két konténert is létre fogunk hozni és működtetni fogjuk őket: egyik lesz a Laravel, mint webalkalmazásunk, a másik pedig a hozzá tartozó adatbázis kiszolgálónk, egy MySQL szolgáltatás. Mindezekben a Laravel Sail lesz a segítségünkre.
laravel-sail

Bevezetés

A Laravel Sail (https://laravel.com/docs/9.x/sail) egy egyszerű, könnyen használható felület, amelyen keresztül a Docker környezetet tudjuk használni, anélkül, hogy akár értenénk is a Docker-hez. Persze, mi már sok mindent megismertünk a Docker-ről is, azonban a Sail alkalmazásához nem feltétlenül kellene tudnunk bármit is a Docker-ről.

A dolgok mélyén, a Laravel Sail a docker-compose.yml fájl (további infó erről itt) és a sail script a Laravel projektünk gyökér könyvtárában helyezkedik el. Maga a sail script lehetőséget biztosít arra, hogy parancssorosan tudjunk kapcsolatba lépni a Docker konténereinkkel, amelyeket a docker-compose.yml fájlban definiáltunk.

Előfeltételek

Szerencsés szituációban vagyunk, mivel az előző sorozatban a Docker ismertetése során már összeraktuk a Docker virtualizációs platformot és a hozzá tartozó eszközkészletet, mindezt a Windows-ban a Docker Desktop segítségével értük el.

Mivel már régebben hoztam létre új Laravel projektet, azt gondolom, hogy érdemes előtte frissíteni a szükséges környezetet (PHP, Laravel, Composer, Node stb.). Ehhez egy kiváló támpontot ad ez a bejegyzésem. A frissítések után a következő verziószámokkal rendelkezik a környezetem:

  • PHP (verzió: 8.2.0)
  • Node (v: 18.13.0) és npm (v: 8.19.3)
  • Composer (v: 2.5.1)
  • Laravel/installer (telepítő) (v: 4.2.17)
  • Laravel/framework (keretrendszer) (v: 9.46.0)

PHP frissítése után érdemes megkeresni a php.ini fájlban (nálam C:\xampp\php\php.ini) az extension=zip sort és a sor elejéről törölni a pontosvesszőt (majd menteni a fájlt), mert erre szükségünk van az új Laravel projekt telepítéséhez.


Telepítés és használatba vétel

Magát a projektet bárhol létrehozhatnánk, én a XAMPP mappám Apache webszerver által kiszolgált nyilvános htdocs mappában fogom telepíteni a Laravel projektet. Nyissunk meg hozzá egy PowerShell-es terminált és adjuk ki az utasításokat:

cd c:\xampp\htdocs

laravel new sailjetstream

A "sail" nevet nyilván azért adtam neki, mert ezzel szeretnénk majd ismerkedni és mivel majd a felhasználói azonosítás részt (authentication) is szeretném majd folytatni, ezért adtam neki még a "jetstream" nevet is, de egyelőre itt még csak a sail-re koncentrálok (persze, magát a projektet bárhogy elnevezhettem volna, nincs jelentősége, de mégis akartam adni neki egy beszédes nevet, hogy ha majd a későbbiekben rápillantok, akkor rögtön tudjam, hogy mit tartalmaz).

Nyissuk meg ezt az új sailjetstream mappát a VSCode-ban, itt látható utána a mappa- és fájlszerkezete:

Maga a Laravel Sail automatikusan elérhetővé válik, ha létrehozunk egy Laravel alkalmazást/projektet (az imént említett sail script ott lesz a vendor / bin mappánkban).

Nehogy megijedjünk, ha nem értenénk magát a script-et, nem is kell most megértetnünk, csak tudjunk róla, hogy ez automatikusan elérhető, amikor telepítünk már egy friss (legalább) 9-es verziójú Laravel projektet.

Említettem, hogy a projekt már alapértelmezetten tartalmazza a sail script-et, ami aztán végülis a projekt mappánk gyökerében lévő docker-compose.yml fájlt használná fel a Docker image építésére és a konténer futtatására, de itt mégsem látható ez a fájl. Ennek az az oka, hogy publikálnunk kell még ezt a fájlt a következő paranccsal:

php artisan sail:install

Utána megkérdezi, hogy melyik szolgáltatásokat szeretnénk még telepíteni? Alapértelmezetten a mysql van megjelölve, szóval, ha egy entert ütünk, vagy megnyomjuk a 0-t, akkor ezzel fogja inicializálni a docker-compose.yml fájlunkat.

(Megjegyzés, ha esetleg nem rendszergazdaként futtattuk a terminált, akkor hibát kaphatunk, de emiatt ne aggódjunk, mert remélhetőleg a fájlunk létrejön és ez a lényeg.) Részlet a docker-compose.yml fájlból:

Korábbi ismereteink alapján meg lehet próbálni értelmezni ezt a fájlt is, mivel számos olyan részletet tartalmaz, amelyekkel már a Docker-es tanulmányaink során találkoztunk.

Ezután következik a telepítési és működési folyamat "legtrükkösebb" része. Ugyanis az eddigi CLI utasításokat egy PowerShell-es terminálba adtam ki, viszont, ha most a következő utasítást ugyanott adom ki, mint az eddigiket:

./vendor/bin/sail up

Akkor látszólag semmilyen eredményt nem kapok vissza, mintha nem történne semmi.

És valóban nem is történik lényegi dolog, mivel nem jön létre a Docker-es image-em, sem a konténereim a docker-compose.yml fájl alapján...

A trükk az, hogy egy WSL-es terminált kell nyitnom. Ezt én legegyszerűbben a VSCode terminál részén tudom megtenni, így:

A "+" jel melletti lenyíló listából az "Ubuntu-22.04 (WSL)"-t kell választani. Az új terminál itt látható:

Az ábra jól mutatja, hogy már el is kezdtem beírni ide a korábban PowerShell-ben kiadott eredménytelen parancsot. Itt viszont már kapok róla visszajelzést:

Azt jelzi nekem, hogy a Docker nem fut. Előfordulhat, hogy nálatok nem ad ilyen "hibát" és rendesen elindul az image felépítése és a konténerek indítása, azonban, ha nálatok is hasonlóan viselkedést jelez, mint nálam, akkor a következő a megoldás: bár a Docker Desktop fut nálam, ezáltal a Docker környezet is, viszont ezt az Ubuntu Linux nem érzékeli. Nyissuk meg a Docker Desktop vezérlőpultját és menjünk rá jobb felül a fogaskerék ikonra, vagyis a beállításokra.

A beállításoknál a bal oldali "Resources" főmenüt kell választani és azon belül a "WSL Integration" almenüt. Ezután pedig az Ubuntu-22.04 melletti kapcsolót kell engedélyezni (ON). A bekapcsolás után indítsuk újra a Docker Desktop-ot, hogy biztosan érvényre jussanak ezek a beállítások.

Ha most újra futtatjuk a WSL-es terminálban a parancsunkat, akkor szerencsére elkezdi felépíteni a Docker image-t, majd elindítja a konténereinket is. Itt látható egy részlet a parancs futtatásának eredményéből:

Alul azt látjuk, hogy nem csak az image és a konténerek jöttek létre, hanem még egy network és egy volume is. Ezeket mind ellenőrizhetjük a Docker Desktop vezérlőpultjában. Az image mérete jó nagy (nálam 2023.01.09-én 829,47 MB), emiatt egy picit tovább tarthat ez a folyamat, ahogy nálam is, mert lassú volt az internetem, emiatt több mint 10 percig (731 másodpercig) tartott a futtatás. A Docker Desktop vezérlőpultjában ellenőrizni tudjuk a volume, image, containers meglétét és aki esetleg nem emlékezik, hogy miért is volt szükség a network létrehozására, annak az alábbi ábra talán eszébe juttatja:

Mivel a laravel.test-1 és a mysql-1 szolgáltatást egy csomagban futtatjuk, ezért szükség lesz arra, hogy kommunikálni tudjanak egymással, mindezt pedig egy közös hálózaton tudják megtenni.

Ha most a Port(s) oszlopban rákattintunk a 80-as portokra, vagy csak a böngészőben megnyitjuk a localhost címet, akkor meg is kapjuk az immár "dockerizált" Laravel projektünk:

Tökéletesen fut! Örülünk!

PHP

Ami feltűnhet még az iménti képen, hogy jobb alul a PHP verzió az nem 8.2, amire én korábban frissítettem a gépemen a PHP-t, hanem 8.1.14-et mutat. Ez azért van, mert ez egy elszigetelten működő rendszer, nincs köze a gazdagép (saját gépem) dolgaihoz, hanem a felépített image rétegeihez van köze. A Docker Desktop vezérlőpultjában, ha rákattintok a sail-8.1 image-re, akkor megnézhetem az image rétegeit.

Itt a legalsón (16-os számún) pedig látszik is, hogy a 8.1-es PHP verziót használja ez az image. Erről megbizonyosodhatunk úgy is, ha kiadjuk a WSL-es terminálban a következő parancsot:

php -v

De erre sajnos hibát kapunk, tanácsolja, hogy telepítsük az Ubuntu Linux-unkra a PHP-t. Nekünk viszont erre nincsen szükségünk, mert mi a konténerünkben lévő PHP verziószámát szeretnénk lekérdezni. Ezt így tehetjük meg:

./vendor/bin/sail php -v

Fú, ez viszont egy picit kényelmetlen, hogy mindig ki kell írnunk a sail script elérését, úgyhogy inkább érdemes létrehozni egy alias parancsot rá így:

alias sail='[ -f sail ] && sh sail || sh vendor/bin/sail'

Utána pedig már működik egyszerűbben:

sail php -v

Így ismét megkapjuk, hogy a 8.1.14-es PHP-t használja az image-ünk.

MySQL

Adódhat még a kérdés, hogy a MySQL adatbázisunkat hogyan érhetjük el. Az itt bemutatott leírás szerint be tudunk csatlakozni a mysql szolgáltatásunkba, viszont ez annyira nem kényelmes. Én inkább a MySQL Workbench-et szeretem használni, amely ingyenesen letölthető innen. Telepítés (nagyon egyszerűen megy) és elindítás után a főablakában a "MySQL Connections" felirat mellett "+" ikonra kell kattintani, majd beállítjuk itt a sail-es mysql szolgáltatás elérését:

A "Connection Name" bármi lehet, de érdemes beszédes nevet választani. A "Hostname" és a "Port" maradhatnak változatlanul. A "Username"-et írjuk át "sail"-re, a "Password"-nál a "Store in Vault ..." gombra kattintva megadhatjuk a "password" jelszót (idézőjelek nélkül, természetesen). Majd mentés után kattintsunk a "Test Connection" gombra és megkapjuk, hogy a kapcsolat létrehozása sikeresen megtörtént.

Kattinthatunk az "Ok"-ra és a kapcsolat létrehozásánál is az "Ok"-ra. Így már meg is jelent a sail nevű kapcsolatunk a szolgáltatásunkhoz:

Kétszer rákattintva be tudunk csatlakozni a sail-es mysql szolgáltatásunkba és bal oldalon látszódik is már a "sailjetstream" nevű adatbázisunk.

Ennek is örülünk! Ha minden működik, megérdemeljük a vállveregetést.


Továbblépés és összefoglalás

Nincs más hátra, mint egy kis pihentetés, mielőtt belevágnánk majd a "sail" után a "jetstream"-es teendőinkbe... de erről majd csak a következő részben lesz szó. Ugyanis, folytatása következik!

Ebben a bejegyzésben telepítettünk egy Laravel projektet Docker-es alapokra. Mindebben a Laravel Sail volt a segítségünkre. Megállathatjuk a konténereinket:

sail stop

Utána bármikor újraindíthatjuk majd a sail up paranccsal (viszont mivel az alias-os parancs csak egy munkamenetre szólt a terminálban, ezért azt újra ki kellhet adni a rövidített használathoz, vagy pedig a ./vendor/bin/sail up paranccsal) kelthetjük újra életre a konténerjeinket.

sail alias permanens működése

Ez utóbbi dolog (nem fix az alias, hanem csak adott munkamenetre érvényes), engem zavart, úgyhogy utánajártam, hogyan lehetne ezt orvosolni:

  1. Indítsuk el az Ubuntu linuxot a gépünkön a Start menüből.
  2. A parancssorába írjuk be ezt: nano ~/.bashrc Így megnyílik ez a fájl a nano szövegszerkesztőben. Ebben a fájlban a vége felé van egy elágazás, ami a bash alias script-eket hivatott importálni (lásd a felsorolásom alatti ábrát). Ez a .bashrc fájl mindig beolvasásra kerül, ha a bash elindul, márpedig az a sail-8.1 image-ünk egyes számú rétege, tehát el fog indulni.
  3. CTRL + x billentyűkombinációval zárjuk be ezt a szövegszerkesztőt, és nyissuk meg az ábrán látható ~/.bash_aliases nevű fájlt szerkesztésre: nano ~/.bash_aliases
  4. Ez egy üres fájl még jelenleg, úgyhogy írjuk be ide a korábbi alias-os parancsunkat: alias sail='[ -f sail ] && sh sail || sh vendor/bin/sail'
  5. CTRL + x billentyűkombinációval zárjuk be és mentsük el (y) ezt a fájlt.
  6. Ha most indítunk a VSCode-ban egy új WSL alapú terminált, akkor ott már rögtön működni foga sail-es parancsunk, például ez (ha le volt állítva a konténer csoportunk): sail up amivel indítjuk a konténereket, egy másik WSL alapú terminálban pedig tud már működni ez is:  sail php -v

Kövessetek a Facebook-on, és ha tetszik a munkám, akkor támogassátok néhány euróval a blog és az oldal fennmaradását a "buymeacoffee" (kávé) ikon útmutatásait követve.