Címkék: #Container #Docker #Image #Laravel #Laravel 9 #MySQL #PHP #Sail #Telepítés (Installation) #Virtualizáció (Virtualization) #Volume
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.
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 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.
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!
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.
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.
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.
Ez utóbbi dolog (nem fix az alias, hanem csak adott munkamenetre érvényes), engem zavart, úgyhogy utánajártam, hogyan lehetne ezt orvosolni:
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.