
اگر چند سالی در توسعه وب فعالیت کرده باشید، احتمالا بارها با جمله معروف «روی سیستم من که کار میکند!» مواجه شدهاید. یکی از بزرگترین مشکلات تیمهای توسعه نرمافزار تفاوت محیطهای اجرایی است. ممکن است پروژه روی سیستم توسعهدهنده بدون مشکل اجرا شود اما هنگام انتقال به سرور یا سیستم سایر اعضای تیم با خطاهای عجیب روبهرو شوید.
اینجاست که داکر وارد بازی میشود.
داکر به شما کمک میکند محیط اجرای برنامه را در قالب کانتینرهای ایزوله تعریف کنید تا پروژه در هر سیستمی دقیقا مشابه اجرا شود. در اکوسیستم لاراول نیز داکر به یکی از ابزارهای محبوب توسعه تبدیل شده است.
در این مقاله یاد میگیریم چگونه یک پروژه ساده لاراول را تنها در چند دقیقه داکرایز کنیم و آن را با داکر کامپوز اجرا کنیم.
داکر یک پلتفرم کانتینرسازی (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
محتوای آن:
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"]
خط زیر تصویر 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.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 را باز کنید:
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 اجرا کنید:
docker compose exec app php artisan
مثلا:
docker compose exec app php artisan migrate
یا:
docker compose exec app php artisan route:list
به جای نصب Composer روی سیستم:
docker compose exec app composer install
یا:
docker compose exec app composer update
در پروژههای واقعی معمولا از 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: 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
در محیط عملیاتی بهتر است از 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
امنیت بیشتر
مصرف کمتر منابع
اشتباه:
DB_HOST=localhost
در داکر باید:
DB_HOST=mysql
باشد.
اگر Volume تعریف نشود، تغییرات فایلها در پروژه منعکس نخواهند شد.
نمونه صحیح:
volumes: - .:/var/www
پس از بالا آمدن کانتینرها:
docker compose exec app php artisan migrate
گاهی Docker از نسخه کش شده استفاده میکند.
راهحل:
docker compose build --no-cache
لاراول ابزار داخلی Sail را ارائه میکند.
مزایای Sail:
راهاندازی سریع
تنظیمات آماده
مناسب پروژههای کوچک
مزایای Docker اختصاصی:
کنترل کامل
مناسب پروژههای سازمانی
قابلیت سفارشیسازی بالا
درک بهتر ساختار داکر
اگر قصد یادگیری داکر را دارید بهتر است ابتدا داکر کامپوز را به صورت دستی پیادهسازی کنید.
داکر یکی از مهمترین ابزارهایی است که هر توسعهدهنده لاراول باید با آن آشنا باشد. با استفاده از داکر میتوانید محیط توسعهای یکپارچه، قابل تکرار و مستقل از سیستم عامل ایجاد کنید. در این مقاله یاد گرفتیم چگونه تنها با چند فایل ساده شامل Dockerfile و Docker Compose یک پروژه لاراول را داکرایز کنیم، دیتابیس MySQL را به آن متصل کنیم و در نهایت با Nginx پروژه را در مرورگر اجرا کنیم.
اگر هنوز پروژههای لاراول خود را بدون داکر اجرا میکنید، همین امروز یک پروژه آزمایشی ایجاد کنید و مراحل این آموزش را پیادهسازی کنید. پس از چند روز استفاده متوجه خواهید شد که بازگشت به روشهای سنتی مدیریت محیط توسعه چندان جذاب نخواهد بود.