4.2الموثوقية : فحص الصحة (healthcheck) وسياسات إعادة التشغيل (restart policies)
الأساسي في 30 ثانية
- إعادة التشغيل (restart) تُحيي، وفحص الصحة (healthcheck) يُثبت : سياسة إعادة التشغيل تعيد تشغيل الحاوية بعد عطل أو إعادة إقلاع ؛ واختبار الصحة الدوري يقول إن كانت الخدمة جاهزة فعلا (وليست منطلقة فقط).
- depends_on ترتب، وcondition: service_healthy تنتظر الجاهزية الحقيقية : دون شرط، ترتيب الإقلاع مجرد أمل — ومع فحص صحة على القاعدة، لا تنطلق الواجهة إلا على مثبت سلامته.
- منعكس إدير : unless-stopped افتراضيا (يحترم الإيقافات الطوعية)، وUp ليست healthy : فخدمة Up لكن unhealthy مريضة تُعالَج، وليست خدمة تدور.
حالة مصغرة متواصلة — إدير ينهي أعطال صباح الاثنين
إدير، مهندس devops مبتدئ في الجزائر، يُوقَظ : بعد انقطاع كهرباء، الواجهة منطلقة لكن القاعدة لم تكن جاهزة — أعطال متسلسلة. فيضيف restart: unless-stopped لكل خدمة دائمة، وفحص صحة pg_isready على القاعدة، ويجعل الواجهة معتمدة على service_healthy. ثم يقتل القاعدة للتحقق : إعادة تشغيل تلقائية وانتظار مثبت. ثاني محطة في الخيط الرابط : المكدس يعيد الإقلاع وحده ولا يوجه إلا نحو مثبت سلامته.
تتمة حالة 4.1 — الصورة التي نشرها إدير تدور الآن باستقلالية.
1. إعادة التشغيل (restart) : سياسة الإحياء
restart: unless-stopped يعيد تشغيل الحاوية بعد عطل أو إعادة إقلاع الآلة، إلا الإيقاف الطوعي — الافتراضي الصحيح لخدمة دائمة. وalways يعيد التشغيل حتى بعد إيقاف يدوي (للخدمات الحرجة فقط)، وon-failure لا يعيد إلا عند خطأ. ودون سياسة، كما قبل إصلاح إدير، ينتظر عطل الليل الصباح.
اختاروا حسب القصد : دائمة (unless-stopped)، وحرجة يجب ألا تتوقف أبدا (always)، ومهمة لا تعود إلا عند الفشل (on-failure). وتفادوا always في كل مكان : فهو يعيد التشغيل حتى بعد إيقافاتكم الطوعية.
2. فحص الصحة (healthcheck) : « جاهز » خير من « منطلق »
depends_on ترتب، وفحص الصحة (healthcheck) يُثبت : أمر يُختبر دوريا (pg_isready لأجل Postgres، وطلب HTTP لأجل واجهة) يمرر الخدمة إلى healthy. ويمكن عندها انتظار الجاهزية الحقيقية (condition: service_healthy) بدلا من الأمل بأن القاعدة أنهت الإقلاع.
ويجب أن يستهدف الاختبار الخدمة الحقيقية (طلبا، وليس مجرد وجود العملية) : فهذا ما يُزيل أعطال الإقلاع « القاعدة غير جاهزة » لدى إدير.
3. ثلاث حالات، وثلاث ردود
starting (ننتظر)، وhealthy (نوجه)، وunhealthy (ننبه، ولا نرسل حركة بعد). ويعرض docker compose ps الحالة : فخدمة Up لكن unhealthy مريضة تُعالَج (السجلات، والتشخيص)، وليست خدمة تدور.
اضبطوا التواتر باعتدال : كافيا للرصد (10 إلى 30 ثانية)، مع محاولات مكررة لتفادي الإنذارات الكاذبة. فاختبار عدواني جدا يُشير بلا توقف ؛ ونادر جدا، يفوّت الأعطال.
هل تعلم ؟
Up هي النبض ؛ وhealthy هي اللياقة.
🔎 مثال ملموس — 🔎 مثال ملموس — Postgres تثبت صحتها
مكدس إدير : لا تنطلق الواجهة إلا على قاعدة مثبتة الجاهزية.
services:
bdd:
image: postgres:16.4
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app"]
interval: 10s
retries: 5
api:
build: ./api
depends_on:
bdd:
condition: service_healthy
القراءة : لا تنطلق الواجهة إلا على قاعدة مثبتة الجاهزية.
الدرس : تختفي أعطال الإقلاع « القاعدة غير جاهزة ».
مفردات القسم
- إعادة التشغيل (restart)
- سياسة إعادة التشغيل التلقائية للحاوية : no وon-failure وalways وunless-stopped.
مثال بسيط: يضع إدير unless-stopped : إعادة تشغيل بعد عطل أو إقلاع، لكن مع احترام إيقافه اليدوي.
ما ليس كذلك: إعادة تشغيل يدوية عند 3 صباحا بعد كل عطل.
رد فعل: لخدمة دائمة : صرحوا بسياسة restart.
- فحص الصحة (healthcheck)
- اختبار دوري يثبت الصحة الحقيقية للخدمة (طلب، وليس مجرد عملية).
مثال بسيط: يثبت pg_isready أن قاعدة إدير تقبل الاتصالات فعلا.
ما ليس كذلك: مجرد ترتيب انطلاق دون تحقق.
رد فعل: لاعتماد حرج : اختبروا الخدمة الحقيقية.
- healthy / unhealthy
- حالة سليمة أو مريضة حسب آخر اختبار صحة — مستقلة عن دوران العملية.
مثال بسيط: قاعدة إدير Up لكن unhealthy : يشخص بدلا من التوجيه.
ما ليس كذلك: مجرد شغال أو متوقف.
رد فعل: Up + unhealthy : عالجوا، ولا توجهوا.
- condition: service_healthy
- في depends_on : انتظار أن تثبت سلامة الاعتماد قبل الانطلاق.
مثال بسيط: تنتظر واجهة إدير القاعدة healthy بدلا من الأمل.
ما ليس كذلك: ترتيب انطلاق دون ضمان توفر.
رد فعل: لإقلاع مرتب : اشترطوا الشرط، وليس الترتيب فقط.
في التطبيق — عمليا — جعل مكدسكم مستقلا
- أضيفوا restart: unless-stopped لكل خدمة دائمة.
- أضيفوا فحص صحة للقاعدة (pg_isready).
- اجعلوا الواجهة معتمدة على service_healthy.
- اقتلوا القاعدة (kill) : وراقبوا إعادة التشغيل + الانتظار المثبت.
نص جاهز للقول — شرح جعل الموثوقية للفريق (30 ثانية)
« معكم إدير : كل خدمة دائمة تعيد التشغيل وحدها بعد عطل، والقاعدة تثبت جاهزيتها باختبار حقيقي، والواجهة تنتظر هذا الإثبات قبل الانطلاق. انتهت الاستيقاظات بعد انقطاع : المكدس ينهض وحده. »
يُقال في المراجعة : اعرضوا اختبار قتل القاعدة أمام الفريق.
نموذج للنسخ واللصق — قاعدة مثبتة + واجهة تنتظر (Compose)
services:
bdd:
image: postgres:16.4
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app"]
interval: 10s
timeout: 5s
retries: 5
api:
build: ./api
restart: unless-stopped
depends_on:
bdd:
condition: service_healthy
واجهة ويب تُختبر بـ HTTP
مثل إدير لكن باختبار طلب ويب على الصفحة الرئيسية : تكون الخدمة healthy عندما ترد فعلا.
خدمة حرجة 24/7
restart: always مفترض وموثق : فحتى الإيقاف اليدوي يعيد التشغيل — للحالات الحرجة فعلا فقط.
مهمة ظرفية
restart: on-failure : لا نعيد إلا عند خطأ، وليس بعد نجاح عادي.
شعور زائف بالأمان
depends_on دون شرط + اختبار يستهدف الحاوية الخطأ : صححوا نحو service_healthy واختبار حقيقي.
✓ ممارسات جيدة
- unless-stopped افتراضيا في الدائم.
- اختبروا الخدمة الحقيقية (طلب، وليس PID).
- اقرءوا حالة الصحة في compose ps.
✗ أخطاء شائعة
- always في كل مكان (يعيد حتى بعد إيقافاتكم).
- depends_on دون شرط (شعور زائف).
- فحص صحة يختبر الحاوية الخطأ.
النقاط الأساسية
- إعادة التشغيل تُحيي، وفحص الصحة يُثبت.
- depends_on + شرط = ترتيب حقيقي.
- Up ليست healthy.
- unless-stopped : الافتراضي الصحيح.
تحدي 48 ساعة — طبّق غدا
على مكدسكم الحقيقي : أضيفوا unless-stopped + فحص صحة + شرط، واقتلوا القاعدة وراقبوا إعادة التشغيل والانتظار المثبت.
- أستطيع التصريح بسياسة إعادة تشغيل مناسبة.
- أستطيع كتابة فحص صحة يثبت الجاهزية الحقيقية.
- أستطيع جعل الانتظار على service_healthy وقراءة الحالة.
أسئلة شائعة
فحص صحة أم مجرد محاولات جديدة في التطبيق ؟
كلاهما : المحاولات الجديدة تجعل التطبيق متينا في كل مكان، وفحص الصحة يجعل المكدس قابلا للرصد والجدولة. حليفان، وليسا متنافسين.
أي تواتر للاختبار ؟
كافيا للرصد (10 إلى 30 ثانية)، مع محاولات مكررة لتفادي الإنذارات الكاذبة. فاختبار عدواني جدا يُشير بلا توقف ؛ ونادر جدا، يفوّت الأعطال.
خدمة « Up (unhealthy) ». ماذا نفهم ؟