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.
طبقات Build مقابل مسؤوليات Runtime
تُبنى Dependencies وSource في Runtime Image غير قابلة للتغيير، بينما تأتي Environment وSecrets وNetwork والبيانات الدائمة عند تشغيل Container.
Containerizing لتطبيق ويب مع Migrations
Multi-stage Image تبعد أدوات البناء عن Runtime
المرحلة النهائية تنسخ ما يحتاجه التطبيق للتشغيل فقط.
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 وافحص الصور النهائية.
