Container حد تغليف

تضيف Docker قيمة عندما تجعل Runtime Dependencies صريحة وقابلة للتكرار. يجب أن تحتوي Image على كود التطبيق والBinaries المطلوبة، بينما تأتي الإعدادات والأسرار وقت التشغيل وتعيش الحالة الدائمة في Volumes أو خدمات خارجية. اعتبار Container كـVM خفيفة يفقد معظم هذا الانضباط.

تصميم Image وإعداد Runtime والحالة أمور منفصلة

  • استخدم Multi-stage Builds لفصل أدوات البناء عن Runtime النهائي.
  • شغل كمستخدم غير root عندما يكون عمليًا وأبق Image Surface صغيرة.
  • لا تضع Secrets أو بيانات تطبيق متغيرة داخل Layers.
  • اجعل Migrations وWorkers وWeb Processes أوامر Containers منفصلة عند اختلاف دوراتها.
  • Health Checks تختبر Service Readiness لا وجود PID 1 فقط.

من Source إلى Runtime Image صغيرة

تُبنى Dependencies وSource في Runtime Image غير قابلة للتغيير، بينما تأتي Environment وSecrets وNetwork والبيانات الدائمة عند تشغيل Container.

Diagram

طبقات Build مقابل مسؤوليات Runtime

تُبنى Dependencies وSource في Runtime Image غير قابلة للتغيير، بينما تأتي Environment وSecrets وNetwork والبيانات الدائمة عند تشغيل Container.

Containerizing لتطبيق ويب مع Migrations

Multi-stage Image تبعد أدوات البناء عن Runtime

المرحلة النهائية تنسخ ما يحتاجه التطبيق للتشغيل فقط.

Dockerfiledockerfile
FROM node:22-bookworm-slim AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --no-audit --no-fund

FROM deps AS builder
COPY . .
RUN npm run build

FROM node:22-bookworm-slim AS runner
WORKDIR /app
COPY --from=builder /app .
CMD ["npm", "start"]

عادات Docker التي تصنع أنظمة هشة

قائمة Containers

  • استخدم Lockfile وMulti-stage Build.
  • أبق Secrets والحالة الدائمة خارج Image Layers.
  • افصل أوامر دورة Web وWorker وMigration.
  • شغل بأقل صلاحيات وحدد Health/Readiness.
  • استخدم Immutable Tags وافحص الصور النهائية.