5.3 · دوكر (Docker) لـ PHP: بيئات قابلة لإعادة الإنتاج

المستوى 5 · المستوى الاحترافي والنشر (pro & deployment)

5.3دوكر (Docker) لـ PHP: بيئات قابلة لإعادة الإنتاج

الهدف: حوسبة تطبيق PHP بالحاويات مع دوكر (Docker) (ملف Dockerfile والصور) وتنسيق الحزمة (PHP/Nginx + MySQL + ريديس (Redis)) مع دوكر كومبوز (Compose) — قابلية إعادة الإنتاج والعزل وسهولة النشر.
الوقت المقدّر: 11 دقيقة · قراءة ذاتية · إذا كان لديك 5 دقائق فقط: اقرأ «الأساسي في 30 ثانية» + المخطط.

الأساسي في 30 ثانية

  • نهاية «يعمل على جهازي»: الحاوية (container) تحمل التطبيق مع بيئته (إصدار PHP والامتدادات والإعداد) وتدور متماثلة في كل مكان.
  • الصورة (image) ← الحاوية (container): ملف Dockerfile يصف الوصفة (صورة PHP والامتدادات و Composer) وdocker build يجمّد الصورة وdocker run يشغّل الحاوية.
  • دوكر كومبوز (Compose) للحزمة: PHP + القاعدة + التخزين المؤقت موصوفة في ملف وتُشغَّل معا — انضمام بأمر واحد.

حالة مصغرة متسلسلة — رياد يحوسب في قسنطينة

متجر رياد المحسّن يدور تماما على جهازه في قسنطينة — لكنه يتعطل عند زميلته (إصدار PHP مختلف وامتداد PDO ناقص وحساسية Windows/Linux لحالة الأحرف). يكتب Dockerfile: صورة PHP وامتدادات مثبتة في الصورة واعتماديات Composer. ثم ملف Compose مع MySQL: تشغيل واحد يصعد بالحزمة كلها. تتمة الحالات 5.1-5.2 — يجعل رياد تطبيقه قابلا لإعادة الإنتاج في كل مكان.

تتمة الحالات 5.1-5.2 — يمر رياد من «عندي يعمل» إلى «متماثل في كل مكان».

1. حوسبة PHP بالحاويات: الصورة (image) والحاوية (container)

يحل دوكر (Docker) مشكلة «يعمل على جهازي» — الشائعة في PHP (الإصدارات والامتدادات والإعداد وحساسية حالة الأحرف Windows/Linux) — بتغليف التطبيق مع كل بيئته (إصدار PHP المناسب والامتدادات والإعداد والاعتماديات) في حاوية (container) معزولة ومحمولة، تدور متماثلة في كل مكان: الجهاز والزميلة والخادم والسحابة. المفاهيم: الصورة (image) (نموذج مجمَّد للتطبيق + البيئة، يعرّفه Dockerfile — الوصفة: صورة PHP قاعدة وامتدادات وشيفرة منسوخة واعتماديات Composer مثبتة في الصورة وأمر بدء) والحاوية (container) (نسخة مشغَّلة من صورة). نبني (docker build) ونشغّل (docker run). لم يعد رياد يجادل في الإصدارات: فالبيئة تسافر مع الشيفرة.

المنعكس: كل ما يخص جهازكم وغائب عن الصورة هو تعطّل مستقبلي في مكان آخر — فيجب أن تحوي الصورة كل شيء (الامتدادات ضمنا).

2. دوكر كومبوز (Compose) والفوائد

يحتاج تطبيق PHP واقعي عدة حاويات متعاونة: PHP (مع Nginx/Apache) والقاعدة (MySQL/MariaDB) وربما ريديس (Redis). يعرّف دوكر كومبوز (Compose) (docker-compose.yml) كل هذه الحاويات وعلاقاتها، مشغَّلة معا بأمر واحد (docker compose up). ملف واحد يصف الحزمة كلها، قابلة لإعادة الإنتاج متماثلة — ويصير الانضمام بديهيا: مطور جديد يشغّل أمرا فيحصل على البيئة كلها، دون تثبيت حزمة محلية ولا ضبط يدوي. الفوائد: قابلية إعادة الإنتاج (متماثلة في كل مكان) والعزل (مشاريع بإصدارات PHP مختلفة تتعايش دون تعارض) وقابلية النقل وسهولة النشر (deployment) وانضمام سريع. يضيف رياد MySQL إلى Compose: فتبدأ زميلته في دقائق.

