غلّف الخزنة لتعمل بالمثل في أيّ مكان — قاتلًا «يعمل على جهازي» نهائيًّا.
الوحدة 8 · Docker وCompose، عبورًا إلى مختبر DevOps.
متوسّط الحاويات يتضمّن مختبرًا ~50 دقيقة.dockerignore وصورٍ أساسٍ صغيرةالمتطلبات المسبقة: الوحدة 7، وDocker Desktop مثبَّت. تعبر هذه الوحدة إلى وحدتَي مختبر DevOps: Docker وCompose.
موطن الفشل رقم 6: «يعمل على جهازي». يعمل تطبيقك لديك لأن حاسوبك فيه إصدار Node الصحيح والحزم الصحيحة والبيئة الصحيحة. الحاوية تغلّف التطبيق مع كل ذلك — صندوقٌ محكم يعمل بالمثل على جهازك وجهاز زميلك ومُشغّل CI وخادم الإنتاج.
| المصطلح | المعنى المبسّط |
|---|---|
| الصورة (Image) | مخطّط: تطبيقك + بيئة تشغيله + اعتمادياته، مجمّدةً. |
| الحاوية | نسخةٌ عاملة من صورة — آلةٌ مصغّرةٌ معزولة. |
| Dockerfile | الوصفة التي تبني الصورة، خطوةً خطوة. |
ما إن تصير الخزنة حاويةً حتى تسهل كل خطوةٍ لاحقة: CI يبني الصورة ذاتها، والنشر يشغّلها فحسب. الحوسبة في حاوياتٍ هي المفصل بين «مشروعي» و«منتجٍ قابل للشحن».
كل تطبيقٍ في monorepo يأخذ Dockerfile خاصًّا به. وهذا الشكل لـAPI بـNestJS — سيملأ المساعد التفاصيل:
ملف .dockerignore (كـ.gitignore) يُبقي node_modules والأسرار خارج الصورة، فتصير عمليات البناء أسرع وأأمن.
استخدم أساسًا صغيرًا (-alpine)، وثبّت اعتماديات الإنتاج فقط في الصورة النهائية، ولا تخبز أسرار .env فيها أبدًا. اطلب من المساعد بناءً متعدّد المراحل إن كبرت الصورة — وراجعه كأيّ تغييرٍ آخر.
الخزنة تطبيقان (ولاحقًا قاعدة بيانات). Docker Compose يصفها في ملفٍ واحد ويبدؤها معًا بأمرٍ واحد — مشبوكةً كي يستطيع web التحدّث إلى api.
وحدة Compose في مختبر DevOps تمشي الفكرة ذاتها بعمق (تطبيق + قاعدة بيانات + مراقبة). نعيد استخدامها هنا كي لا تتعلّم Compose مرّتين.
تطبيقٌ محوسبٌ في حاويةٍ قابلٌ للنشر أينما تعمل الحاويات — جهازٌ افتراضي، Kubernetes، مضيفٌ مُدار. هذا أساس الوحدات الثلاث الأخيرة: CI يبني الصورة، والنشر يشغّلها، والمراقبة تراقبها. كل ما بعده يفترض وجود هذا الصندوق.
ستضيف Dockerfile لكل تطبيق وملف Compose، ثم تشغّل خزنة المقتطفات كلّها في Docker — دون حاجةٍ إلى Node محلّي.
مستودع snippet-vault من الوحدة 7 وDocker Desktop يعمل.
اطلب من المساعد Dockerfile و.dockerignore لـapi/ ولـweb/، بصورٍ أساسٍ alpine صغيرة. راجع كل تغيير — تأكّد ألّا أسرار تُنسخ فيها.
افتح التطبيق في المتصفّح. أنشئ مقتطفًا واعرض وابحث واحذف — كلّه يعمل داخل حاويات.
أوقف عمليات Node المشغّلة محليًّا تمامًا. يجب أن يظلّ التطبيق يعمل عبر Compose — لأن كل ما يحتاجه في الحاويات، لا في جهازك.
في REFLECTION.md: ما الذي كان في بيئتك وصارت الحاوية توفّره لك الآن؟ أودِعه.
مستودع snippet-vault. تحقّق من نفسك:
.dockerignore لكلٍّ من api/ وweb/docker compose up يشغّل التطبيق كلّه؛ ويعمل في المتصفّحREFLECTION.md يدوّن ما استبدلته الحاوية| المصطلح | المعنى المبسّط |
|---|---|
| الصورة | مخطّطٌ مجمّد لتطبيقٍ وكل ما يحتاجه ليعمل. |
| الحاوية | نسخةٌ عاملة معزولة من صورة. |
| Dockerfile | وصفةٌ خطوةً خطوة لبناء صورة. |
| Compose | أداةٌ لتعريف وتشغيل عدّة حاوياتٍ معًا. |
| .dockerignore | ملفاتٌ تُستبعَد من بناء الصورة (مثل node_modules). |
خزنة المقتطفات كلّها مغلّفةً في حاوياتٍ وتعمل بأمر Compose واحد — متطابقةً في كل مكان. «يعمل على جهازي» مات.
التالي: الوحدة 9 — خطّ أنابيب CI/CD. نضع الاختبارات والبوابات وبناء الصورة على الطيّار الآلي بـGitHub Actions، فيُفحص كل دفعٍ ويُبنى تلقائيًّا.