لماذا قائمة تحقق قبل الإنتاج
صُمِّم 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 بجانبه وأذونات مقيّدة. خطّط لوكيل عكسي في المقدمة. احتفظ بنسخة من ملف Compose تحت إدارة إصدارات.
الخطوات العشر المفصّلة
1. سياسة إعادة التشغيل
أضف restart: unless-stopped إلى كل خدمة.
2. الفحص الصحي
أعلن كتلة healthcheck: مع test وinterval وtimeout وretries.
3. حدود الموارد
تحت deploy.resources.limits، حدّد cpus وmemory.
4. الأسرار خارج الملف
لا تضع أبدًا كلمة مرور بنص صريح في YAML. أرجع إليها عبر env_file أو secrets:.
5. وحدات التخزين المُسمّاة
أعلن بياناتك في وحدات تخزين مُسمّاة بمشغّل صريح.
6. تدوير السجلات
أضف logging: مع driver: json-file وخيارَي max-size وmax-file.
7. عزل الشبكة
أنشئ شبكات مُسمّاة frontend وbackend وأرفق كل خدمة فقط بما تحتاجه.
8. ربط المنافذ
انشر على 127.0.0.1:8080:8080 لا 8080:8080 خلف وكيل عكسي.
9. وسوم الصور المثبّتة
استبدل latest بنسخة محددة أو بصمة.
10. ترتيب الإقلاع
استخدم depends_on مع condition: service_healthy.
إعدادات التطوير مقابل الإنتاج
| الإعداد | افتراضي التطوير | موصى به للإنتاج |
|---|---|---|
| restart | no | unless-stopped |
| healthcheck | غائب | مُعرَّف بفترة ومحاولات |
| الذاكرة | بلا حد | حد محدد |
| الأسرار | نص صريح ممكن | .env أو Docker secrets |
| وحدات التخزين | مجهولة | مُسمّاة |
| السجلات | بلا حد | max-size + max-file |
| الشبكة | الجسر الافتراضي | frontend / backend |
| المنافذ | 0.0.0.0 | 127.0.0.1 خلف وكيل |
| الصورة | latest | نسخة أو بصمة |
| depends_on | الإطلاق فقط | condition: service_healthy |
اختبر دائمًا حزمتك المقوّاة محليًا: docker compose config للتحقق من البنية، ثم محاكاة الإقلاع بـdocker compose restart.
استكشاف الأخطاء
حاوية عالقة في starting تعني فشل الفحص الصحي. خدمة تُعاد في حلقة تخفي خطأ إقلاع — راجع docker compose logs -f service. منفذ يظل قابلاً للوصول رغم 127.0.0.1 يشير لجدار حماية مفقود.
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.
إدارة أسرار Docker: تدوير دون توقّف
متغيرات البيئة بنص صريح في ملف Compose تظهر في docker inspect. آلية secrets: في Docker تحمِّل الأسرار كملفات تحت /run/secrets/. للتدوير دون توقّف: أنشئ db_password_v2 بجانب v1، حدّث الخدمة، أعد النشر، احذف v1 بعد التحقّق.
نسخ الأحجام احتياطيًا دون تلف
نسخ ملفات حجم PostgreSQL أو MySQL أثناء تشغيلها بـrsync أو tar ينتج نسخة تالفة. القاعدة: دائمًا pg_dump أو mysqldump قبل لقطة الحجم. أدوات مثل Restic وOffen Docker Backup تُنظّم هذا تلقائيًا.
الخاتمة
تحوّل هذه الإعدادات العشرة ملف Compose تطويريًا إلى حزمة إنتاجية. لا يتطلّب أي منها أداةً إضافية.