دوكر (Docker) معيار التطوير الحديث ومهارة عابرة: تكفي الأساسيات للبدء، ويأتي التنسيق المتقدم حسب الحاجات.

3. المقدار المناسب لمطور PHP

لا حاجة لأن تصيروا خبراء بنية تحتية: استهدفوا الأساسيات المفيدة — كتابة Dockerfile بسيط لـ PHP والبناء والتشغيل وتنسيق الحزمة مع Compose ومواءمة الصورة مع الإنتاج للتطوير في البيئة نفسها كالوضع على الخط. ولتعلم PHP تكفي حزمة محلية؛ ومتى عملتم مع فريق أو أدرتم عدة مشاريع (إصدارات PHP مختلفة) أو جهزتم نشرا (deployment)، يدفع دوكر (Docker). مما يُتجنَّب: استهداف التنسيق المتقدم قبل الأساسيات، أو حوسبة سكربت تعلُّم صغير جدا دون حاجة حقيقية. يُبقي رياد Dockerfile خاصته مقروءا: كل تعليمة مفهومة خير من وصفة منسوخة.

الملمح الجيد: مطور يعرف أساسيات التشغيل — مستقل، قادر لا على الترميز فقط بل على التسليم.

خطأ شائع في الفهم: «دوكر (Docker) للنشر (deployment) فقط — والأسرار يمكن أن تذهب في Dockerfile فهو عملي». خطأ مزدوج. يخدم دوكر (Docker) منذ التطوير (بيئة متماثلة مع الفريق وانضمام فوري) لا في الإنتاج فقط. وسر في Dockerfile أو الصورة يبقى مقروءا لكل من يستلم الصورة: فالمعرفات والمفاتيح تمر عبر البيئة عند التشغيل، أبدا في الوصفة.
من الصورة (image) إلى الحاوية (container) تدور في كل مكان متماثلة Dockerfile الوصفة: PHP +الامتدادات + Composerdocker build يبني الصورة(image) (نموذج مجمَّد)docker run يشغّل حاوية(container) (نسخة)دوكر كومبوز (Compose) PHP +MySQL + ريديس (Redis) معا
تدور في كل مكان متماثلة
نص المخطط (SEO / قارئات الشاشة / الترجمة): 1) ملف Dockerfile: يكتب رياد الوصفة (صورة PHP وامتدادا PDO وأوب.كاش (OPcache) واعتماديات Composer مثبتة في الصورة). 2) البناء: تجمّد الصورة التطبيق وبيئته. 3) التشغيل: تدور الحاوية متماثلة على كل جهاز. 4) دوكر كومبوز (Compose): PHP + MySQL مشغَّلان معا بأمر واحد. الدرس: البيئة تسافر مع الشيفرة — انتهى «عندي يعمل».

هل تعلم ؟

«يعمل على جهازي» له اسم نمط مضاد: فجوة البيئة. يقضي عليها دوكر (Docker) بجعل البيئة تسافر مع الشيفرة.
الحاوية هي الآلة التي تسافر.

الصورة نفسها والسلوك نفسه — في كل مكان.

🔎 مثال ملموس — ملف Dockerfile الخاص برياد

وصفة الصورة (image) لـ PHP، مقروءة وعامة.

FROM php:8.2-apache
RUN docker-php-ext-install pdo pdo_mysql opcache
COPY . /var/www/html/
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
RUN composer install --no-dev --optimize-autoloader
# docker compose up ← PHP + MySQL معا

القراءة: لكل تعليمة دور — PHP القاعدة والامتدادات والشيفرة والاعتماديات وتحسين الإنتاج.

الدرس: الامتدادات تُثبَّت في الصورة: لا فوارق بعد بين الأجهزة.

مفردات القسم

دوكر (Docker)
أداة تغلّف التطبيق مع بيئته في حاوية (container) محمولة.

مثال بسيط: متجر رياد يدور متماثلا في قسنطينة وعند زميلته.

ما ليس كذلك: حزمة محلية مثبتة باليد على كل جهاز.

رد فعل: هل ما زال تطبيقي معتمدا على جهازي ؟

الصورة (image)
نموذج مجمَّد للتطبيق + البيئة، مبني من Dockerfile.

مثال بسيط: يبني رياد صورة مُصدَرة من كل تسليم.

ما ليس كذلك: الحاوية (container) المشغَّلة نفسها.

رد فعل: هل أستطيع إعادة بناء هذه الصورة متماثلة ؟

