Bevezetés
A folyamatos integráció (CI) és a folyamatos szállítás (CD) jelenleg a szoftverfejlesztés legfelkapottabb témái közé tartoznak. A CI/CD aspektusának megvalósításához a szoftverarchitektúrában a fejlesztők konténereket használnak. A konténerek könnyűsúlyú, virtualizált, hordozható, szoftveresen definiált környezetek. A konténerekben a szoftver a fizikai gazdagépen futó többi szoftvertől elkülönítve futhat. Ennek az útmutatónak a fókuszában a Docker konténerplatform használata áll webalkalmazások telepítésére és futtatására. A Docker segít egyszerűsíteni a webszerver-stack beállítási folyamatát. Ebben az útmutatóban a LEMP stacket fogjuk használni egy Laravel alkalmazás kiszolgálására.
A LEMP stack a Linuxot mint operációs rendszert, az Nginx-et mint webszervert, a MySQL-t mint adatbázist, és a PHP nyelvet használja a szkripteléshez és a dinamikus feldolgozáshoz. Követheti a LEMP stack Ubuntu-ra történő telepítéséről és konfigurálásáról szóló útmutatónkat. A Laravel az egyik legnépszerűbb PHP keretrendszer webalkalmazások fejlesztéséhez.
A Docker biztosít egy Docker Compose nevű eszközt a docker konténerek beállítási folyamatának meghatározásához. Docker Compose lehetővé teszi a fejlesztők számára, hogy egyetlen, docker-compose nevű fájlban határozzák meg alkalmazásuk infrastruktúráját, szolgáltatásait, köteteit, hálózatait és az esetleges függőségeket. Képes több Docker konténert is kezelni olyan parancsain keresztül, mint a docker container create, docker container run stb.
Ebben az útmutatóban megtanulhatja, hogyan telepíthet egy Laravel webalkalmazást Nginx-szel és MySQL-lel egy Docker konténerben belül. A teljes stack konfigurációi egy docker-compose fájlban lesznek meghatározva, a PHP, MySQL és Nginx egyéb konfigurációs fájljaival együtt. Kezdjük el!
Első dolgok először
- Mivel ez egy gyakorlati útmutató, rendelkeznie kell egy telepített Ubuntu 20.04 rendszerrel kezdeti működési környezetként. Szüksége lesz egy sudo jogosultságokkal rendelkező, nem root felhasználóra is. Íme egy lépésről lépésre követhető útmutató az Ubuntu szerver beállításához.
- . Telepítenie kell a Dockert. Van egy útmutatónk arról, how to install and operate Docker on Ubuntu 18.04.
- . Telepítenie kell a Docker Compose-t a hivatalos Docker dokumentáció útmutatóját követve.
1. lépés: A Laravel letöltése és a függőségek telepítése
Az első lépés a Laravel kód letöltése egy tárolóból (repo). Valós forgatókönyvekben a Laravel kódja valószínűleg egy tárolóban van valahol, például a GitHubon, Bitbucketen, Gitlabon stb. Ebben az útmutatóban azonban a legfrissebb verziót fogjuk klónozni a hivatalos Laravel tárolóból a GitHub platformon. A tároló tartalmaz egy composer fájlt, amely a PHP alkalmazásszintű függőségkezelője. Mivel azt szeretnénk, hogy minden a Docker konténeren belül fusson, a függőségeket a Docker composer képfájljának (image) segítségével fogjuk telepíteni. Ez segít elkerülni azt is, hogy a composert globálisan kelljen telepítenünk a tényleges gazdagépre. Ezután indítsa el a terminált.
Lépjen be a saját (home) könyvtárába:
|
1 |
cd ~ |
Írja be a következő parancsot a tároló klónozásához egy laravel-web nevű könyvtárba. Nyugodtan elnevezheti tetszés szerint. Ezen útmutató írásakor ez a parancs a Laravel 8-as verzióját tölti le. Amikor futtatja a parancsot, valószínűleg egy újabb verziót fog találni:
|
1 |
git clone https://github.com/laravel/laravel.git laravel-web |
Ezután lépjen be abba a könyvtárba, amelybe éppen klónozta a tárolót:
|
1 |
cd ~/laravel-web |
Írja be a következő parancsot a laravel alkalmazásához szükséges könyvtárak csatolásához a Docker composer képfájljának (image):
|
1 |
docker run --rm -v $(pwd):/app composer install |
A -v és –rm jelzők a docker run parancsban egy ideiglenes konténert hoznak létre, amely a törlése előtt hozzá lesz kötve (bind-mount) az aktuális könyvtárhoz. A parancs átmásolja a ~/laravel-web tartalmát a konténerbe, és biztosítja, hogy a composer által létrehozott vendor mappa visszamásolásra kerüljön az aktuális könyvtárba.
Most meg kell változtatnia a laravel-web könyvtár tulajdonosát a nem-root felhasználóra. Ez lehetővé teszi, hogy a következő lépésekben nem-root felhasználóként dolgozzon az alkalmazás kódjával, és folyamatokat futtasson a konténeren belül. A tulajdonos megváltoztatásához írja be a következő parancsot:
|
1 |
sudo chown -R $USER:$USER ~/laravel-web |
Az alkalmazás kódja most már a helyén van. A könyvtár tulajdonosa egy nem-root felhasználó, így továbbléphet az alkalmazásszolgáltatások meghatározására a docker-compose fájlban.
2. lépés: A Docker Compose fájl létrehozása
A Docker Compose leegyszerűsíti az alkalmazások felépítésének és telepítésének folyamatát. Miután meghatározta a konfigurációkat és a szolgáltatásokat, könnyen telepítheti alkalmazását bármely olyan gazdagépen, amelyre telepítve van a Docker és a Docker Compose, anélkül, hogy aggódnia kellene az alkalmazás függőségei miatt. Ami a legfontosabb, ezt egyetlen Docker Compose paranccsal megteheti, amint azt látni fogjuk a 9. lépésben..
Ebben a lépésben egy Docker Compose fájlt fog meghatározni a webszerver, az adatbázis és az alkalmazásszolgáltatások konfigurációival, amelyek egy Laravel alkalmazás telepítéséhez szükségesek.
A Docker Compose fájlok YAML formátumú, .yml kiterjesztéssel mentett fájlok. Kérjük, vegye figyelembe, hogy a megfelelő behúzás szükséges az érvényes Docker Compose fájlhoz. Írja be a következő parancsot a fájl létrehozásához és a nano szerkesztővel való megnyitásához:
|
1 |
nano ~/laravel-web/docker-compose.yml |
Ezután három szolgáltatást fog meghatározni ebben a fájlban: app, webserver és db. A db szakasz határozza meg az alkalmazás adatbázis-hitelesítő adatait, ezért mindenképpen válasszon egy erős mysql_root_password-öt, és cserélje ki abban a szakaszban. Másolja ki és illessze be a következő kódot:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
version: '2.0' services: #PHP szolgáltatás app: build: context: . dockerfile: Dockerfile image: cloudsigma.com/php container_name: app restart: unless-stopped tty: true environment: SERVICE_NAME: app SERVICE_TAGS: dev working_dir: /var/www/html/ networks: - app-network #Nginx szolgáltatás webserver: image: nginx:alpine container_name: webserver restart: unless-stopped tty: true ports: - "80:80" - "443:443" networks: - app-network #MySQL szolgáltatás db: image: mysql:5.7.32 container_name: db restart: unless-stopped tty: true ports: - "3306:3306" environment: MYSQL_DATABASE: laravel_web MYSQL_ROOT_PASSWORD: replace_mysql_root_password SERVICE_TAGS: dev SERVICE_NAME: mysql networks: - app-network #Docker hálózatok networks: app-network: driver: bridge |
Az alábbiakban a fenti kódban szereplő szolgáltatásdefiníciók magyarázata következik:
- app: Meghatározza a Laravel alkalmazást, és egy egyedi Docker-képet futtat (cloudsigma.com/php), amelyet a 4. lépésben fogunk meghatározni. Beállítja továbbá a working_dir értékét a konténerben a /var/www/html könyvtárra.
- webserver: Letölti az nginx:alpine képet a Dockerből, és megnyitja a következő portokat: 80 és 443.
- db: Letölti a mysql:5.7.32 képet a Dockerből, és meghatároz néhány környezeti változót. Ezek közé tartozik egy laravel_web nevű adatbázis az alkalmazás számára, valamint az adatbázis root jelszava. Az adatbázist átnevezheti egy tetszőleges névre. Ne felejtse el kicserélni a MYSQL_ROOT_PASSWORD tulajdonságot egy erős jelszóra. Ez a szolgáltatás a gazdagép 3306-os portját is a konténer 3306-os portjához rendeli.
Az egyes szolgáltatásokban található container_name tulajdonság határozza meg a szolgáltatásnak megfelelő konténer nevét. Ha nem határozza meg ezt a tulajdonságot, a Docker egy véletlenszerű nevet választ minden egyes konténernek.
A networks tulajdonság egy bridge hálózatot határoz meg app-network néven, amely megkönnyíti a konténerek közötti kommunikációt. A bridge hálózatot egy szoftveres híd vezérli, amely csak az ugyanazon a hálózati hídon lévő konténerek közötti kommunikációt teszi lehetővé. A szoftveres hídvezérlő olyan illesztőprogramokat telepít, amelyek megakadályozzák, hogy a különböző bridge hálózatokon lévő konténerek közvetlenül kommunikáljanak egymással. Ez magas szintű biztonságot garantál, mivel csak a kapcsolódó szolgáltatások tudnak közvetlenül kommunikálni. Dönthet úgy is, hogy több szolgáltatást és hálózatot határoz meg a kapcsolódó funkciók összekapcsolására.
3. lépés: Hogyan perzisztáljuk az adatokat
A webalkalmazása adatokat fog kezelni és kiszolgálni a felhasználóknak. Ebben a lépésben végigvezetjük Önt a kötetek és bind mountok meghatározásán a szolgáltatásdefiníciókban az alkalmazás adatainak perzisztálásához. A Docker olyan hihetetlen funkciókat kínál, mint a bind mountok és a kötetek az adatok perzisztálására és az alkalmazás konfigurációs fájljainak mentésére. Ezeket fogjuk használni a Laravel alkalmazásunk Dockerrel történő beállításához.
A kötetek (volumes) használata több okból is előnyösebb, többek között biztonsági mentéseket kínálnak, és a konténer életciklusán túl is megőrzik az adatokat. A bind mountok általában a gazdagép egy tényleges könyvtárára hivatkoznak. Amikor létrehoz egy kötetet, egy új könyvtár jön létre a Docker tárolókönyvtárában, amelyet a Docker kezel. Amikor bind mountot hoz létre, a gazdagépen lévő fájl vagy könyvtár be lesz csatolva egy konténerbe (az abszolút útvonalára hivatkozva). Ez kulcsfontosságú a webalkalmazásunk szempontjából, mert amikor módosítja a kódot a gazdagépen, az azonnal elérhetővé válik a konténer számára.
Legyen óvatos a bind mountok használatakor. A Docker-konténerben futó folyamatok módosíthatják a gazdagép fájlrendszerét, és hatással lehetnek a gazdagépen futó nem Docker-folyamatokra. Bár a Docker-csatolások hatékony funkciót jelentenek, legyen tisztában ezekkel a biztonsági következményekkel.
Ezek után lássuk, hogyan használhatjuk ezt a két funkciót a beállításunkban. Először meghatározunk egy kötetet a MySQL adatbázis perzisztálásához. Az általunk létrehozott Docker Compose fájlban, a db szolgáltatás alatt, adjon hozzá egy volumes tulajdonságot az alábbiak szerint kiemelve:
|
1 2 3 4 5 6 7 8 |
#MySQL szolgáltatás db: ... volumes: - dbdata:/var/lib/mysql/ networks: - app-network ... |
A meghatározás szerint a dbdata kötet fogja perzisztálni a /var/lib/mysql tartalmát. Ez megkönnyíti a biztonsági mentéseket, és lehetővé teszi a szolgáltatások újraindítását az adatok elvesztése nélkül. Ezután adja hozzá a kötetek (volumes) definícióját a Docker Compose fájl végéhez, hogy az elérhető legyen a szolgáltatások között. Írja be a következő kódrészletet a fájl aljára:
|
1 2 3 4 |
#Kötetek volumes: dbdata: driver: local |
A MySQL adatbázishoz való csatlakozáshoz meg kell adnia a hitelesítési adatokat. Ehhez határozzon meg egy bind mountot úgy, hogy hozzáadja a következő kiemelt kódrészletet a db szolgáltatáshoz a volumes tulajdonság alatt:
|
1 2 3 4 5 6 7 |
#MySQL szolgáltatás db: ... volumes: - dbdata:/var/lib/mysql/ - ./mysql/my.cnf:/etc/mysql/my.cnf ... |
A kód a ~/laravel-web/mysql/my.cnf fájlt a konténerben lévő /etc/mysql/my.cnf fájlhoz köti. A csatolt fájl az a MySQL konfigurációs fájl, amelyet a 7. lépésben fogunk létrehozni.
A konténernek az Nginx szervert kell használnia az alkalmazáskód kiszolgálásához. Ezért erre a célra két bind mountot határozunk meg (egyet az Nginx konfigurációs fájljához, egyet pedig az alkalmazáskódhoz) a webserver szolgáltatás alatt. Adja hozzá a következő kódrészletet a kötetek (volumes) meghatározásához a webserver szolgáltatás alatt:
|
1 2 3 4 5 6 7 8 |
#Nginx szolgáltatás webserver: ... volumes: - ./:/var/www/html/ - ./nginx/conf.d/:/etc/nginx/conf.d/ networks: - app-network |
Ez a sor – ./:/var/www/html összekapcsolja az alkalmazás kódját a ~/laravel-web könyvtárban a konténeren belüli /var/www/html könyvtárral. A második csatoláshoz (bind mount) egy Nginx konfigurációs fájl jön létre a ~/laravel-web/nginx/conf.d/ helyen. Ez a konténeren belüli /etc/nginx/conf.d/ könyvtárba lesz csatolva. Így szükség szerint frissítheti a konfigurációs fájlt a gazdagépen. Az Nginx conf fájlt itt fogjuk létrehozni: 6. lépés.
Ahhoz, hogy a kódban végrehajtott változtatások automatikusan megjelenjenek a konténerben, az alkalmazás kódját a konténerhez csatoljuk (bind mount). Ez felgyorsítja a telepítési folyamatot. Ezért adja hozzá a következő kiemelt kódrészletet az app szolgáltatáshoz:
|
1 2 3 4 5 6 7 8 |
#PHP szolgáltatás app: ... volumes: - ./:/var/www/html/ - ./php/laravel.ini:/usr/local/etc/php/conf.d/laravel.ini networks: - app-network |
A második sor egy php konfigurációs fájlt csatol, amelyet itt fogunk létrehozni: 5. lépés a ~/laravel-web/php/laravel.ini fájlon belül a konténerben lévő /usr/local/etc/php/conf.d/laravel.ini fájlhoz.
A teljes Docker Compose fájlnak most így kell kinéznie:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
version: '2.0' services: #PHP szolgáltatás app: build: context: . dockerfile: Dockerfile image: cloudsigma.com/php container_name: app restart: unless-stopped tty: true environment: SERVICE_NAME: app SERVICE_TAGS: dev working_dir: /var/www/html/ volumes: - ./:/var/www/html/ - ./php/laravel.ini:/usr/local/etc/php/conf.d/laravel.ini networks: - app-network #Nginx szolgáltatás webserver: image: nginx:alpine container_name: webserver restart: unless-stopped tty: true ports: - "80:80" - "443:443" volumes: - ./:/var/www/html/ - ./nginx/conf.d/:/etc/nginx/conf.d/ networks: - app-network #MySQL szolgáltatás db: image: mysql:5.7.32 container_name: db restart: unless-stopped tty: true ports: - "3306:3306" environment: MYSQL_DATABASE: laravel_web MYSQL_ROOT_PASSWORD: replace_mysql_root_password SERVICE_TAGS: dev SERVICE_NAME: mysql volumes: - dbdata:/var/lib/mysql/ - ./mysql/my.cnf:/etc/mysql/my.cnf networks: - app-network #Docker hálózatok networks: app-network: driver: bridge #Kötetek volumes: dbdata: driver: local |
Ha minden rendben van, nyomja meg a Ctrl + O billentyűkombinációt a fájl mentéséhez. Ezután nyomja meg a Ctrl + X billentyűkombinációt a szerkesztőből való kilépéshez. Ezen a ponton már képesnek kell lennie egy egyedi Docker-képfájl felépítésére az alkalmazásához a Docker Compose fájl segítségével.
4. lépés: A Dockerfile létrehozása
A Dockerfile olyan utasításokat tartalmaz, amelyeket a Docker használhat egyedi Docker-képfájlok felépítéséhez. Telepítheti a szükséges szoftvereket is, és konfigurálhatja az alkalmazásához szükséges beállításokat. Meghatározzák a konténeren belüli környezetet, amely az alkalmazás kódját fogja tárolni. A létrehozott képfájlokat feltöltheti a docker hub helyre megosztás céljából, vagy elhelyezheti őket más privát regiszterekben.
Létrehozunk egy Dockerfile-t, amely megadja a Laravel alkalmazáskép felépítéséhez szükséges utasításokat. Használja a nano-t a Dockerfile létrehozásához a ~/laravel-web könyvtárban:
|
1 |
nano ~/laravel-web/Dockerfile |
A megnyitott szerkesztőben adja hozzá a következő kódot:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
FROM php:7.4-fpm # Másolja a composer.lock és composer.json fájlokat a munkakönyvtárba COPY composer.lock composer.json /var/www/html/ # Munkakönyvtár beállítása WORKDIR /var/www/html/ # Függőségek telepítése az operációs rendszer szoftveréhez RUN apt-get update && apt-get install -y \ build-essential \ libpng-dev \ libjpeg62-turbo-dev \ libfreetype6-dev \ locales \ zip \ jpegoptim optipng pngquant gifsicle \ vim \ libzip-dev \ unzip \ git \ libonig-dev \ curl # Gyorsítótár ürítése RUN apt-get clean && rm -rf /var/lib/apt/lists/* # PHP kiterjesztések telepítése RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl RUN docker-php-ext-configure gd --with-freetype --with-jpeg RUN docker-php-ext-install gd # Composer (php csomagkezelő) telepítése RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # A meglévő alkalmazáskönyvtár tartalmának másolása a munkakönyvtárba COPY . /var/www/html # A munkakönyvtár jogosultságainak hozzárendelése a www-data felhasználóhoz RUN chown -R www-data:www-data \ /var/www/html/storage \ /var/www/html/bootstrap/cache # A 9000-es port megnyitása és a php-fpm szerver elindítása (a FastCGI Process Managerhez) EXPOSE 9000 CMD ["php-fpm"] |
A Dockerfile először egy olyan képet hoz létre, amely a php:7.4-fpm Docker-képen alapul. Ez egy Debian-alapú kép, amelyre telepítve van a PHP FastCGI implementáció (PHP-FPM). Ahhoz, hogy a Laravel megfelelően fusson, más PHP-kiterjesztésekre is szükség van, mint például az mcrypt, pdo_mysql, mbstring és imagick, amelyeket a szkript telepít. Ezután telepíti a composer PHP-csomagkezelőt. A konténer ezt fogja használni a Laravel PHP-függőségeinek telepítéséhez.
A RUN direktívával olyan parancsokat határozhat meg, mint a telepítés, frissítés és a beállítások konfigurálása a konténeren belül. Ez a felhasználói jogosultságokat is hozzárendeli. A WORKDIR direktíva határozza meg a munkakönyvtárat, amely ebben az esetben a /var/www/html. A szkript futtatja a CHOWN parancsot, hogy a /var/www/html könyvtár jogosultságait hozzárendelje a www-data felhasználóhoz.
A kép végleges felépítése előtt meg kell nyitni egy portot, hogy hozzáférést biztosítsunk a konténerben futó alkalmazáshoz. Az EXPOSE parancs megnyit egy portot (9000) a php-fpm szerver számára. Az utolsó futtatandó parancs a CMD direktíva. Ez futtatja a php-fpm-et a szerver elindításához.
Most megnyomhatja a Ctrl + O billentyűkombinációt a fájl mentéséhez. Ezután nyomja meg a Ctrl + X billentyűkombinációt a szerkesztőből való kilépéshez.
5. lépés: A PHP konfigurálása
Ebben a lépésben konfiguráljuk a php szolgáltatást az Nginx-től érkező kérések feldolgozására. Létre fog hozni egy laravel.ini fájlt a php könyvtárban. Ez a fájl fogja tartalmazni a PHP konfigurációkat. Ez az a fájl, amelyet a /usr/local/etc/php/conf.d/laravel.ini útvonalra csatolt (bind-mount) a konténerben a 3. lépésben. Az ebben a fájlban található konfigurációk felülírják az alapértelmezett php.ini fájlt, amelyet a PHP általában indításkor beolvas. Írja be a következő parancsot a php könyvtár létrehozásához:
|
1 |
mkdir ~/laravel-web/php |
Hozza létre és nyissa meg a laravel.ini fájlt a php könyvtárban a következő parancs beírásával:
|
1 |
nano ~/laravel-web/php/laravel.ini |
Az alapértelmezett php.ini fájl feltöltési korlátja 2M-ra van beállítva. Példaként megmutatjuk, hogyan módosíthatja és állíthatja be a php konfigurációkat az engedélyezett feltöltési korlát értékének megváltoztatásával, arra az esetre, ha nagyobb fájlokat szeretne feltölteni. Írja be a következő kódsorokat a fájlba:
|
1 2 |
upload_max_filesize=80M post_max_size=80M |
Ez beállítja a feltöltési korlátot, így legfeljebb 80 MB összeméretű fájlokat tölthet fel. A laravel.ini fájlban további php konfigurációkat is megadhat az alapértelmezett php konfigurációk felülírásához. Most mentse el és zárja be a fájlt.
6. lépés: Az Nginx konfigurálása
Ebben a lépésben konfiguráljuk az Nginx-et a korábban meghatározott php szolgáltatás használatára. A PHP-FPM szolgáltatást fogja használni mint FastCGI szervert a dinamikus tartalom kiszolgálására. A FastCGI szerver egy olyan szoftver, amely lehetővé teszi az interaktív programok számára a webszerverrel való kommunikációt.
Ahogy azt a docker-compose fájlban meghatároztuk a 3. lépésben, létrehozzuk az app.conf Nginx konfigurációs fájlt a ~/laravel-web/nginx/conf.d/ könyvtárban. Először írja be a következő parancsot a könyvtár létrehozásához:
|
1 |
mkdir -p ~/laravel-web/nginx/conf.d |
Ezután hozza létre és nyissa meg az app.conf fájlt a nano segítségével a következő parancs beírásával:
|
1 |
nano ~/laravel-web/nginx/conf.d/app.conf |
Adja hozzá a következő Nginx konfigurációs kódot a fájlhoz:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
server { listen 80; index index.php index.html; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; root /var/www/html/public; location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass app:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location / { try_files $uri $uri/ /index.php?$query_string; gzip_static on; } } |
Az Nginx úgynevezett szerverblokk (server block) konfigurációs fájlokat olvas be, hogy tudja, melyik könyvtárat kell kiszolgálnia a webhely látogatójának az URL alapján. Ha többet szeretne megtudni, olvassa el a szerverblokkok beállításáról szóló részt a következő útmutatónkban: Nginx telepítése Ubuntu-ra18.04. A meghatározott direktívák a következő célokat szolgálják:
- listen – Meghatározza azt a portot, amelyen a szerver a bejövő kéréseket fogadja, ez általában a 80-as port.
- error_log & access_log – Meghatározza az alkalmazásnaplók (logs) írására szolgáló fájlokat.
- root – Meghatározza a webroot útvonalat, vagyis azt a könyvtárat, amely kiszolgálja az internetről a szerverre érkező kéréseket.
A php location blokkjában a fastcgi_pass direktíva meghatározza, hogy az app szolgáltatás egy TCP socketen figyel a 9000-es porton (amely a Dockerfile-ban lett meghatározva). Ez arra utasítja a PHP-FPM szervert, hogy a hálózaton keresztül figyeljen, és ne egy Unix socketen. Bár a Unix socketnek lehet egy kis sebességbeli előnye a TCP sockettel szemben, nem rendelkezik hálózati protokollal, így kihagyja a hálózati vermet (network stack).
A Unix socket megfelelőbb lenne olyan forgatókönyvek esetén, ahol a gazdagépek egyetlen gépen találhatók. Ha azonban a szolgáltatások különböző gazdagépeken futnak, a TCP socket előnye, hogy képes összekapcsolni az elosztott szolgáltatásokat. A mi esetünkben az alkalmazáskonténer egy másik gazdagépen fut, mint a webszerver-konténerünk. Így a konfigurációnkhoz a TCP socket a legmegfelelőbb.
Most megnyomhatja a Ctrl + O billentyűkombinációt a fájl mentéséhez, majd a Ctrl + X billentyűkombinációt a szerkesztőből való kilépéshez. Az nginx/conf.d/ könyvtárban végrehajtott változtatások automatikusan megjelennek a webszerver-konténerben a Docker Compose fájlban hozzáadott bind mountnak köszönhetően a(z) 3. lépésben.
7. lépés: A MySQL konfigurálása
Miután beállítottuk az Nginx-et a PHP-vel való együttműködésre, most konfigurálhatjuk a MySQL-t a dinamikus adatok tárolására és a PHP felé történő kiszolgálására. A Docker Compose fájlt már beállítottuk a PHP és MySQL közötti kommunikációhoz szükséges kiterjesztések telepítésére. A MySQL konfigurációs fájlját, a my.cnf-et a mysql mappán belül fogjuk létrehozni, amely a /etc/mysql/my.cnf útvonalra lesz bind-mountolva, ahogyan azt a Docker Compose db szolgáltatás szakaszában meghatároztuk a(z) 3. lépésben.
A MySQL konfigurációs beállításai és módosításai bármikor elvégezhetők a my.cnf fájlban. Ezeknek azonnal meg kell jelenniük a konténerben. Először hozza létre a könyvtárat a következő parancs beírásával:
|
1 |
mkdir ~/laravel-web/mysql |
Ezután hozza létre és nyissa meg a nano-t a következő parancs beírásával:
|
1 |
nano ~/laravel-web/mysql/my.cnf |
Írja be a következő kódrészletet a lekérdezési napló engedélyezéséhez és a lekérdezési naplófájl helyének megadásához:
|
1 2 3 |
[mysqld] general_log = 1 general_log_file = /var/lib/mysql/general.log |
A general_log tulajdonság 1-re állításával engedélyezi az általános naplókat. A general_log_file tulajdonság határozza meg a naplófájl helyét. Nyomja meg a Ctrl + O billentyűkombinációt a fájl mentéséhez, majd a Ctrl + X billentyűkombinációt a szerkesztőből való kilépéshez.
8. lépés: A Laravel környezeti változóinak beállítása
Eddig a pontig minden szolgáltatás és konfigurációs beállítás elkészült. Így már képesek lennénk telepíteni a konténereinket. Van azonban egy fontos lépés, amelyet el kell végezni, mielőtt a webalkalmazásunk ténylegesen használhatóvá válna – a környezeti változók beállítása. A Laravel keretrendszer egy .env nevű fájlt vár, amelyet a környezetének meghatározásához használ. Alapértelmezés szerint a Laravel tartalmazza a .env.example fájlt, amelyet átmásolhat a .env fájlba, majd módosíthatja a változókat a tényleges adataival. Írja be a következő parancsot a fájl másolásához:
|
1 |
cp .env.example .env |
Miután átmásolta, nyissa meg a fájlt a nano segítségével a módosításhoz:
|
1 |
nano .env |
Íme egy képernyőkép arról, hogyan nézhet ki a fájl:

