كل الوحدات لماذا الحاويات Dockerfile Compose مختبر DevOps English

حوسبة التطبيق في حاويات

غلّف الخزنة لتعمل بالمثل في أيّ مكان — قاتلًا «يعمل على جهازي» نهائيًّا.

الوحدة 8 · Docker وCompose، عبورًا إلى مختبر DevOps.

متوسّط الحاويات يتضمّن مختبرًا ~50 دقيقة

ماذا ستتعلّم

  • ما الحاوية ولماذا تنهي «يعمل على جهازي»
  • كتابة Dockerfile للـAPI وللواجهة
  • إبقاء الصور رشيقةً بـ.dockerignore وصورٍ أساسٍ صغيرة
  • تشغيل الحزمة كلّها معًا بـDocker Compose
  • مختبر عملي: حوسِب كِلا التطبيقين وشغّل الخزنة كليًّا داخل Docker

المتطلبات المسبقة: الوحدة 7، وDocker Desktop مثبَّت. تعبر هذه الوحدة إلى وحدتَي مختبر DevOps: Docker وCompose.

لماذا الحاويات

موطن الفشل رقم 6: «يعمل على جهازي». يعمل تطبيقك لديك لأن حاسوبك فيه إصدار Node الصحيح والحزم الصحيحة والبيئة الصحيحة. الحاوية تغلّف التطبيق مع كل ذلك — صندوقٌ محكم يعمل بالمثل على جهازك وجهاز زميلك ومُشغّل CI وخادم الإنتاج.

المصطلحالمعنى المبسّط
الصورة (Image)مخطّط: تطبيقك + بيئة تشغيله + اعتمادياته، مجمّدةً.
الحاويةنسخةٌ عاملة من صورة — آلةٌ مصغّرةٌ معزولة.
Dockerfileالوصفة التي تبني الصورة، خطوةً خطوة.

مفتاح خطّ الأنابيب

ما إن تصير الخزنة حاويةً حتى تسهل كل خطوةٍ لاحقة: CI يبني الصورة ذاتها، والنشر يشغّلها فحسب. الحوسبة في حاوياتٍ هي المفصل بين «مشروعي» و«منتجٍ قابل للشحن».

Dockerfile لكل تطبيق

كل تطبيقٍ في monorepo يأخذ Dockerfile خاصًّا به. وهذا الشكل لـAPI بـNestJS — سيملأ المساعد التفاصيل:

# api/Dockerfile FROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build EXPOSE 3000 CMD ["npm", "run", "start:prod"]

ملف .dockerignore (كـ.gitignore) يُبقي node_modules والأسرار خارج الصورة، فتصير عمليات البناء أسرع وأأمن.

أبقِ الصور رشيقةً وآمنة

استخدم أساسًا صغيرًا (-alpine)، وثبّت اعتماديات الإنتاج فقط في الصورة النهائية، ولا تخبز أسرار .env فيها أبدًا. اطلب من المساعد بناءً متعدّد المراحل إن كبرت الصورة — وراجعه كأيّ تغييرٍ آخر.

شغّلها كلّها بـCompose

الخزنة تطبيقان (ولاحقًا قاعدة بيانات). Docker Compose يصفها في ملفٍ واحد ويبدؤها معًا بأمرٍ واحد — مشبوكةً كي يستطيع web التحدّث إلى api.

# docker-compose.yml services: api: build: ./api ports: ["3000:3000"] env_file: ./api/.env web: build: ./web ports: ["5173:5173"] depends_on: [api]
docker compose up --build # start the whole stack docker compose down # stop it

هذا هو نمط مختبر DevOps بالضبط

وحدة Compose في مختبر DevOps تمشي الفكرة ذاتها بعمق (تطبيق + قاعدة بيانات + مراقبة). نعيد استخدامها هنا كي لا تتعلّم Compose مرّتين.

إلى أين يمضي هذا

تطبيقٌ محوسبٌ في حاويةٍ قابلٌ للنشر أينما تعمل الحاويات — جهازٌ افتراضي، Kubernetes، مضيفٌ مُدار. هذا أساس الوحدات الثلاث الأخيرة: CI يبني الصورة، والنشر يشغّلها، والمراقبة تراقبها. كل ما بعده يفترض وجود هذا الصندوق.

مختبر عملي: حوسِب الخزنة

ستضيف Dockerfile لكل تطبيق وملف Compose، ثم تشغّل خزنة المقتطفات كلّها في Docker — دون حاجةٍ إلى Node محلّي.

ما تحتاجه

مستودع snippet-vault من الوحدة 7 وDocker Desktop يعمل.

1

افرَع واكتب Dockerfiles

git checkout -b feature/docker

اطلب من المساعد Dockerfile و.dockerignore لـapi/ ولـweb/، بصورٍ أساسٍ alpine صغيرة. راجع كل تغيير — تأكّد ألّا أسرار تُنسخ فيها.

2

اكتب ملف Compose

Create docker-compose.yml that builds api and web, maps their ports, loads api/.env, and lets web reach api. One command to start everything.
3

ابنِ وشغّل

docker compose up --build

افتح التطبيق في المتصفّح. أنشئ مقتطفًا واعرض وابحث واحذف — كلّه يعمل داخل حاويات.

4

أثبِت وعد «أيّ جهاز»

أوقف عمليات Node المشغّلة محليًّا تمامًا. يجب أن يظلّ التطبيق يعمل عبر Compose — لأن كل ما يحتاجه في الحاويات، لا في جهازك.

5

ادمج وتأمّل

git add . git commit -m "Containerize api and web; add docker-compose" git checkout main && git merge feature/docker

في REFLECTION.md: ما الذي كان في بيئتك وصارت الحاوية توفّره لك الآن؟ أودِعه.

ما الذي تسلّمه

مستودع snippet-vault. تحقّق من نفسك:

  • Dockerfile + .dockerignore لكلٍّ من api/ وweb/
  • docker compose up يشغّل التطبيق كلّه؛ ويعمل في المتصفّح
  • لا أسرار مخبوزة في الصور
  • REFLECTION.md يدوّن ما استبدلته الحاوية

مسرد مصغّر

المصطلحالمعنى المبسّط
الصورةمخطّطٌ مجمّد لتطبيقٍ وكل ما يحتاجه ليعمل.
الحاويةنسخةٌ عاملة معزولة من صورة.
Dockerfileوصفةٌ خطوةً خطوة لبناء صورة.
Composeأداةٌ لتعريف وتشغيل عدّة حاوياتٍ معًا.
.dockerignoreملفاتٌ تُستبعَد من بناء الصورة (مثل node_modules).

الخلاصة وما التالي

صار لديك الآن

خزنة المقتطفات كلّها مغلّفةً في حاوياتٍ وتعمل بأمر Compose واحد — متطابقةً في كل مكان. «يعمل على جهازي» مات.

التالي: الوحدة 9 — خطّ أنابيب CI/CD. نضع الاختبارات والبوابات وبناء الصورة على الطيّار الآلي بـGitHub Actions، فيُفحص كل دفعٍ ويُبنى تلقائيًّا.

حوسبة التطبيق في حاويات

الأهداف لماذا الحاويات Dockerfile Compose مختبر DevOps المختبر العملي المسرد الخلاصة