Dockerfile
وصفة بناء الصورة (PHP القاعدة والامتدادات والشيفرة و Composer).

مثال بسيط: وصفة مقروءة لمتجر رياد، والامتدادات ضمنا.

ما ليس كذلك: سكربت يثبّت PHP يدويا على خادم.

رد فعل: هل كل تعليمة مفهومة لا منسوخة ؟

الحاوية (container)
نسخة مشغَّلة من صورة، معزولة ومحمولة.

مثال بسيط: يشغّل رياد حاوية متماثلة في التطوير والاستقبال.

ما ليس كذلك: الصورة المجمَّدة نفسها.

رد فعل: هل يشغّل التطوير والإنتاج الصورة نفسها ؟

دوكر كومبوز (Compose)
ملف يصف عدة حاويات مشغَّلة معا.

مثال بسيط: PHP + MySQL الخاصان برياد يُبدآن بأمر واحد.

ما ليس كذلك: التنسيق المتقدم من نوع Kubernetes.

رد فعل: هل يبدأ مطور جديد بأمر واحد ؟

في التطبيق — حوسبة تطبيق PHP بالحاويات

  1. اكتبوا Dockerfile: انطلاقا من صورة PHP، وثبّتوا الامتدادات اللازمة، وانسخوا الشيفرة، وثبّتوا اعتماديات Composer.
  2. نسّقوا الحزمة مع دوكر كومبوز (Compose): ملف docker-compose.yml يعرّف PHP (مع Nginx/Apache) و MySQL وربما ريديس (Redis)، مشغَّلين معا (docker compose up).
  3. تحققوا من أن التطبيق يدور في الحاويات ويتصل بقاعدته (قابلية إعادة إنتاج البيئة).
  4. قدّروا الفوائد: العزل (إصدارات PHP لكل مشروع دون تعارض) وقابلية إعادة الإنتاج (نهاية «يعمل عندي») والانضمام (docker compose up واحد).
تحوسبون تطبيق PHP خاصتكم بالحاويات مع دوكر (Docker) (ملف Dockerfile والصور) وتنسّقون الحزمة (PHP/Nginx + MySQL + ريديس (Redis)) مع دوكر كومبوز (Compose) — قابلية إعادة إنتاج وعزل وسهولة نشر (deployment).

نص جاهز للقول — اقتراح دوكر (Docker) على الفريق

«متجرنا يعمل على جهازي لا في مكان آخر: فهي مشكلة بيئة لا شيفرة — إصدار PHP وامتداد ناقص. أقترح Dockerfile بسيطا مع Compose وقاعدة MySQL. سيشغّل كل واحد الصورة نفسها، وسيبدأ الوافد الجديد بأمر واحد. وستبقى الأسرار خارج الصورة، ممرَّرة عبر البيئة.»

يُقال في اجتماع الفريق لاعتماد الحوسبة بالحاويات دون استهداف خبرة DevOps.

نموذج للنسخ واللصق — Dockerfile لـ PHP مع Compose عامين

FROM php:8.2-apache
RUN docker-php-ext-install pdo pdo_mysql opcache
COPY . /var/www/html/
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
RUN composer install --no-dev --optimize-autoloader
# --- docker-compose.yml (حزمة عامة) ---
# services:
#   app:
#     build: .
#     ports: ["8080:80"]
#     environment:
#       - DB_HOST=db
#   db:
#     image: mysql:8.0
#     environment:
#       - MYSQL_DATABASE=boutique
#       - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db_root

فردي / ميزانية صغيرة

رياد وحده: يكفي Dockerfile بسيط دون Compose — فالصورة تجمّد بيئة PHP أصلا.

شركة صغيرة جدا / فريق مصغر

Compose مع PHP + MySQL: كل زميل يبدأ الحزمة الكاملة دون تثبيت يدوي.

شركة صغيرة ومتوسطة في قسنطينة

يشارك رياد الصورة مع الفريق في قسنطينة: يختبر الجميع النسخة نفسها، وانتهت فوارق الأجهزة.

فريق يبدأ

ثنائي: أحدهما يكتب Dockerfile والآخر يراجعه سطرا سطرا؛ والبناء مُختبَر على جهازين قبل الاعتماد.

حذر: لا تضعوا أبدا أسرارا (كلمات سر ومفاتيح ورموزا) في Dockerfile ولا في الصورة: مرروها عبر البيئة عند التشغيل. فالصورة المشترَكة تحتفظ بكل محتواها — والسر المدمج فيها يبقى مقروءا.

