ویرگول
ورودثبت نام
مجتبی پاکزاد
مجتبی پاکزادتکنیکال تیم لید شرکت داده پردازان آبشار هستم. برای خوندن بیشتر تجربیات و مطالعاتم من رو در باورژن baversion.com دنبال کنید.
مجتبی پاکزاد
مجتبی پاکزاد
خواندن ۵ دقیقه·۳ ساعت پیش

راهنمای کامل داکرایز کردن برای لاراول

اگر چند سالی در توسعه وب فعالیت کرده باشید، احتمالا بارها با جمله معروف «روی سیستم من که کار می‌کند!» مواجه شده‌اید. یکی از بزرگ‌ترین مشکلات تیم‌های توسعه نرم‌افزار تفاوت محیط‌های اجرایی است. ممکن است پروژه روی سیستم توسعه‌دهنده بدون مشکل اجرا شود اما هنگام انتقال به سرور یا سیستم سایر اعضای تیم با خطاهای عجیب روبه‌رو شوید.

اینجاست که داکر وارد بازی می‌شود.

داکر به شما کمک می‌کند محیط اجرای برنامه را در قالب کانتینرهای ایزوله تعریف کنید تا پروژه در هر سیستمی دقیقا مشابه اجرا شود. در اکوسیستم لاراول نیز داکر به یکی از ابزارهای محبوب توسعه تبدیل شده است.

در این مقاله یاد می‌گیریم چگونه یک پروژه ساده لاراول را تنها در چند دقیقه داکرایز کنیم و آن را با داکر کامپوز اجرا کنیم.


داکر چیست؟

داکر یک پلتفرم کانتینرسازی (Containerization) است که به شما اجازه می‌دهد برنامه و تمام وابستگی‌های آن را داخل یک کانتینر قرار دهید.

مزایای اصلی داکر عبارتند از:

  • حذف مشکلات تفاوت محیط توسعه

  • راه‌اندازی سریع پروژه

  • استقرار آسان روی سرور

  • مدیریت بهتر وابستگی‌ها

  • کاهش خطاهای ناشی از نصب نرم‌افزارها

به جای نصب PHP، MySQL، ردیس و سایر سرویس‌ها روی سیستم، می‌توانید همه آن‌ها را در کانتینرهای جداگانه اجرا کنید.


چرا برای لاراول از داکر استفاده کنیم؟

فرض کنید پروژه شما به موارد زیر نیاز دارد:

  • PHP 8.5

  • MySQL 8

  • Redis

  • Composer

  • Nginx

اگر بخواهید این سرویس‌ها را روی هر سیستم نصب کنید زمان زیادی از دست می‌رود.

اما با داکر کافی است:

docker compose up -d

و کل محیط توسعه آماده خواهد بود.

برخی مزایای داکر برای پروژه‌های لاراول:

  • نصب آسان پروژه برای اعضای جدید تیم

  • هماهنگی کامل محیط توسعه و سرور

  • امکان اجرای چند نسخه PHP همزمان

  • حذف وابستگی به سیستم عامل

  • افزایش سرعت توسعه


پیش‌نیازها

قبل از شروع باید موارد زیر را نصب کرده باشید:

  • Docker

  • Docker Compose

برای بررسی نصب:

docker --version

و

docker compose version

ساخت یک پروژه لاراول

ابتدا یک پروژه جدید ایجاد می‌کنیم:

composer create-project laravel/laravel laravel-docker

و وارد پوشه پروژه می‌شویم:

cd laravel-docker

ساختار فعلی پروژه:

laravel-docker/ ├── app ├── bootstrap ├── config ├── database ├── public ├── routes ├── storage ├── vendor └── ...

اکنون نوبت داکرایز کردن پروژه است.


ساخت Dockerfile

در ریشه پروژه فایلی با نام زیر ایجاد کنید:

Dockerfile

محتوای آن:

FROM php:8.5-fpm RUN apt-get update && apt-get install -y \ git \ curl \ zip \ unzip \ libzip-dev \ libpng-dev RUN docker-php-ext-install pdo pdo_mysql zip COPY --from=composer:latest /usr/bin/composer /usr/bin/composer WORKDIR /var/www COPY . . RUN composer install CMD ["php-fpm"]

بررسی Dockerfile

خط زیر تصویر PHP را دریافت می‌کند:

FROM php:8.5-fpm

نصب پکیج‌های موردنیاز:

RUN apt-get update && apt-get install -y

نصب اکستنشن‌های PHP:

RUN docker-php-ext-install pdo pdo_mysql zip

کپی Composer:

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

مشخص کردن مسیر کاری:

WORKDIR /var/www

کپی پروژه:

COPY . .

نصب وابستگی‌ها:

RUN composer install

ساخت فایل Docker Compose

در ریشه پروژه فایل زیر را ایجاد کنید:

docker-compose.yml

و کد زیر را داخل آن قرار دهید:

services: app: build: context: . dockerfile: Dockerfile container_name: laravel_app volumes: - .:/var/www ports: - "9000:9000" depends_on: - mysql db: image: mysql:8 container_name: laravel_mysql restart: always environment: MYSQL_DATABASE: laravel MYSQL_ROOT_PASSWORD: root MYSQL_PASSWORD: root MYSQL_USER: laravel ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:

