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:
- Indítsuk el az Ubuntu linuxot a gépünkön a Start menüből.
- 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.
- 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
- 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'
- CTRL + x billentyűkombinációval zárjuk be és mentsük el (y) ezt a fájlt.
- 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.