Docker / Compose وعقود التشغيل الموثوقة / الدرس 9
فحوص الصحة والجاهزية وبدء الاعتماديات
حدد ما يثبته الفحص ولا تخلط ترتيب البدء مع إتاحة التطبيق المستمرة.
في هذه الصفحة
أهداف الدرس
- ميّز حالات التشغيل والصحة والجاهزية والوصول الخارجي.
- صمم فحوصاً محدودة وتعافياً للاعتماديات بدلاً من انتظار ثابت.
الصحة اختبار معلن لا حقيقة شاملة
قد تعمل العملية دون تقديم عمل مفيد. يعطي فحص الصحة المحرك نتيجة أمر محدد، ويتوقف معناها على ذلك الأمر. تسأل الجاهزية هل ينبغي أن تتلقى الخدمة الحركة الآن. يثبت وجود Python أقل مما يثبته طلب HTTP، ولا يثبت أي منهما تلقائياً صلاحيات القاعدة أو صحة العمل أو التوجيه الخارجي.
اجعل الفحص قابلاً للتنفيذ ومحدوداً
يتضمن المثال Python و urllib، فلا يحتاج افتراض وجود curl في صورة مصغرة. يفحص الطلب المحلي المستمع ومسار الاستجابة. يجيب المثال عن كل GET بنجاح، لذا فهو فحص HTTP محلي فقط. تحتاج فحوص الإنتاج إلى عقد للاعتماديات والمهلات واستجابات آمنة قليلة التكلفة دون تغيير الحالة.
services:
api:
image: parcel-api:lab
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8080/health', timeout=2).read()"]
interval: 10s
timeout: 3s
retries: 3
start_period: 5s
ينجح الأمر إذا اكتمل الطلب دون استثناء ضمن الحدود. ولا يفحص نشر المضيف عند 18080. تغير start_period احتساب الإخفاقات المبكرة ولا تضمن اكتمال البدء بعد خمس ثوان بالضبط. لا ندعي حالة صحية دون تشغيل.
ينطبق ترتيب الاعتماديات على انتقالات محددة
يمكن أن تنتظر Compose اعتماداً بحالة service_healthy قبل بدء التابع. يحدد الاعتماد البسيط ترتيب البدء لا الجاهزية الكاملة. ولا تلغي الشروط إعادة الاتصال إذا فشل الاعتماد لاحقاً أو استُبدل. لا تضمن قاعدة سليمة في لحظة نجاح كل الاستعلامات التالية، وقد يحتاج التابع إلى تعاف دون إعادة إنشائه.
services:
api:
image: parcel-api:lab
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8080/health', timeout=2).read()"]
interval: 10s
timeout: 3s
retries: 3
client:
image: python:3.13-slim
depends_on:
api:
condition: service_healthy
command: ["python", "-c", "import urllib.request; print(urllib.request.urlopen('http://api:8080/', timeout=2).read().decode().strip())"]
Conditional client output: parcel-api
إذا أصبحت API سليمة وظلت متاحة للطلب، يطبع العميل parcel-api ويخرج بنجاح. هذه نتيجة شرطية من المثال لا نشر مشاهد. وقد يفشل الطلب لاحقاً بسبب الشبكة؛ فالانتظار ليس معاملة أو ضمان إتاحة دائمة.
تجنب فحوصاً تسبب الحادثة
قد ترهق الاستعلامات الثقيلة والفحوص المتزامنة خدمة متعثرة. استخدم طلباً صغيراً بمهلة أقصر من المهلة الخارجية واختر التكرار من أهداف التعافي. قرر هل غياب الاعتماد يفقد الجاهزية أو يخفض الخدمة فقط. قد تسبب الفحوص الصارمة عواصف إعادة لدى مشرفين يعيدون غير السليم؛ وحالة Docker وحدها ليست إجراء إعادة عاماً.
راقب الانتقالات والسلوك الخارجي
اقرأ تاريخ الصحة ورمز الفحص وسجلات التطبيق وقارن بطلب من شبكة المستهلك الفعلي. قد يتزامن فحص داخلي أخضر مع منفذ خاطئ أو مشكلة شهادة أو مسار حافة مفقود. راقب مدة البدء وتقلب الجاهزية تحت حمل واقعي، واختبر انقطاع الاعتماد وتعافيه لا أول طلب ناجح فقط.
الأخطاء الشائعة وإصلاحها
Health check fails because curl is not found.
- لماذا يحدث؟
- افترض الفحص أداة غير موجودة في الصورة.
- كيف تصلحه؟
- استخدم عميلاً متاحاً أو أضف أداة مدروسة.
- كيف تتجنب تكراره؟
- تحقق من اعتماديات الفحص في الصورة النهائية.
حاوية سليمة لا يمكن الوصول إليها من المضيف.
- لماذا يحدث؟
- لم يفحص الاختبار المحلي النشر أو مسار الطلب الخارجي.
- كيف تصلحه؟
- افحص مسار المستهلك مستقلاً عن الصحة الداخلية.
- كيف تتجنب تكراره؟
- حدد الحد الذي يغطيه كل فحص.
يفشل التابع بعد إعادة تشغيل اعتماده.
- لماذا يحدث؟
- اعتُبر انتظار البدء تعافياً دائماً للاتصال.
- كيف تصلحه؟
- أضف إعادة اتصال ومحاولات محدودة تناسب العملية.
- كيف تتجنب تكراره؟
- تدرب على فشل الاعتماد أثناء العمل وتعافيه.
اختبر فهمك
1. هل تثبت service_healthy إمكان تثبيت شراء لاحق؟
اعرض الحل المشروح
لا؛ تثبت تحقق شرط الصحة عند بوابة البدء. للشراء متطلبات مصادقة وبيانات ومعاملات واعتماديات مستقلة. يجب فحصها والتعافي منها دون تحويل نجاح فحص سابق إلى ضمان تجاري.
2. لماذا يكون sleep ثابت أضعف من شرط جاهزية محدود؟
اعرض الحل المشروح
تتغير مدة التهيئة مع الحمل والتعافي، وقد يطول الانتظار أو ينقص. يراقب الشرط المحدود السلوك المطلوب ويفشل بدليل مفيد عند المهلة، مع تجنب إعادة لا نهائية أو إرهاق الاعتماد.
أهم ما تعلمته
- الصحة والجاهزية وترتيب البدء والوصول الخارجي أمور مختلفة.
- افحص بتكلفة صغيرة وحد الانتظار وصمم تعافي التطبيق المستمر.