تنظیم فایل .env

فایل env را باز کنید:

DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=laravel DB_PASSWORD=root

نکته مهم:

DB_HOST=db

باید دقیقا نام سرویس MySQL در docker-compose باشد.


اجرای پروژه

حالا دستور زیر را اجرا کنید:

docker compose up -d

خروجی:

Creating laravel_mysql ... Creating laravel_app ...

برای مشاهده کانتینرها:

docker ps

اجرای دستورات Artisan

هر زمان خواستید دستور Artisan اجرا کنید:

docker compose exec app php artisan

مثلا:

docker compose exec app php artisan migrate

یا:

docker compose exec app php artisan route:list

اجرای Composer داخل کانتینر

به جای نصب Composer روی سیستم:

docker compose exec app composer install

یا:

docker compose exec app composer update

اضافه کردن Nginx

در پروژه‌های واقعی معمولا از Nginx استفاده می‌شود.

ابتدا پوشه زیر را ایجاد کنید:

docker/nginx

سپس فایل:

default.conf

را بسازید.

محتوا:

server { listen 80; root /var/www/public; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass app:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }

افزودن سرویس Nginx به Compose

nginx: image: nginx:latest container_name: laravel_nginx ports: - "8000:80" volumes: - .:/var/www - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - app

اجرای مجدد پروژه

docker compose down

سپس:

docker compose up -d --build

اکنون پروژه روی آدرس زیر در دسترس است:

http://localhost:8000

مشاهده لاگ‌ها

یکی از پرکاربردترین دستورات داکر:

docker compose logs

یا:

docker compose logs -f

برای یک سرویس خاص:

docker compose logs app

ورود به کانتینر

گاهی نیاز دارید وارد محیط کانتینر شوید:

docker compose exec app bash

اکنون داخل کانتینر هستید:

php artisan migrate
composer install
php artisan cache:clear

مدیریت کانتینرها

متوقف کردن:

docker compose stop

شروع مجدد:

docker compose start

راه‌اندازی دوباره:

docker compose restart

حذف کامل:

docker compose down

حذف همراه داده‌ها:

docker compose down -v

بهینه‌سازی Dockerfile برای Production

در محیط عملیاتی بهتر است از Multi-stage Build استفاده کنید.

نمونه:

FROM composer:latest AS builder WORKDIR /app COPY . . RUN composer install --no-dev --optimize-autoloader FROM php:8.5-fpm COPY --from=builder /app /var/www WORKDIR /var/www

مزایای این روش:

  • کاهش حجم Image

  • افزایش سرعت Deploy

  • امنیت بیشتر

  • مصرف کمتر منابع


اشتباهات رایج هنگام داکرایز کردن لاراول

استفاده از localhost برای دیتابیس

اشتباه:

DB_HOST=localhost

در داکر باید:

DB_HOST=mysql

باشد.


فراموش کردن Volume

اگر Volume تعریف نشود، تغییرات فایل‌ها در پروژه منعکس نخواهند شد.

نمونه صحیح:

volumes: - .:/var/www

اجرا نکردن Migration

پس از بالا آمدن کانتینرها:

docker compose exec app php artisan migrate

کش شدن Image قدیمی

گاهی Docker از نسخه کش شده استفاده می‌کند.

راه‌حل:

docker compose build --no-cache

Laravel Sail یا داکر اختصاصی؟

لاراول ابزار داخلی Sail را ارائه می‌کند.

مزایای Sail:

  • راه‌اندازی سریع

  • تنظیمات آماده

  • مناسب پروژه‌های کوچک

مزایای Docker اختصاصی:

  • کنترل کامل

  • مناسب پروژه‌های سازمانی

  • قابلیت سفارشی‌سازی بالا

  • درک بهتر ساختار داکر

اگر قصد یادگیری داکر را دارید بهتر است ابتدا داکر کامپوز را به صورت دستی پیاده‌سازی کنید.


جمع‌بندی

داکر یکی از مهم‌ترین ابزارهایی است که هر توسعه‌دهنده لاراول باید با آن آشنا باشد. با استفاده از داکر می‌توانید محیط توسعه‌ای یکپارچه، قابل تکرار و مستقل از سیستم عامل ایجاد کنید. در این مقاله یاد گرفتیم چگونه تنها با چند فایل ساده شامل Dockerfile و Docker Compose یک پروژه لاراول را داکرایز کنیم، دیتابیس MySQL را به آن متصل کنیم و در نهایت با Nginx پروژه را در مرورگر اجرا کنیم.

اگر هنوز پروژه‌های لاراول خود را بدون داکر اجرا می‌کنید، همین امروز یک پروژه آزمایشی ایجاد کنید و مراحل این آموزش را پیاده‌سازی کنید. پس از چند روز استفاده متوجه خواهید شد که بازگشت به روش‌های سنتی مدیریت محیط توسعه چندان جذاب نخواهد بود.

داکرdockerلاراولlaravel
۴
۱
مجتبی پاکزاد
مجتبی پاکزاد
تکنیکال تیم لید شرکت داده پردازان آبشار هستم. برای خوندن بیشتر تجربیات و مطالعاتم من رو در باورژن baversion.com دنبال کنید.
شاید از این پست‌ها خوشتان بیاید