Docker وPHP: حاويات التطبيقات للمطورين

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

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

ابدأ الدورة

لماذا تحتاج إلى حاويات لتطبيقات PHP باستخدام Docker؟

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



مزايا استخدام Docker مع PHP

  • قابلية تكرار البيئة: انسَ مشكلة "يعمل على جهازي".
  • العزل: كل تطبيق يعيش في حاويته الخاصة مع الإصدارات المطلوبة من PHP والمكتبات.
  • قابلية التوسع: من السهل تشغيل عدة نسخ من التطبيق باستخدام docker-compose.
  • تبسيط CI/CD: الحاويات مثالية لخطوط البناء والنشر الآلي.


إنشاء Dockerfile لتطبيق PHP

لنبدأ بالأهم — ملف Dockerfile. يصف كيفية بناء صورة تطبيق PHP الخاص بك. لنلقِ نظرة على مثال أساسي لتطبيق PHP 8.2 مع خادم ويب Apache.



# DockerfileFROM php:8.2-apache

# تثبيت إضافات PHPRUN docker-php-ext-install pdo pdo_mysql mysqli

# تفعيل mod_rewrite لـ Apache (مفيد للأطر)RUN a2enmod rewrite

# نسخ الكود المصدري للتطبيقCOPY . /var/www/html/

# تغيير المالك للحصول على صلاحيات الوصول الصحيحةRUN chown -R www-data:www-data /var/www/html

# فتح المنفذ 80EXPOSE 80


يأخذ هذا Dockerfile الصورة الرسمية لـ PHP 8.2 مع Apache، ويقوم بتثبيت برامج تشغيل MySQL، وينسخ الكود الخاص بك. بالنسبة للمشاريع الأكثر تعقيدًا، مثل Laravel أو Symfony، ستكون هناك حاجة إلى إعدادات إضافية.



مثال لـ Laravel مع Nginx و PHP-FPM

بالنسبة للأطر الحديثة، غالبًا ما يتم استخدام مجموعة Nginx + PHP-FPM. إليك مثال على Dockerfile لـ PHP-FPM:



# Dockerfile.php-fpmFROM php:8.2-fpm

# تثبيت التبعيات النظامية والإضافاتRUN apt-get update && apt-get install -y \ libpq-dev \ libzip-dev \ unzip \ git \ && docker-php-ext-install pdo pdo_mysql zip

# تثبيت ComposerCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# نسخ المشروعWORKDIR /var/wwwCOPY . .

# تثبيت تبعيات PHPRUN composer install --no-interaction --optimize-autoloader

# صلاحيات الوصول لـ LaravelRUN chown -R www-data:www-data /var/www/storage /var/www/bootstrap/cache

CMD ["php-fpm"]


وإليك تكوين Nginx، الذي يجب وضعه في حاوية منفصلة عبر docker-compose:



# default.conf (لـ Nginx)server {    listen 80;    server_name localhost;    root /var/www/public;

add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff";

index index.php;

charset utf-8;

location / { try_files $uri $uri/ /index.php?$query_string; }

location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; }

error_page 404 /index.php;

location ~ \\.php$ { fastcgi_pass php:9000; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; }

location ~ /\\.(?!well-known).* { deny all; }}


التنسيق باستخدام docker-compose

لإدارة عدة حاويات (PHP, Nginx, MySQL)، استخدم docker-compose.yml. هذه أداة قياسية للتطوير والاختبار المحلي.



# docker-compose.ymlversion: '3.8'

services: php: build: co

المدونات

توصيات الكتب