Docker و PHP: حاويات التطبيقات على مستوى متقدم
لم تعد حاويات تطبيقات PHP باستخدام Docker مجرد أداة ملائمة للتطوير. على المستوى المتقدم، هي المفتاح لإنشاء بيئات قابلة للتوسع وآمنة وقابلة للتكرار. في هذه المقالة، سنستعرض التقنيات التي ستساعدك على الانتقال من التشغيل الأساسي لحاوية PHP إلى التنسيق الاحترافي: البناء متعدد المراحل، تحسين الصور، العمل مع Docker Compose للهندسة المعمارية للخدمات المصغرة، والتخزين المؤقت المتقدم.
1. البناء متعدد المراحل: صورة نهائية صغيرة الحجم
إحدى المشاكل الرئيسية لصور Docker القياسية هي حجمها. الصورة الأساسية php:8.2-apache تزن أكثر من 400 ميجابايت، ومع تثبيت الإضافات تصل إلى 600+. هذا غير مقبول للإنتاج: الصورة الكبيرة تبطئ التحميل، وتشغل مساحة في السجل، وتزيد من سطح الهجوم.
البناء متعدد المراحل (multi-stage build) يسمح بتقسيم العملية إلى مراحل: الأولى للتجميع وتثبيت التبعيات (مع مجموعة كاملة من الأدوات)، والثانية لبيئة التشغيل الصغرى. تحتوي الصورة النهائية فقط على القطع المترجمة والمكتبات الضرورية.
مثال على Dockerfile لتطبيق Laravel:
# المرحلة 1: التجميع وتثبيت التبعياتFROM composer:latest AS vendorWORKDIR /appCOPY composer.json composer.lock ./RUN composer install --no-dev --optimize-autoloader --no-interaction
# المرحلة 2: تجميع موارد Node (إذا كان هناك واجهة أمامية)FROM node:18-alpine AS frontendWORKDIR /appCOPY package.json package-lock.json ./RUN npm ci --productionCOPY resources/ ./resources/RUN npm run production
# المرحلة 3: صورة PHP النهائيةFROM php:8.2-fpm-alpine AS productionRUN docker-php-ext-install pdo_mysql opcacheCOPY --from=vendor /app/vendor /var/www/html/vendorCOPY --from=frontend /app/public/build /var/www/html/public/buildCOPY . /var/www/html
RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cacheEXPOSE 9000CMD ["php-fpm"]هذا النهج يقلل حجم الصورة من 500+ ميجابايت إلى حوالي 120 ميجابايت. يتم استخدام composer:latest و node:18-alpine فقط في مراحل البناء ولا يدخلان في الطبقة النهائية.
2. تحسين التخزين المؤقت لطبقات Docker
كل تعليمة في Dockerfile تنشئ طبقة. لتسريع عمليات البناء المتكررة، يجب وضع الطبقات التي نادراً ما تتغير في أقرب وقت ممكن. بالنسبة لمشروع PHP، هذا يعني:
- نسخ
composer.jsonوcomposer.lockقبل نسخ الكود. - تشغيل
composer installقبل نسخ المصادر. - نسخ الكود في النهاية.
مثال على ترتيب محسن للتعليمات:
FROM php:8.2-fpm-alpine AS baseWORKDIR /var/www/html
# تثبيت تبعيات النظام مرة واحدةRUN apk add --no-cache $PHPIZE_DEPS \ && docker-php-ext-install pdo_mysql opcache bcmath
# نسخ ملفات التبعيات فقطCOPY composer.json composer.lock ./RUN composer install --no-dev --no-interaction --no-scripts --prefer-dist
# نسخ باقي الكودCOPY . .
# إنشاء autoload وتحسينهRUN composer dump-autoload --optimizeنصيحة: استخدم .dockerignore لاستبعاد vendor و .git و node_modules والملفات المؤقتة الأخرى من سياق البناء. هذا يسرع نقل السياق إلى برنامج Docker الخفي.
3. Docker Compose للهندسة المعمارية للخدمات المصغرة
نادراً ما تتكون تطبيقات PHP الحديثة من خدمة واحدة. تتضمن الهندسة المعمارية النموذجية PHP-FPM و Nginx و Redis وقائمة انتظار المهام (RabbitMQ/Beanstalkd) وقاعدة بيانات. يسمح Docker Compose بوصف البنية التحتية بأكملها في ملف docker-compose.yml واحد.
مثال على تكوين لخدمة مصغرة على PHP:
version: '3.8'services: app: build: context: . target: production