Docker وPHP: حاويات التطبيقات المتقدمة
\n\nأصبحت الحاويات باستخدام Docker معيارًا لتطوير ونشر تطبيقات PHP. المعرفة الأساسية - تشغيل حاوية تحتوي على PHP وNginx - هي مجرد الخطوة الأولى. على المستوى المتقدم، يلزم إعداد البناء متعدد المراحل، تحسين حجم الصور، العمل مع خدمات متعددة، إدارة متغيرات البيئة، التكامل مع CI/CD وبناء بنية الخدمات المصغرة. في هذه المقالة، سنناقش التقنيات الرئيسية التي ستساعدك على رفع مستوى حاويات PHP إلى مستوى جديد.
\n\n1. البناء متعدد المراحل (Multi-stage builds) لـ PHP
\n\nيسمح البناء متعدد المراحل باستخدام عدة تعليمات FROM في ملف Dockerfile واحد. هذا مثالي لتطبيقات PHP، حيث تحتاج في مرحلة البناء إلى Composer وNode.js وأدوات أخرى، بينما يجب أن يدخل إلى الصورة النهائية فقط الملفات المترجمة ومجموعة الحد الأدنى من التبعيات.
مثال على Dockerfile لتطبيق Laravel مع البناء متعدد المراحل:
\n\n# المرحلة 1: تثبيت التبعيات والبناء\nFROM composer:2.5 AS vendor\nWORKDIR /app\nCOPY composer.json composer.lock ./\nRUN composer install --no-dev --optimize-autoloader --no-interaction\n\nFROM node:18 AS frontend\nWORKDIR /app\nCOPY package.json package-lock.json ./\nRUN npm ci --only=production\nCOPY resources/ ./resources/\nRUN npm run production\n\n# المرحلة 2: الصورة النهائية\nFROM php:8.2-fpm-alpine3.18 AS final\nWORKDIR /var/www/html\n\n# تثبيت إضافات PHP الضرورية\nRUN apk add --no-cache \\\n libpng-dev \\\n libjpeg-turbo-dev \\\n freetype-dev \\\n libzip-dev \\\n oniguruma-dev \\\n && docker-php-ext-configure gd --with-freetype --with-jpeg \\\n && docker-php-ext-install -j$(nproc) \\\n pdo_mysql \\\n mbstring \\\n gd \\\n zip \\\n opcache\n\n# نسخ الملفات الضرورية فقط من المراحل السابقة\nCOPY --from=vendor /app/vendor/ ./vendor/\nCOPY --from=frontend /app/public/build/ ./public/build/\nCOPY . .\n\n# تحسين للإنتاج\nRUN php artisan optimize\n\nEXPOSE 9000\nCMD ["php-fpm"]\n\nالمزايا الرئيسية:
\n- \n
- تحتوي الصورة النهائية على تبعيات وقت التشغيل فقط (PHP-FPM، الإضافات، الكود). \n
- لا تدخل أدوات البناء (Composer, Node.js) إلى الإنتاج. \n
- تقليل كبير في حجم الصورة (من 800-900 MB إلى 150-200 MB). \n
2. تحسين حجم صور Docker لـ PHP
\n\nالصور الصغيرة تُحمّل بشكل أسرع، وتتطلب مساحة أقل على القرص، وتقلل من سطح الهجوم. الاستراتيجيات الرئيسية:
\n\n- \n
- استخدم إصدارات alpine من الصور الأساسية. تزن
php:8.2-fpm-alpineحوالي 50 MB مقابل حوالي 400 MB للصورة القياسيةphp:8.2-fpm. \n - قلل عدد الطبقات. ادمج أوامر
RUNباستخدام&&. \n - احذف الملفات المؤقتة. بعد تثبيت الإضافات، نظف ذاكرة التخزين المؤقت:
docker-php-source deleteوapk del .build-deps. \n - استخدم
.dockerignore. استبعد.gitوnode_modulesوtestsو.envوالملفات الأخرى غير الضرورية. \n
مثال على .dockerignore متقدم:
.git\n.gitignore\n.env\n.env.example\nnode_modules\ntests\nstorage/logs/*\n!storage/logs/.gitkeep\ndocker-compose.yml\nMakefile\nREADME.md\n\n3. Docker Compose للمشاريع PHP المعقدة
\n\nللتطبيقات PHP التي تستخدم قواعد البيانات، قوائم الانتظار، ذاكرة التخزين المؤقت وخادم الويب، يصبح ملف docker-compose.yml ملف التكوين المركزي. تتضمن الإعدادات المتقدمة:
- \n
- الشبكات (networks): اعزل الخدمات (على سبيل المثال، لا ينبغي أن تكون قاعدة البيانات متاحة من الخارج). \n
- وحدات التخزين (volumes):<