دليل عملي

Docker Compose في الإنتاج: قائمة التحقق من 10 نقاط

النشر12 دقيقةً للقراءةعدد الخطوات: 10

‏ملف ‎docker-compose‎.yml‎ الذي يعمل على حاسوبك لن ينجو من الإنتاج كما هو. إعادة التشغيل بعد الإقلاع، وحدود الموارد، والأسرار، وتدوير السجلات: كلها إعدادات غائبة افتراضيًا وتسبب أعطالًا صامتة. تجمع قائمة التحقق هذه المعايير العشرة التي يجب فحصها قبل نشر أول حزمة ‎Compose‎ على خادم ‎VPS‎، إضافة إلى أقسام عملية حول الفحوصات الصحية وإدارة الأسرار والتراجع واستكشاف الأخطاء الأكثر تكرارًا.

المحتويات· لماذا قائمة تحقق قبل الإنتاج1/12
  1. 01لماذا قائمة تحقق قبل الإنتاج
  2. 02النقاط العشر بلمحة
  3. 03المتطلبات المسبقة
  4. 04الخطوات العشر المفصَّلة
  5. 05إعدادات التطوير مقابل الإنتاج
  6. 06الفحوصات الصحية المتقدمة: مراقبة الحالة الفعلية للخدمة
  7. 07‎Docker secrets‎ بدون ‎Swarm‎: تحميل الملفات في ‎/run/secrets/
  8. 08التراجع: العودة إلى الوراء بعد نشر فاشل
  9. 09استكشاف الأخطاء: 5 أخطاء شائعة وحلولها
  10. 10‎CVE-2026-17106 (CopyEscape)‎: تحديث ‎Docker Engine‎ فورًا
  11. 11نسخ الأحجام احتياطيًا دون تلف
  12. 12الخاتمة

لماذا قائمة تحقق قبل الإنتاج

‏صُمِّم ‎Docker Compose‎ للتطوير: قيمه الافتراضية تفضِّل البساطة على المتانة. في التطوير لا تشكِّل هذه الإعدادات أي مشكلة. في الإنتاج تتحول إلى حوادث: قرص ممتلئ الساعة الثالثة فجرًا، قاعدة بيانات ضائعة بعد docker compose down، خدمة غير متاحة بعد انقطاع الكهرباء. البشرى: تقوية حزمة ‎Compose‎ لا تتطلب إعادة كتابة، بل عشر إضافات مستهدفة فحسب. مرر كل نقطة في هذه القائمة قبل الإطلاق وستصمد خدمتك أمام الأحمال وعمليات إعادة التشغيل بلا مراقبة مستمرة.

النقاط العشر بلمحة

  • ‏restart: unless-stopped — تُعاد الحاوية بعد إقلاع المضيف أو انهيارها
  • ‏healthcheck — يكتشف ‎Docker‎ حاوية عالقة ويتيح إعادة التشغيل التدريجي
  • ‏حدود المعالج والذاكرة — خدمة جامحة لا يمكنها خنق جيرانها
  • ‏الأسرار عبر ‎.env‎ أو ‎Docker secrets‎ — لا كلمة مرور بنص صريح
  • ‏وحدات تخزين مُسمَّاة — تنجو البيانات من docker compose down
  • ‏تدوير السجلات — max-size وmax-file يمنعان امتلاء القرص
  • ‏عزل الشبكة — افصل frontend وbackend
  • ‏ربط المنافذ — 127.0.0.1:PORT خلف وكيل عكسي، لا 0.0.0.0
  • ‏وسوم صور مثبَّتة — نسخة أو بصمة، لا latest
  • ‏depends_on مع شرط — service_healthy يتجنب سباقات الإقلاع

المتطلبات المسبقة

‏تأكد من امتلاك خادم ‎VPS‎ مثبَّت عليه ‎Docker Engine‎ وإضافة ‎Compose v2‎. تحقَّق من الإصدار عبر docker compose version. ضع ملفك في مجلد مشروع مخصص مع ملف ‎.env‎ بجانبه وأذونات مقيَّدة (chmod 600 .env). خطِّط لوكيل عكسي في المقدمة. احتفظ بنسخة من ملف ‎Compose‎ تحت إدارة إصدارات.

