لماذا يستحق مشروع PHP الخاص بك استخدام Docker
\n\nهل سبق لك أن أمضيت نصف يوم في شرح كيفية إعداد البيئة لمطور جديد؟ أو واجهت موقفًا حيث يعمل الكود على localhost الخاص بك، لكنه يتعطل على الخادم؟ مألوف؟ إذن هذه المقالة لك.
Docker ليس مجرد كلمة رنانة عصرية. إنها أداة تحول عبارة "يعمل عندي" إلى "يعمل عند الجميع". بالنسبة لمطور PHP، الحاويات هي قوة خارقة: تقوم بتعبئة التطبيق، وخادم الويب، وقاعدة البيانات في حاويات خفيفة تتصرف بنفس الطريقة المضمونة على أي جهاز.
\n\nفي هذا الدليل، لن نقرأ نظرية مملة. سننتقل مباشرة إلى العمل: سنكتب Dockerfile لـ PHP، ونقوم بإعداد مجموعة Nginx + PHP-FPM + MySQL عبر Docker Compose، وننشر تطبيقًا حقيقيًا. وفويلا - مشروعك جاهز للنشر!
\n\nما هي الحاويات ولماذا يحتاجها مطور PHP؟
\n\nتخيل أنك تنتقل إلى شقة جديدة. بدلاً من تجميع الأثاث من جديد في كل مرة (تثبيت PHP، إعداد Apache، تثبيت الوحدات)، يمكنك ببساطة أخذ صندوق جاهز يحتوي على بيئتك. Docker هو هذه الصناديق. تسمى حاويات.
\n\nبالنسبة لـ PHP، هذا مهم بشكل خاص. تتغير إصدارات PHP، وتتطلب إضافات مختلفة (gd، mysqli، redis)، وفي بيئة الإنتاج يجب أن يكون كل شيء مستقرًا. الحاويات تحل ثلاث مشاكل رئيسية:
\n- \n
- قابلية التكرار - البيئة متطابقة للجميع: المطور، المختبر، الخادم. \n
- العزل - المشاريع لا تتعارض (لن يتعطل موقعك القديم أبدًا بسبب تحديث PHP). \n
- سهولة النشر - التشغيل بأمر واحد
docker-compose up. \n
تحضير Dockerfile لتطبيق PHP
\n\nلنبدأ بالأساسي - إنشاء صورة لمشروع PHP الخاص بنا. لنفترض أن لدينا تطبيقًا بسيطًا على PHP 8.2 يستخدم PDO للعمل مع MySQL. إليك شكل Dockerfile الأدنى:
# نستخدم الصورة الرسمية PHP 8.2 مع FPM\nFROM php:8.2-fpm-alpine\n\n# تثبيت حزم النظام الضرورية\nRUN apk add --no-cache \\\n nginx \\\n supervisor \\\n libpq-dev \\\n && docker-php-ext-install pdo pdo_mysql\n\n# نسخ ملفات الإعدادات (سننشئها لاحقًا)\nCOPY ./docker/nginx.conf /etc/nginx/nginx.conf\nCOPY ./docker/supervisord.conf /etc/supervisord.conf\n\n# نسخ كود التطبيق\nCOPY . /var/www/html\n\n# صلاحيات الكتابة للسجلات وذاكرة التخزين المؤقت\nRUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache\n\n# فتح المنافذ\nEXPOSE 80\n\n# تشغيل supervisor (سيدير nginx و php-fpm)\nCMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]\n\nما المهم هنا؟ نستخدم إصدار alpine - فهو أخف وزنًا بكثير. نقوم بتثبيت الإضافات الضرورية فقط عبر docker-php-ext-install. ونعم، نستخدم المشرف (supervisor) لتشغيل كل من Nginx و PHP-FPM داخل حاوية واحدة. هذا مناسب للمشاريع الصغيرة.
إنشاء إعدادات Nginx
\n\nالآن نحتاج إلى إعداد خادم الويب. قم بإنشاء ملف docker/nginx.conf:
worker_processes auto;\nevents {\n worker_connections 1024;\n}\n\nhttp {\n include /etc/nginx/mime.types;\n default_type application/octet-stream;\n\n server {\n listen 80;\n server_name _;\n root /var/www/html/public;\n index index.php index.html;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_pass 127.0.0.1:9000;\n fastcgi_index index.php;\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n include fastcgi_params;\n }\n }\n}\n\nلاحظ: PHP-FPM يستمع على المنفذ 9000 داخل الحاوية