تا کنون توانستیم سرویس های PHP، MySQL و nginx را راه اندازی کنیم اما هنوز فریم ورک لاراول را نصب نکردیم. اگر شما توسعه دهنده PHP هستید به احتمال زیاد composer در سیستم شما نصب است. پس میتوانید داخل پوشه src دستور composer create-project laravel/laravel
را اجرا کنید. اما در این قسمت می خواهیم این کار را توسط داکر انجام دهیم تا در سیستم یا سرور های دیگر که composer ندارند هم بتوانیم برنامه خود را اجرا کنیم. برای این کار به فایل docker compose یک سرویس جدید اضافه می کنیم.
version: '3.8'
services:
nginx:
build:
context: .
dockerfile: nginx.dockerfile
ports:
- 80:80
volumes:
- ./src:/var/www/html
depends_on:
- mysql
- php
mysql:
image: mysql:5.7
ports:
- 3306:3306
environment:
MYSQL_DATABASE: sokanacademy
MYSQL_USER: sokanacademy
MYSQL_PASSWORD: secret
MYSQL_ROOT_PASSWORD: secret
volumes:
- ./mysql:/var/lib/mysql
php:
build:
context: .
dockerfile: php.dockerfile
volumes:
- ./src:/var/www/html
composer:
image: composer:2
volumes:
- ./src:/var/www/html
working_dir: /var/www/html
برای این سرویس از برچسب working_dir استفاده کردیم تا مشخص شود دستور های composer در چه مسیری اجرا شوند.
اکنون که سرویس composer تعریف شده، چگونه از آن استفاده کنیم؟ بر خلاف سرویس های قبلی، composer را برای اجرا در پس زمینه نیاز نداریم. کافی است کانتینر های سرویس composer را برای اجرای یک دستور، فعال کنیم و بعد از اجرای آن دستور غیر فعال کنیم تا منابعی که توسط آن استفاده شده بود، آزاد شوند.
ابتدا فایل index.php را از پوشه src پاک می کنیم. سپس با اجرای دستور زیر فریم ورک لاراول را نصب کنیم.
docker compose run --rm composer create-project laravel/laravel
با دستور docker compose run
به داکر گفتیم که می خواهیم تنها یک دستور اجرا شود و نیاز نیست کانتینری که می سازد را فعال نگه دارد. گزینه rm-- هم همانطور که قبل تر دیدیم، کانتینر را به صورت کامل پاک می کند. بعد از گزینه rm-- نام سرویس را نوشتیم و جلوی آن دستوری که می خواهیم اجرا شود را آورده ایم.
اکنون اگر دستور docker ps
را اجرا کنیم می بینیم که کانتینر composer در حال اجرا نیست و بعد از اجرای دستور غیر فعال شده است.
قبل از اجرای برنامه، لازم است به فایل تنظیمات nginx که با نام default.conf نوشتیم برویم و مسیر فایل index.php را در پوشه public تعیین کنیم.
server {
listen 80;
index index.php index.html;
server_name _;
root /var/www/html/public;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
دستور docker compose up nginx
را اجرا می کنیم تا کانتینر های MySQL ،PHP و nginx دوباره فعال شوند و آدرس localhost:80 را در مروگر مشاهده می کنیم.
اکنون می توانیم هر دستور composer را اجرا کنیم. تنها کافی است قبل از دستور مورد نظر docker compose run composer
را بنویسیم. این کار در حالی که بقیه کانتینر ها فعال هستند هم قابل انجام است.