الخطوات العشر المفصَّلة

  1. 1. سياسة إعادة التشغيل

    ‏أضف restart: unless-stopped إلى كل خدمة. تُعاد الحاوية بعد انهيار أو إقلاع المضيف، لكنها تبقى موقوفة إذا أوقفتها بإرادتك. تجنَّب restart: always الذي يُعيد تشغيل حتى حاوية أردتَ إيقافها، وفضِّل unless-stopped للخدمات التطبيقية وon-failure للمهام الوقتية.

  2. 2. الفحص الصحي

    ‏أعلن كتلة healthcheck: مع test وinterval (مثلاً 30s) وtimeout (مثلاً 10s) وretries (مثلاً 3). أضف start_period: 40s للخدمات البطيئة في الإقلاع حتى لا تُعدَّ unhealthy أثناء التهيئة. يُعلِّم ‎Docker‎ الحاوية بـhealthy أو unhealthy مما يتيح لـdepends_on: condition: service_healthy انتظار الجاهزية الفعلية.

  3. 3. حدود الموارد

    ‏تحت deploy.resources.limits، حدِّد cpus وmemory (مثلاً memory: 512M). بلا حد تستطيع خدمة نازفة استهلاك كل الذاكرة وتُفعِّل قاتل OOM. أضف reservations لضمان حد أدنى عند الإقلاع.

  4. 4. الأسرار خارج الملف

    ‏لا تضع أبدًا كلمة مرور بنص صريح في YAML. أرجع إليها عبر env_file أو secrets: الذي يُحمِّل الأسرار كملفات تحت /run/secrets/ داخل الحاوية، بعيدًا عن docker inspect. أضف .env إلى .gitignore.

  5. 5. وحدات التخزين المُسمَّاة

    ‏أعلن بياناتك في وحدات تخزين مُسمَّاة بمشغِّل صريح. وحدة التخزين المسمَّاة تنجو من docker compose down؛ يمحوها فقط down -v. وثِّق كل وحدة تخزين واربطها باستراتيجية استرداد مختبَرة.

  6. 6. تدوير السجلات

    ‏أضف logging: مع driver: json-file وخياريَّي max-size وmax-file. بلا هذا تملأ سجلات حاوية ثرثارة القرص حتى العطل. طبِّقه على كل خدمة.

  7. 7. عزل الشبكة

    ‏أنشئ شبكات مُسمَّاة frontend وbackend وأرفق كل خدمة فقط بما تحتاجه. أضف internal: true على شبكة backend لمنع أي وصول من المضيف أو الإنترنت.

  8. 8. ربط المنافذ

    ‏انشر على 127.0.0.1:8080:8080 لا 8080:8080 خلف وكيل عكسي. Docker يعدِّل قواعد iptables مباشرة وقد يتجاوز UFW — ربط 127.0.0.1 هو الضمان الوحيد الموثوق.

  9. 9. وسوم الصور المثبَّتة

    ‏استبدل latest بنسخة محددة أو بصمة. استخدم pull_policy: missing لسلوك متوقع: لا يسحب Compose صورة جديدة إلا إذا كانت غائبة محليًا.

  10. 10. ترتيب الإقلاع

    ‏استخدم depends_on مع condition: service_healthy. للخدمات التي لا تدعم فحصًا صحيًا أصليًا، استخدم condition: service_started مع سكريبت انتظار مثل wait-for-it.sh.

إعدادات التطوير مقابل الإنتاج

مرّر الجدول أفقيًا

الإعدادافتراضي التطويرموصى به للإنتاج
restartnounless-stopped
healthcheckغائبمُعرَّف بفترة ومحاولات
الذاكرةبلا حدحد محدد
الأسرارنص صريح ممكن‎.env أو Docker secrets
وحدات التخزينمجهولةمُسمَّاة
السجلاتبلا حدmax-size + max-file
الشبكةالجسر الافتراضيfrontend / backend
المنافذ0.0.0.0127.0.0.1 خلف وكيل
الصورةlatestنسخة أو بصمة
depends_onالإطلاق فقطcondition: service_healthy

الفحوصات الصحية المتقدمة: مراقبة الحالة الفعلية للخدمة

‏فحص صحي جيد التهيئة يتجاوز curl البسيط: يقيس الحالة الوظيفية للخدمة لا مجرد التوافر الشبكي. لواجهة برمجية HTTP اختبر نقطة نهاية خفيفة (/health أو /ready) تُعيد 200 فقط إذا كان اتصال قاعدة البيانات قائمًا. لـ‎PostgreSQL‎ استخدم pg_isready -U postgres. لـ‎Redis‎ يكفي redis-cli ping. تحقق من حالة حاوياتك بـdocker compose ps: العمود STATUS يعرض healthy أو unhealthy أو starting. حاوية عالقة في starting لأطول من start_period تشير إلى مشكلة تهيئة — راجع docker compose logs service لمعرفة السبب. المعامل start_period مستقل عن interval: يحدد نافذة سماح لا تُحسب فيها الإخفاقات ضمن retries، وهو ضروري للخدمات التي تحتاج وقتًا للترحيل أو التعبئة.

‎Docker secrets‎ بدون ‎Swarm‎: تحميل الملفات في ‎/run/secrets/

