لماذا يجب على كل مطور PHP إتقان Docker؟
\n\nهل سبق لك أن واجهت موقفًا حيث يعمل كل شيء محليًا بشكل مثالي، ولكن على الخادم تحصل على "شاشة الموت البيضاء"؟ أو ما هو أسوأ، عندما يقول زميلك: "كل شيء يعمل لدي، قم بتحديث composer" - ويتحول مشروعك إلى يقطينة؟ مألوف؟ إذن مرحبًا بك في عالم حاويات تطبيقات PHP باستخدام Docker.
\n\nDocker ليس مجرد كلمة طنانة عصرية. إنها أداة ستغير إلى الأبد طريقة تعاملك مع التطوير. تخيل: لم تعد تقضي ساعات في إعداد البيئة. لا حاجة لتثبيت XAMPP أو OpenServer أو المعاناة مع إصدارات PHP. أمر واحد docker-compose up - وتطبيقك يعيش في عالم معزول ويمكن التنبؤ به. ويمكن مشاركة هذا العالم مع زميل، أو رفعه إلى الخادم، أو حتى بيعه للعميل. في هذه المقالة، سنشرح حاويات تطبيقات PHP من الألف إلى الياء: من Dockerfile الأساسي إلى تحسين الإنتاج.
ما هي الحاويات ولماذا هي مهمة لـ PHP؟
\n\nالحاويات هي طريقة لتغليف التطبيق مع جميع تبعياته (PHP، الإضافات، خادم الويب، قاعدة البيانات) في بيئة معزولة - حاوية. على عكس الأجهزة الافتراضية، الحاويات خفيفة الوزن، وتُشغل في ثوانٍ، وتستهلك الحد الأدنى من الموارد.
\n\nبالنسبة لـ PHP، هذا مهم بشكل خاص. لماذا؟ لأن تطبيق PHP النموذجي هو مزيج من: PHP-FPM، Nginx أو Apache، MySQL/PostgreSQL، Redis، قائمة المهام. الإعداد اليدوي لهذا النظام البيئي على كل جهاز هو كابوس. ولكن مع Docker، تصف البنية التحتية بأكملها في كود (البنية التحتية ككود) وتعيد إنتاجها بأمر واحد.
\n\nالمزايا الرئيسية للحاويات لمطور PHP:
\n- \n
- توحيد البيئات: البيئة المحلية = بيئة الاختبار = بيئة الإنتاج. انسَ عبارة "إنها تعمل لدي". \n
- عزل التبعيات: مشروع على PHP 7.4 يتعايش بسلام مع مشروع على PHP 8.3 على نفس جهاز المضيف. \n
- نشر سريع: يكفي دفع الصورة إلى السجل وتحديث الحاوية على الخادم. \n
- قابلية التوسع: من السهل إضافة حاوية أخرى مع PHP-FPM تحت الحمل. \n
إنشاء أول Dockerfile لتطبيق PHP
\n\nلنبدأ بالأهم - Dockerfile. هذه هي تعليمات بناء صورة تطبيقك. لنفترض أن لدينا تطبيق PHP بسيط على Laravel أو Symfony (المبدأ هو نفسه لأي إطار عمل).
# نستخدم الصورة الرسمية PHP 8.2 مع FPM\nFROM php:8.2-fpm-alpine\n\n# تثبيت تبعيات النظام\nRUN apk add --no-cache \\\n nginx \\\n supervisor \\\n libpng-dev \\\n libjpeg-turbo-dev \\\n freetype-dev \\\n && docker-php-ext-configure gd --with-freetype --with-jpeg \\\n && docker-php-ext-install -j$(nproc) pdo_mysql gd opcache\n\n# نسخ ملفات الإعدادات\nCOPY ./docker/nginx.conf /etc/nginx/http.d/default.conf\nCOPY ./docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf\nCOPY ./docker/php.ini /usr/local/etc/php/conf.d/custom.ini\n\n# تثبيت Composer\nCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer\n\n# نسخ كود المصدر للتطبيق\nCOPY . /var/www/html\nWORKDIR /var/www/html\n\n# تثبيت تبعيات PHP\nRUN composer install --no-dev --optimize-autoloader\n\n# صلاحيات الوصول\nRUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache\n\nEXPOSE 80\n\nCMD ["supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]\n\nشرح تفصيلي:
\n- \n
FROM php:8.2-fpm-alpine- نأخذ صورة خفيفة مبنية على Alpine Linux. وزنها حوالي 50 ميجابايت بدلاً من 200+ ميجابايت للصور المكتبية. \n docker-php-ext-install- الأمر السحري لتثبيت إضافات PHP مباشرة داخل الحاوية. \n COPY --from=composer:latest- بناء متعدد المراحل. نأخذ الملف الثنائي الجاهز لـ Composer من الصورة الرسمية، دون تثبيت PHP بشكل منفصل.