A fájlban a következő lépés a DB_CONNECTION blokk alatti változók módosítása az eddig elvégzett konfigurációknak megfelelően. Frissítse az alábbiak szerint:
- DB_HOST a db adatbázis-konténer.
- DB_DATABASE a laravel_web.
- DB_USERNAME az adatbázis felhasználóneve. Válasszon egy tetszőleges nevet, de a jelen útmutató kedvéért használjuk a következőt: laraveldocker.
- DB_PASSWORD egy erős jelszó, amelyet a fenti felhasználó fog használni az adatbázisba való bejelentkezéshez, ezért válasszon egy erős jelszót. A(z) 10. lépésben fogjuk létrehozni ezt a felhasználót az itt kiválasztott jelszóval.
A frissített értékekkel a DB_CONNECTION-nek most így kell kinéznie:

Mentse és zárja be a fájlt.
9. lépés: A Docker konténerek futtatása
Ebben a szakaszban az összes szolgáltatás és konfiguráció meg van határozva a Docker Compose fájlban. Mindössze egyetlen parancs szükséges az összes konténer elindításához, a kötetek létrehozásához, a hálózatok csatlakoztatásához, valamint az alkalmazás beállításához és felépítéséhez. Írja be a következő parancsot a terminálba:
|
1 |
docker-compose up -d |
Amikor először futtatja a docker-compose up parancsot, az letölti az összes szükséges Docker-képet. Ha a helyi számítógépén állítja be az infrastruktúrát, ez eltarthat egy ideig. Miután a képek letöltődtek, a Compose létrehozza a konténereket. A -d jelző arra utasítja a Dockert, hogy a konténereket a háttérben futtassa. Ha a folyamat sikeresen befejeződik, valami hasonlót kell látnia a termináljában:

Írja be a következő parancsot a terminálba az összes futó konténer listázásához:
|
1 |
docker ps |
A következő képernyőképhez hasonlót kell mutatnia, az app, webserver és db konténerek részleteivel:

- CONTAINER ID – Egy egyedi azonosító minden egyes konténerhez.
- NAMES – Az egyes konténerekhez társított szolgáltatásnév, a Docker Compose fájlban meghatározottak szerint. (A konténer eléréséhez használhatja a konténer azonosítóját vagy nevét is).
- IMAGE – Az egyes konténerek képének (image) neve.
- STATUS – Információkat jelenít meg a konténer állapotáról (ez lehet leállított, futó vagy újrainduló).
- PORTS – Megmutatja a konténer által közzétett portokat.
A Docker Compose biztosít egy exec nevű parancsot, amellyel terminálparancsokat futtathat, vagy elérheti a parancssort egy konténeren belül. Először néhány parancsot szeretnénk futtatni az app konténerben, amely a Laravel alkalmazást futtató konténer.
A Docker biztosít egy parancsot egy konténer parancssorának eléréséhez. Ennek szintaxisa a következő: docker-compose exec container_name bash. Az app konténer parancssorának eléréséhez írja be a következő parancsot:
|
1 |
docker-compose exec app bash |
Miután a konténer parancssorába lépett, futtathat néhány Laravel Artisan konfigurációs parancsot. Írja be a következő parancsot a laravel kulcs generálásához és a .env fájlba történő mentéséhez:
|
1 |
php artisan key:generate |
A környezeti kulcs beállítása után a következő parancs futtatásával gyorsítótárazhatja a konfigurációs beállításokat:
|
1 |
php artisan config:cache |
A konfigurációk a konténeren belüli /var/www/html/bootstrap/cache/config.php fájlban tárolódnak. A konténer termináljából való kilépéshez nyomja meg a Ctrl + D billentyűkombinációt.
Annak ellenőrzéséhez, hogy a Laravel alkalmazás telepítve van-e és fut-e, látogasson el a szerverének nyilvános IP-címére a böngészőjében (http://your_server_public_ip). Egy új Laravel telepítés üdvözlőoldalát kell látnia:

10. lépés: MySQL felhasználó konfigurálása
Ebben a lépésben létrehozunk egy adatbázis-felhasználót a docker-compose fájlban megadott laravel_web MySQL adatbázishoz. Amikor a konténerépítő parancsot futtatta a 9. lépésben, a MySQL telepítve lett, de csak egy alapértelmezett root adminisztrátori fiókot hozott létre, amely korlátlan jogosultságokkal rendelkezik az adatbázisban. A root felhasználó használatának elkerülése érdekében létrehozunk egy dedikált felhasználót, a laraveldockert, amelyet az alkalmazáshoz használhatunk. Ez az a felhasználó, amelyet a környezeti változókban adott meg a 8. lépésben. Lépjen be a parancssorba a terminálon belül a következő parancs beírásával:
|
1 |
docker-compose exec db bash |
Miután belépett a konténerbe, jelentkezzen be a MySQL-be a következő parancs beírásával:
|
1 |
mysql -u root -p |
A jelszóbekérőnél adja meg azt a jelszót, amelyet a docker-compose fájl db szolgáltatásában állított be a 2. lépésben.
Miután bejelentkezett a MySQL parancssorba, ellenőrizze, hogy látja-e a docker-compose fájlban megadott adatbázist a következő SQL parancs beírásával:
|
1 |
show databases; |
Látnia kell a laravel_web adatbázist, vagy bármilyen más nevet, amelyet a beállítás során megadott:

Ezután létrehozunk egy felhasználót és jelszót a laravel_web adatbázishoz. Ennek meg kell egyeznie a .env fájlban megadott adatokkal a 8. lépésben. Írja be a következő parancsot a felhasználó és a jelszó létrehozásához, valamint az összes jogosultság megadásához ennek a felhasználónak:
|
1 |
GRANT ALL ON laravel_web.* TO 'laraveldocker'@'%' IDENTIFIED BY 'your_strong_laravel_docker_password'; |
A változtatások azonnali érvénybe lépéséhez adja meg a következő parancsot a jogosultságok ürítéséhez (flush):
|
1 |
FLUSH PRIVILEGES; |
Ezzel befejeződött a MySQL felhasználó konfigurálása. Lépjen ki a MySQL parancssorból az exit beírásával és az Enter megnyomásával. Végül lépjen ki a db konténerből a Ctrl + D billentyűkombináció megnyomásával.
11. lépés: A Laravel alkalmazáskód és a MySQL adatbázis közötti kommunikáció tesztelése
Eddig a lépésig minden jól működött. Szeretnénk azonban megbizonyosodni arról, hogy az app konténerben lévő Laravel kód képes kommunikálni a db konténerben lévő MySQL adatbázissal. Először lépjen be az app konténer termináljába a következő parancs beírásával:
|
1 |
docker-compose exec app bash |
Ezután futtassa a laravel migration parancsot, amely létrehozza a táblákat:
|
1 |
php artisan migrate |
A terminálban látnia kell a migrációs folyamatot, ahogy a Laravel létrehozza az alapértelmezett táblákat:

Ezután teszteljük, hogy elérjük-e az adatbázist a Laravelből. A Laravel alapértelmezés szerint tartalmazza a Tinker eszközt, amely lehetővé teszi, hogy a parancssorból interakcióba lépjen a teljes alkalmazással, beleértve az adatbázis elérését, a feladatok futtatását, az eloquent ORM használatát és még sok mást. A Tinker segítségével megtekinthetjük a migrations táblában lévő adatokat. Írja be a következő parancsot a Tinker eléréséhez:
|
1 |
php artisan tinker |
A Tinker parancssorba lépve a következő parancs beírásával listázhatja a migrate parancs által létrehozott táblákat:
|
1 |
\DB::select('show tables'); |
Az alábbi képernyőkép mutatja a kimenetet, amelyek a laravel_web adatbázisban jelenleg megtalálható táblák:

A táblában lévő adatokat a tábla nevének megadásával kérdezheti le. Például a migrations tábla adatait a következő parancs beírásával kérheti le:
|
1 |
\DB::table('migrations')->get(); |
A parancs a következőt adja vissza:

A fenti kimenetből látható, hogy a Laravel alkalmazás megfelelően van konfigurálva, és képes kommunikálni az adatbázissal. Kísérletezhet további parancsokkal is, mint például modellek létrehozása, feladatok futtatása és még sok más. A Tinker parancssorból a Ctrl + D billentyűkombináció megnyomásával léphet ki.
Összegzés
Ebben az útmutatóban egy LEMP stack Laravel alkalmazást telepített egy Docker konténerbe. Tesztelte az alkalmazást a webes felület elérésével, valamint az adatbázishoz való csatlakozással a Laravel Tinker segítségével. Tapasztalhatta a Docker Compose erejét. Lehetővé teszi egyetlen fájlban meghatározott Docker konténerek csoportjának létrehozását, amelyeket aztán egyetlen paranccsal futtathat.
Ha szeretne jobban megismerkedni a konténerekkel, tekintse meg a Docker-erőforrások – képek, konténerek és kötetek – törlését bemutató útmutatónkat és a Kubernetes eszközről szóló részletes áttekintésünket.
Látogasson el blogunkra is, ha többet szeretne megtudni a Docker és a folyamatos integráció és folyamatos szállítás (CI/CD) témaköréről.
Kellemes kódolást!
Hozzászólások
Még nincsenek hozzászólások. Legyen Ön az első.