‏منذ ‎Compose v2.24‎، يعمل آلية secrets: في وضع مستقل بدون ‎Swarm‎. أعلن سرًا في قسم secrets: بمستوى الجذر مشيرًا إلى ملف محلي (file: ./secrets/db_password.txt)، ثم أشر إليه في كل خدمة بـsecrets: [db_password]. يُحمِّل ‎Docker‎ هذا الملف قراءة فقط في /run/secrets/db_password داخل الحاوية. التطبيق يقرأ السر كملف عادي، ولا يظهر هذا المحتوى أبدًا في docker inspect ولا في متغيرات البيئة ولا في السجلات. للتدوير بدون توقف: أنشئ db_password_v2 بجانب db_password_v1، حدِّث الخدمة، أعد النشر بـdocker compose up -d --no-deps service، احذف v1 بعد التحقق.

التراجع: العودة إلى الوراء بعد نشر فاشل

‏التراجع عن حزمة ‎Compose‎ يُجهَّز قبل النشر لا بعد الحادثة. الاستراتيجية الدنيا هي الإبقاء على الصورة السابقة مُوسَمةً ومتاحة. للتراجع: عدِّل الوسم في ملف ‎Compose‎ أو في ملف .env إن كانت النسخة متغيرًا، ثم أعد تشغيل docker compose up -d. وحدات بيانات التخزين لا تتأثر بتغيير الصورة مما يجعل التراجع التطبيقي سريعًا. إذا احتاجت النسخة السابقة ترحيل مخطط عكسي، جهِّزه قبل نشر النسخة الجديدة. للنشرات الحرجة، اعتمد نظام ملفَّين: docker-compose.yml (نسخة مستقرة) وdocker-compose.override.yml (نسخة مرشَّحة) — الأمر docker compose -f docker-compose.yml up -d يعود فورًا للحالة المستقرة.

‏اختبر دائمًا حزمتك المقوَّاة محليًا: docker compose config للتحقق من البنية، ثم محاكاة الإقلاع بـdocker compose restart. تأكد أن الحاويات تعود healthy وأن البيانات تستمر بعد down يعقبه up.

استكشاف الأخطاء: 5 أخطاء شائعة وحلولها

‏network not found: بعد docker compose down تُحذف الشبكات المسمَّاة. الحل: أعلن الشبكات المشتركة بـexternal: true أو زامن إعادة تشغيل الحزم التابعة. port is already in use: عملية أخرى تشغل المنفذ. حدِّدها بـss -tlnp | grep :PORT ثم أوقفها. OOM: النواة تقتل حاوية بلا إنذار — ابحث عن OOMKilled: true في docker inspect container_id. ارفع حد الذاكرة أو حدِّد التسريب بـdocker stats. permission denied on volume: العملية تعمل بـUID لا يملك صلاحية الوصول. تحقق من UID بـdocker compose exec service id ثم عدِّل الأذونات. حاوية تُعاد في حلقة: docker compose logs --tail=50 service يكشف خطأ الإقلاع. الأسباب الشائعة: متغير بيئة مفقود، ملف إعداد غير موجود، أو تبعية غير جاهزة.

‎CVE-2026-17106 (CopyEscape)‎: تحديث ‎Docker Engine‎ فورًا

‏‎CVE-2026-17106‎، الملقَّب بـCopyEscape، هو حالة تسابق زمني في docker cp أُفصح عنها في 10 أغسطس 2026. حاوية غير موثوقة تنتج أرشيف ‎tar‎ مشوَّهًا يتبع رابطًا رمزيًا خارج الوجهة، مما يؤدي إلى كتابة ملف عشوائي على المضيف. التصحيح في ‎Docker Engine ≥ 29.7.2‎ و‎Docker Desktop ≥ 4.86.0‎.

نسخ الأحجام احتياطيًا دون تلف

‏نسخ ملفات حجم ‎PostgreSQL‎ أو ‎MySQL‎ أثناء تشغيلها بـrsync أو tar ينتج نسخة تالفة. القاعدة: دائمًا pg_dump أو mysqldump قبل لقطة الحجم. أدوات مثل ‎Restic‎ و‎Offen Docker Backup‎ تُنظِّم هذا تلقائيًا.

الخاتمة

‏تحوِّل هذه الإعدادات العشرة ملف ‎Compose‎ تطويريًا إلى حزمة إنتاجية. أقسام الفحوصات الصحية المتقدمة والأسرار المُحمَّلة كملفات والتراجع واستكشاف الأخطاء تكمل هذا الأساس وتمنحك ردود الفعل للتدخل السريع. لا يتطلَّب أي من هذه النقاط أداةً إضافية: كل شيء في ‎YAML‎ لديك بالفعل.

انشر حزمة Compose الخاصة بك في الإنتاج

‏يمنحك خادم ‎VPS ServOrbit‎ صلاحية الجذر والذاكرة والتحكم بالشبكة اللازمة لتشغيل حزمة ‎Docker Compose‎ مقوّاة.

بحاجة إلى مساعدة؟

تصفّح مركز المساعدة والأسئلة الشائعة، أو تواصل مع فريقنا — معاودة اتصال أو WhatsApp أو بريد إلكتروني. الدعم بـالعربية والفرنسية والإنجليزية.

راسلنا على WhatsAppيُفتح في علامة تبويب جديدة