در بخش قبلی، با کمک کانتینر های داکر توانستیم دستور های npm را اجرا کنیم. همچنین با حالت های shell و exec در مشخص کردن entrypoint آشنا شدیم. در این بخش می خواهیم دستور های artisan لاراول را توسط داکر اجرا کنیم.
اجرای دستور های artisan با npm کمی تفاوت دارد. npm برنامه ای است که آن را به شکل مستقل اجرا می کنیم اما artisan برنامه ای نیست که خارج از فریم ورک لاراول قابل اجرا باشد. بلکه اسکریپتی داخل برنامه ما است که به کمک PHP اجرا می شود. البته از آن جایی که یک image خوب برای PHP نوشته ایم، ایجاد سرویسی برای اجرای artisan کار سختی نیست.
در فایل docker compose مان سرویس جدیدی با نام artisan اضافه می کنیم. مانند سرویس PHP این سرویس هم از یک dockerfile ساخته می شود.
artisan:
build:
context: .
dockerfile: php.dockerfile
volumes:
- ./src:/var/www/html
برای سرویس artisan از همان image ای استفاده کردیم که برای PHP نوشته بودیم. اینگونه همان نسخه PHP و همان تنظیماتی که برنامه ما را اجرا می کند، برای اجرای artisan هم استفاده خواهد شد. بخش volume این سرویس هم مشابه سرویس PHP است.
نیاز است برای این سرویس برچسب working_dir را هم تعریف کنیم تا مشخص کنیم همیشه دستور های این کانتینر در مسیر پروژه اجرا شوند.
working_dir: /var/www/html
از آن جایی که ممکن است دستور artisan ای اجرا کنیم که با دیتابیس تعامل دارد، سرویس artisan به فعال بودن کانتینر mysql وابسته است. پس برچسب depends_on را هم برای این سرویس می نویسیم.
depends_on:
- mysql
در پایان، نوبت به تعریف entrypoint این کانتینر می رسد. مانند npm، باید دستوری که هنگام اجرای این سرویس استفاده می شود را مشخص کنیم.
entrypoint: ["php", "/var/www/html/artisan"]
در نهایت فایل 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
npm:
image: node:current-alpine
volumes:
- ./src:/var/www/html
entrypoint: ["npm"]
working_dir: /var/www/html
artisan:
build:
context: .
dockerfile: php.dockerfile
volumes:
- ./src:/var/www/html
working_dir: /var/www/html
depends_on:
- mysql
entrypoint: ["php", "/var/www/html/artisan"]
اکنون می توانیم از سرویس artisan استفاده کنیم. برای نمونه دستور migrate را اجرا می کنیم تا جدولهای دیتابیس ایجاد شوند.
docker compose run --rm artisan migrate
اجرای این دستور با خطای connection refused مواجه شد! دلیل بروز خطا این است که ما پس از نصب لاراول، فایل env. که اطلاعات وصل شدن به دیتابیس در آن قرار دارد را بهروزرسانی نکردیم.
پیش از این در فایل docker compose اطلاعات دیتابیس را انتخاب کرده بودیم. اکنون باید آن مقدار ها را در فایل env. استفاده کنیم.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=sokanacademy
DB_USERNAME=sokanacademy
DB_PASSWORD=secret
یک تغییر دیگر هم باید انجام دهیم. مقدار host برای دیتابیس دیگر localhost نیست! سرویس های PHP و artisan ما نسبت به سرویس MySQL ایزوله هستند. قرار دادن localhost برای مقدار host به این معنی است که داخل کانتینر PHP و artisan دیتابیس MySQL در حال اجرا است. به جای localhost باید آدرس آی پی (IP) کانتینر MySQL را قرار دهیم. مانند کاری که هنگام پیکربندی nginx انجام دادیم اینجا هم می توانیم از نام سرویس به جای آدرس آی پی آن استفاده کنیم. بنابراین مقدار های مربوط به دیتابیس در فایل env. ما به شکل زیر باید باشد:
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=sokanacademy
DB_USERNAME=sokanacademy
DB_PASSWORD=secret
پس از ذخیره تغییرات فایل env. می توانیم دستور اجرای مایگریشن ها را اجرا کنیم.
مانند composer و npm می توانیم هر دستور artisan ای را بدون داشتن PHP و MySQL در محیط local مان اجرا کنیم. برای نمونه می توانیم یک مدل ایجاد کنیم.
از آن جایی که از volume ها استفاده می کنیم، فایل های ایجاد شده توسط این دستور در سیستم ما قابل استفاده اند.
همچنین می توانیم از tinker هم استفاده کنیم.
برای نمونه در تصویر بالا توسط tinker یک کاربر ایجاد کردیم.
اکنون که ابزار مورد نیاز برای اجرا و توسعه یک برنامه با فریم ورک لاراول را در اختیار داریم می توانیم به مباحث پیشرفته تری مانند orchestration و load balancing بپردازیم. همچنین اگر تصمیم دارید در محیط production از داکر استفاده کنید، پیشنهاد می کنم بخش توضیحات image هایی که استفاده می کنید را با دقت مطالعه کنید. امیدوارم این فصل از دوره داکر برای شما مفید بوده باشد. اگر درمورد مباحث این فصل سوالی داشتید می توانید در بخش نظرات آن را با کاربران دیگر به اشتراک بگذارید.