Docker وPHP: حاويات التطبيقات من الألف إلى الياء
أصبحت حاويات تطبيقات PHP باستخدام Docker معيارًا في تطوير الويب الحديث. سواء كنت تنشئ صفحة هبوط بسيطة أو تطبيقًا مؤسسيًا معقدًا، يضمن Docker توحيد البيئة في جميع المراحل: من التطوير المحلي إلى الإنتاج. في هذه المقالة، سنشرح جميع مراحل إنشاء بنية Docker التحتية لتطبيق PHP — من Dockerfile الأساسي إلى مجموعة كاملة مع Nginx وMySQL.
لماذا يعتبر Docker مهمًا لمطور PHP
غالبًا ما يواجه تطوير PHP التقليدي مشكلة "يعمل على جهازي". إصدارات PHP المختلفة، الإضافات، إعدادات الخادم — كل هذا يؤدي إلى تعارضات. يحل Docker هذه المشكلة مرة واحدة وإلى الأبد:
- عزل البيئة — كل تطبيق له مجموعة التبعيات الخاصة به
- قابلية التكرار — بيئة متطابقة على جميع الأجهزة
- قابلية التوسع — سهولة إضافة خدمات جديدة (Redis، Elasticsearch)
- تكامل CI/CD — الحاويات مثالية لخطوط الأنابيب
دعنا ننتقل من النظرية إلى التطبيق وننشئ بيئة Docker كاملة لتطبيق PHP.
إنشاء Dockerfile أساسي لـ PHP
لنبدأ بالأهم — Dockerfile. هذا هو دليل بناء صورة تطبيق PHP الخاص بك. إليك التكوين الأمثل لتطبيق جاهز للإنتاج:
# نستخدم صورة PHP الرسمية مع FPMFROM php:8.2-fpm-alpine
# تثبيت تبعيات النظامRUN apk add --no-cache \ git \ unzip \ libpq-dev \ libzip-dev \ && docker-php-ext-install \ pdo_mysql \ zip \ opcache
# تثبيت ComposerCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# إعداد OPcache للإنتاجRUN { \ echo 'opcache.memory_consumption=128'; \ echo 'opcache.interned_strings_buffer=8'; \ echo 'opcache.max_accelerated_files=4000'; \ echo 'opcache.revalidate_freq=2'; \ echo 'opcache.fast_shutdown=1'; \ echo 'opcache.enable_cli=1'; \} > /usr/local/etc/php/conf.d/opcache.ini
# نسخ ملفات التطبيقWORKDIR /var/www/htmlCOPY . .
# تعيين الصلاحياتRUN chown -R www-data:www-data /var/www/html \ && chmod -R 755 storage bootstrap/cache
# تشغيل PHP-FPMCMD ["php-fpm"]
EXPOSE 9000يستخدم Dockerfile هذا Alpine Linux — صورة صغيرة تقلل بشكل كبير من حجم الحاوية النهائية. نقوم بتثبيت الإضافات الضرورية فقط: pdo_mysql للعمل مع قاعدة البيانات وzip لـ Composer.
بناء وتشغيل الحاوية
# بناء الصورةdocker build -t my-php-app .
# تشغيل الحاويةdocker run -d -p 9000:9000 --name php-app my-php-appالمجموعة الكاملة مع Nginx وMySQL عبر docker-compose
نادرًا ما يتكون التطبيق الحقيقي من حاوية PHP واحدة. نحتاج إلى خادم ويب وقاعدة بيانات. هنا يأتي دور docker-compose — أداة لتنسيق عدة حاويات.
لننشئ ملف docker-compose.yml:
version: '3.8'
services: # خدمة PHP-FPM app: build: context: . dockerfile: Dockerfile container_name: php-app volumes: - ./:/var/www/html networks: - app-network
# خادم الويب Nginx nginx: image: nginx:alpine container_name: php-nginx ports: - "8080:80" volumes: - ./:/var/www/html - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - app networks: - app-network
# قاعدة بيانات MySQL db: image: mysql:8.0 container_name: php-mysql ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: root_password MYSQL_DATABASE: app_database MYSQL_USER: app_user MYSQL_