مقدمة: لماذا نشر PHP في Kubernetes؟
\n\nلا يزال العديد من المطورين ينظرون إلى PHP كلغة للاستضافة "التقليدية" مع FTP و phpMyAdmin. ومع ذلك، في ثقافة DevOps الحديثة، يتم تشغيل تطبيقات PHP بشكل متزايد في حاويات، وتقع إدارتها على عاتق Kubernetes (K8s). وهذا لا يوفر فقط التوسع التلقائي وتحمل الأخطاء، بل يوفر أيضًا توحيد البيئة في جميع المراحل - من التطوير إلى الإنتاج.
في هذا الدليل، سنشرح عمليًا كيفية إعداد مشروع PHP للنشر على Kubernetes: بدءًا من إنشاء صورة Docker وحتى كتابة المانيفستات والتشغيل في المجموعة. ستتعلم كيفية جعل الحاوية خفيفة الوزن، وكيفية تكوين php-fpm بشكل صحيح، وكيفية ربط كل شيء بـ Nginx. هيا بنا!
الخطوة 1: تحضير تطبيق PHP وصورة Docker
\n\nقبل تحميل الكود إلى K8s، يجب حزمه في صورة Docker. لنفكر في مشروع PHP نموذجي بلغة PHP الخالصة (بدون إطار عمل) - برنامج نصي بسيط يعرض ترحيبًا و phpinfo.
\n\n1.1. هيكل المشروع
\n\nلننشئ هيكلًا أدنى:
\n\nmy-php-app/\n├── src/\n│ └── index.php\n├── docker/\n│ ├── php.Dockerfile\n│ └── nginx.conf\n└── k8s/\n ├── deployment.yaml\n └── service.yaml\n\n\n1.2. كود تطبيق PHP
\n\nملف src/index.php:
<?php\necho "<h1>مرحبًا، Kubernetes!</h1>";\necho "<p>إصدار PHP: " . phpversion() . "</p>";\necho "<p>الخادم: " . gethostname() . "</p>";\n?>\n\n\n1.3. Dockerfile لـ PHP-FPM
\n\nننشئ docker/php.Dockerfile:
FROM php:8.2-fpm-alpine\n\n# تثبيت التبعيات (إذا لزم الأمر)\nRUN docker-php-ext-install pdo pdo_mysql\n\n# نسخ كود التطبيق\nCOPY ./src /var/www/html\n\n# صلاحيات الوصول (مهم لـ FPM)\nRUN chown -R www-data:www-data /var/www/html\n\nWORKDIR /var/www/html\n\nEXPOSE 9000\nCMD ["php-fpm"]\n\n\nلماذا alpine؟ لأنه يعطي صورة بحجم ~30 ميجابايت بدلاً من 200+ ميجابايت على Debian. هذا أمر بالغ الأهمية للتحميل السريع في المجموعة.
1.4. تكوين Nginx
\n\nلا يستطيع PHP-FPM تقديم الملفات الثابتة مباشرة - نحتاج إلى خادم ويب. لننشئ docker/nginx.conf:
server {\n listen 80;\n server_name _;\n root /var/www/html;\n\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في Kubernetes، سنقوم بتشغيل Nginx و PHP-FPM في نفس Pod (كحاويات جانبية) أو كخدمات منفصلة. للتبسيط، سنستخدم Pod واحد مع حاويتين.
\n\nالخطوة 2: بناء الصور ونشرها
\n\nسنقوم ببناء صورة PHP-FPM وصورة Nginx مع التكوين الخاص بنا. في مشروع حقيقي، يمكن استخدام صورة واحدة تجمع Nginx و PHP في supervisord، لكننا سنفعلها "بشكل صحيح" - سنفصل بينهما.
بناء صورة PHP:
\ndocker build -t my-php-app:latest -f docker/php.Dockerfile .\n\n\nبناء صورة Nginx:
\nسننشئ Dockerfile منفصل لـ Nginx:
\nFROM nginx:alpine\nCOPY docker/nginx.conf /etc/nginx/conf.d/default.conf\nCOPY ./src /var/www/html\n\n\ndocker build -t my-nginx:latest -f docker/nginx.Dockerfile .\n\n\nثم قم بتحميل الصور إلى السجل (Docker Hub، GitLab Container Registry، إلخ):
\ndocker tag my-php-app:latest your-registry/my-php-app:latest\ndocker push your-registry/my-php-app:latest\n\n\nالخطوة 3: مانيفستات Kubernetes
\n\nالآن الجزء الأكثر إثارة - سنصف كيف سيقوم Kubernetes بتشغيل تطبيقنا.
\n\n