نشر PHP على Kubernetes: دليل عملي خطوة بخطوة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا نشر PHP في Kubernetes؟

\n\n

لا يزال العديد من المطورين ينظرون إلى PHP كلغة للاستضافة "التقليدية" مع FTP و phpMyAdmin. ومع ذلك، في ثقافة DevOps الحديثة، يتم تشغيل تطبيقات PHP بشكل متزايد في حاويات، وتقع إدارتها على عاتق Kubernetes (K8s). وهذا لا يوفر فقط التوسع التلقائي وتحمل الأخطاء، بل يوفر أيضًا توحيد البيئة في جميع المراحل - من التطوير إلى الإنتاج.

\n\n

في هذا الدليل، سنشرح عمليًا كيفية إعداد مشروع PHP للنشر على Kubernetes: بدءًا من إنشاء صورة Docker وحتى كتابة المانيفستات والتشغيل في المجموعة. ستتعلم كيفية جعل الحاوية خفيفة الوزن، وكيفية تكوين php-fpm بشكل صحيح، وكيفية ربط كل شيء بـ Nginx. هيا بنا!

\n\n

الخطوة 1: تحضير تطبيق PHP وصورة Docker

\n\n

قبل تحميل الكود إلى K8s، يجب حزمه في صورة Docker. لنفكر في مشروع PHP نموذجي بلغة PHP الخالصة (بدون إطار عمل) - برنامج نصي بسيط يعرض ترحيبًا و phpinfo.

\n\n

1.1. هيكل المشروع

\n\n

لننشئ هيكلًا أدنى:

\n\n
my-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\n

1.2. كود تطبيق PHP

\n\n

ملف src/index.php:

\n\n
<?php\necho "<h1>مرحبًا، Kubernetes!</h1>";\necho "<p>إصدار PHP: " . phpversion() . "</p>";\necho "<p>الخادم: " . gethostname() . "</p>";\n?>\n
\n\n

1.3. Dockerfile لـ PHP-FPM

\n\n

ننشئ docker/php.Dockerfile:

\n\n
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. هذا أمر بالغ الأهمية للتحميل السريع في المجموعة.

\n\n

1.4. تكوين Nginx

\n\n

لا يستطيع PHP-FPM تقديم الملفات الثابتة مباشرة - نحتاج إلى خادم ويب. لننشئ docker/nginx.conf:

\n\n
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، لكننا سنفعلها "بشكل صحيح" - سنفصل بينهما.

\n\n

بناء صورة PHP:

\n
docker build -t my-php-app:latest -f docker/php.Dockerfile .\n
\n\n

بناء صورة Nginx:

\n

سننشئ Dockerfile منفصل لـ Nginx:

\n
FROM nginx:alpine\nCOPY docker/nginx.conf /etc/nginx/conf.d/default.conf\nCOPY ./src /var/www/html\n
\n\n
docker build -t my-nginx:latest -f docker/nginx.Dockerfile .\n
\n\n

ثم قم بتحميل الصور إلى السجل (Docker Hub، GitLab Container Registry، إلخ):

\n
docker 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

3.1. Deployment (المانيفست الرئيسي

المدونات

توصيات الكتب