إعداد Laravel مع خادم Nginx وقاعدة بيانات MySQL باستخدام Docker Compose
تعتبر منصة Laravel من أشهر أطر العمل المفتوحة المصدر في لغة PHP، والتي توفر بيئة تطوير حديثة وسهلة الاستخدام لبناء تطبيقات الويب. يستخدم المطورون Laravel بشكل واسع بسبب مرونتها، سهولة تعلمها، والميزات العديدة التي تقدمها مثل نظام التوجيه (Routing)، قاعدة بيانات مدمجة، دعم للأوامر عبر CLI، وغيرها. من ناحية أخرى، يعد Docker من الأدوات الحديثة التي تمكّن المطورين من إعداد بيئات العمل بسهولة مع ضمان التوافق بين الأنظمة المختلفة. في هذا المقال، سنتناول كيفية إعداد مشروع Laravel باستخدام Docker Compose مع خادم Nginx وقاعدة بيانات MySQL.
المتطلبات الأساسية
قبل البدء في إعداد المشروع، يجب أن يكون لديك بعض المتطلبات الأساسية على جهازك:
-
تثبيت Docker: يجب عليك تثبيت Docker على جهازك لتتمكن من استخدام الحاويات (Containers). يمكنك تنزيله من الموقع الرسمي docker.com.
-
تثبيت Docker Compose: Docker Compose هو أداة تتيح لك تعريف وتشغيل تطبيقات متعددة الحاويات بسهولة. يمكنك تثبيته من موقع Docker Compose.
-
أساسيات Laravel: على الرغم من أننا سنستخدم Docker لتشغيل Laravel، إلا أنك بحاجة إلى معرفة أساسية حول كيفية إنشاء تطبيق Laravel وإعداده. تأكد من أنك قد قمت بإنشاء مشروع Laravel جديد أو لديك مشروع موجود بالفعل.
الخطوة 1: إنشاء مشروع Laravel
أولاً، قم بإنشاء مشروع Laravel جديد إذا لم يكن لديك مشروع حالي. يمكنك القيام بذلك باستخدام Composer. افتح الطرفية (Terminal) في مجلد العمل الخاص بك وقم بتشغيل الأمر التالي:
bashcomposer create-project --prefer-dist laravel/laravel laravel-docker
سوف يقوم هذا الأمر بإنشاء مشروع Laravel جديد باسم laravel-docker.
الخطوة 2: إعداد Dockerfile و Docker Compose
بمجرد أن يكون لديك مشروع Laravel جاهزًا، يجب أن ننشئ بعض الملفات لتحديد كيفية تشغيل التطبيق باستخدام Docker.
1. إعداد Dockerfile
الـ Dockerfile هو الملف الذي يحتوي على التعليمات التي يخبر فيها Docker كيفية بناء الحاوية الخاصة بالتطبيق. في مجلد المشروع، قم بإنشاء ملف باسم Dockerfile واكتب فيه ما يلي:
dockerfile# استخدام صورة PHP مع Nginx و Composer FROM php:8.1-fpm # تثبيت أدوات وتوسعات PHP المطلوبة RUN apt-get update && apt-get install -y libpng-dev libjpeg-dev libfreetype6-dev zip git libicu-dev libxml2-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install gd intl opcache pdo pdo_mysql xml bcmath \ && apt-get clean # تثبيت Composer COPY --from=composer:latest /usr/bin/composer /usr/bin/composer # تعيين مجلد العمل إلى /var/www WORKDIR /var/www # نسخ ملفات المشروع إلى المجلد في الحاوية COPY . . # تثبيت التبعيات الخاصة بـ Laravel RUN composer install # إعطاء صلاحيات الكتابة لمجلدات معينة في التطبيق RUN chown -R www-data:www-data /var/www RUN chmod -R 775 /var/www/storage /var/www/bootstrap/cache
هذا الملف سيقوم بتثبيت PHP مع التوسعات المطلوبة مثل pdo_mysql، gd، وintl. بالإضافة إلى ذلك، سيقوم بتثبيت Composer وهو أداة لإدارة الحزم الخاصة بـ PHP.
2. إعداد ملف Docker Compose
الآن، نحتاج إلى إعداد docker-compose.yml لتحديد كيفية إنشاء وتشغيل حاويات متعددة مثل Nginx و MySQL بالإضافة إلى تطبيق Laravel.
قم بإنشاء ملف docker-compose.yml في نفس مجلد المشروع واكتب فيه التالي:
yamlversion: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
container_name: laravel-app
ports:
- "8000:80"
volumes:
- .:/var/www
networks:
- app-network
depends_on:
- db
environment:
- DB_HOST=db
- DB_PORT=3306
- DB_DATABASE=laravel
- DB_USERNAME=root
- DB_PASSWORD=root
nginx:
image: nginx:alpine
container_name: laravel-nginx
ports:
- "8080:80"
volumes:
- .:/var/www
- ./nginx.conf:/etc/nginx/nginx.conf
networks:
- app-network
depends_on:
- app
db:
image: mysql:5.7
container_name: laravel-db
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: laravel
volumes:
- db_data:/var/lib/mysql
networks:
- app-network
volumes:
db_data:
networks:
app-network:
driver: bridge
محتويات الملف:
-
app: يشير إلى الحاوية الخاصة بتطبيق Laravel التي تستخدم صورة PHP التي قمنا بتعريفها في الـ Dockerfile.
-
nginx: خادم الويب Nginx، حيث سيقوم بتوجيه الطلبات إلى الحاوية التي تحتوي على تطبيق Laravel.
-
db: قاعدة البيانات MySQL التي ستخدم التطبيق. يتم إنشاء قاعدة بيانات
laravelمع مستخدمroot. -
volumes: يستخدم لتخزين البيانات الخاصة بـ MySQL.
-
networks: حاويات متعددة سيتم ربطها بنفس الشبكة لتتمكن من التواصل فيما بينها.
الخطوة 3: إعداد ملف تكوين Nginx
من أجل تكوين خادم Nginx لعمله مع Laravel داخل الحاوية، نحتاج إلى ملف إعدادات Nginx. قم بإنشاء ملف باسم nginx.conf في مجلد المشروع واكتب فيه التالي:
nginxserver {
listen 80;
server_name localhost;
root /var/www/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www$document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
هذا الملف يحدد كيفية التعامل مع الطلبات على خادم Nginx، وتوجيهها إلى الحاوية التي تحتوي على تطبيق Laravel باستخدام PHP-FPM.
الخطوة 4: بناء وتشغيل الحاويات
الآن بعد أن قمت بإعداد جميع الملفات المطلوبة، يمكنك بناء وتشغيل الحاويات باستخدام Docker Compose. في الطرفية، اذهب إلى مجلد المشروع ثم قم بتشغيل الأوامر التالية:
bashdocker-compose up --build
سيقوم Docker Compose بإنشاء الحاويات بناءً على الإعدادات التي تم تحديدها في الملفات السابقة. ستتمكن من الوصول إلى تطبيق Laravel عبر المتصفح من خلال عنوان http://localhost:8080.
الخطوة 5: إعداد قاعدة البيانات
بمجرد أن يتم تشغيل الحاويات بنجاح، يمكنك إعداد قاعدة البيانات الخاصة بتطبيق Laravel باستخدام الأمر التالي:
bashdocker-compose exec app php artisan migrate
سيقوم هذا الأمر بتشغيل عملية الترحيل (migrate) لقاعدة البيانات داخل الحاوية، مما يعني أن Laravel سيقوم بإنشاء الجداول اللازمة في قاعدة بيانات MySQL.
الخطوة 6: الوصول إلى تطبيق Laravel
الآن يمكنك فتح المتصفح والوصول إلى تطبيق Laravel عن طريق الدخول إلى http://localhost:8080. إذا تم كل شيء بشكل صحيح، سترى الصفحة الرئيسية لتطبيق Laravel. كما يمكنك التفاعل مع التطبيق كما تفعل عادة في بيئة تطوير محلية.
الختام
لقد تمكنت الآن من إعداد تطبيق Laravel باستخدام Docker Compose مع Nginx و MySQL بكل سهولة. يمكن لهذه البيئة أن توفر لك العديد من الفوائد مثل سهولة النشر على الخوادم، العزل بين التطبيقات المختلفة، والتكامل السهل مع أدوات أخرى مثل Redis، Elasticsearch، وغيرها من الخدمات.
يعد Docker أحد أفضل الأدوات التي يمكن استخدامها لتحسين سير العمل في تطوير تطبيقات الويب المعقدة، ويوفر لك بيئة متكاملة تضمن التوافق بين الأنظمة وتقلل من مشاكل الإعداد.