✓ ممارسات جيدة

  • ثبّتوا الامتدادات في الصورة (لا فوارق بعد بين الأجهزة).
  • واءموا الصورة مع الإنتاج (إصدار PHP نفسه والامتدادات نفسها).
  • استعملوا دوكر كومبوز (Compose) لتنسيق الحزمة (انضمام سريع).

✗ أخطاء شائعة

  • نسيان امتداد PHP في الصورة (يتعطل في مكان آخر لا عندكم).
  • وضع الأسرار في Dockerfile أو الصورة (مقروءة من الجميع).
  • الرغبة في إتقان التنسيق المتقدم قبل الأساسيات.

النقاط الأساسية

  • دوكر (Docker) (الحوسبة بالحاويات) يغلّف التطبيق مع بيئته (PHP والامتدادات والإعداد والاعتماديات) في حاوية (container) معزولة ومحمولة، تدور متماثلة في كل مكان — نهاية «يعمل على جهازي» (الشائعة في PHP).
  • الصورة (image) (نموذج مجمَّد، يعرّفه Dockerfile: صورة PHP + امتدادات + شيفرة + Composer) ← الحاوية (container) (نسخة مشغَّلة).
  • دوكر كومبوز (Compose) (docker-compose.yml) ينسّق حزمة PHP: عدة حاويات (PHP/Nginx + MySQL + ريديس (Redis)) مشغَّلة معا (`docker compose up`).
  • الفوائد: قابلية إعادة الإنتاج والعزل (إصدارات PHP لكل مشروع دون تعارض) وقابلية النقل وسهولة النشر (deployment) وانضمام سريع. معيار حديث (عابر نحو DevOps).

تحدي 48 ساعة — طبّق غدا

اكتبوا Dockerfile تطبيقكم (النموذج أعلاه) وشغّلوه في حاوية: هل يجيب متماثلا كما على جهازكم ؟

قائمة الخروج من القسم
  • أستطيع شرح الصورة مقابل الحاوية في جملة واحدة.
  • ملف Dockerfile خاصتي يبني صورة تدور.
  • أعرف لماذا لا تظهر فيه الأسرار.
تقييم ذاتي 1-5: هل صورتي قابلة لإعادة البناء متماثلة ؟هل سيبدأ زميل حزمتي بأمر واحد ؟

أسئلة شائعة

ماذا يقدم دوكر (Docker) لمطور PHP، وهل هو ضروري عندما تعمل حزمة محلية أصلا ؟

الحزمة المحلية مثالية للبدء: بسيطة وعاملة في دقائق — لا تعقّدوا في البداية. لكن حدودها تظهر في السياق المهني: قد تختلف البيئة عن الإنتاج (الإصدارات والامتدادات والإعداد — «يعمل محليا لا على الخط» الكلاسيكية) وإدارة عدة مشاريع بإصدارات PHP مختلفة معقدة، والبيئة ليست قابلة للمشاركة بسهولة. يقدم دوكر (Docker) قابلية إعادة الإنتاج (البيئة نفسها في كل مكان ومنها الإنتاج) والعزل (لكل مشروع حاويته دون تعارض إصدارات) وقابلية النقل وانضمام بأمر واحد. شبه لا غنى عنه في التطوير المهني — ويُتعلَّم عند العمل مع فريق أو تجهيز نشر (deployment).

دوكر (Docker) والنشر (deployment) و CI/CD... هل يجب على مطور PHP أن يصير خبير DevOps ؟

لا، ليس خبيرا — لكن معرفة الأساسيات تغيّر كل شيء: الاستقلالية (وضع عمله في الإنتاج دون اعتماد على آخرين) وقابلية التوظيف (العروض تطلب دوكر (Docker) / النشر / CI-CD) وتعاون أفضل (تطبيقات سهلة النشر) ورؤية كاملة للدورة. استهدفوا الأساسيات: الحوسبة ودوكر كومبوز (Compose) (لا التنسيق المتقدم) والنشر (deployment) على استضافة بسيطة وخط أنابيب CI/CD بسيط والأسرار والإعداد في متغيرات البيئة ومفاهيم السجلات و HTTPS. الملمح الجيد: مطور يعرف أساسيات التشغيل — قادر لا على الترميز فقط بل على التسليم.

تحقّق من فهمك

أي مشكلة يحلها دوكر (Docker) أساسا ؟

موارد إضافية (اختياري، للتعمّق أكثر)

اختبار المستوى 5أسئلة جديدة وأصعب للتحقق من مكتسباتك