Docker وJavaScript: حاويات تطبيقات Node.js (مستوى متقدم)

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: من البسيط إلى المعقد في عالم الحاويات

\n\n

في المستوى الأساسي، غالبًا ما يقتصر العمل مع Docker وJavaScript (Node.js) على إنشاء Dockerfile بسيط وتشغيل حاوية. ومع ذلك، في أنظمة الإنتاج الحقيقية، هذا غير كافٍ. المستوى المتقدم يتضمن فهمًا عميقًا لآليات البناء، تحسين حجم الصور، إدارة التبعيات، العزل الشبكي والأمان.

\n\n

في هذه المقالة، سنستعرض الجوانب الرئيسية للحاويات الاحترافية لتطبيقات Node.js. ستتعلم كيفية استخدام البناء متعدد المراحل (multi-stage builds)، تكوين Docker Compose للهندسة المعمارية القائمة على الخدمات المصغرة، إدارة متغيرات البيئة وتقليل سطح الهجوم. المحتوى موجه للمطورين الذين لديهم بالفعل معرفة بأساسيات Docker وJavaScript.

\n\n

1. البناء متعدد المراحل (Multi-stage builds) لـ Node.js

\n\n

إحدى المشكلات الرئيسية عند حاويات تطبيقات Node.js هي الحجم الزائد للصورة النهائية. النهج القياسي باستخدام Dockerfile واحد يتضمن أدوات البناء (TypeScript, Webpack, Babel) التي ليست ضرورية في وقت التشغيل. البناء متعدد المراحل يسمح بتقسيم العملية إلى مراحل: البناء والتنفيذ.

\n\n

1.1. مثال على Dockerfile بمرحلتين

\n\n
# مرحلة البناء (build)\nFROM node:20-alpine AS builder\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\nCOPY . .\nRUN npm run build  # يُفترض أن سكريبت build يقوم ببناء المشروع\n\n# مرحلة التنفيذ (production)\nFROM node:20-alpine AS production\nWORKDIR /app\n# ننسخ فقط node_modules والملفات المبنية\nCOPY --from=builder /app/node_modules ./node_modules\nCOPY --from=builder /app/dist ./dist\nCOPY package*.json ./\n\nEXPOSE 3000\nUSER node\nCMD ["node", "dist/index.js"]
\n\n

النقاط الرئيسية:

\n
    \n
  • node:20-alpine — صورة خفيفة الوزن تعتمد على Alpine Linux (حوالي 30 ميجابايت).
  • \n
  • npm ci — تثبيت نظيف للتبعيات بدقة وفقًا لـ package-lock.json.
  • \n
  • --only=production — استبعاد تبعيات التطوير (TypeScript، الاختبارات).
  • \n
  • USER node — التخلي عن مستخدم root لأغراض الأمان.
  • \n
\n\n

نتيجة لذلك، تحتوي الصورة النهائية فقط على الملفات اللازمة للتشغيل، ويتقلص الحجم من 300-400 ميجابايت إلى 80-120 ميجابايت.

\n\n

1.2. تحسين التخزين المؤقت للطبقات

\n\n

يقوم Docker بتخزين كل طبقة (أمر) مؤقتًا. لتسريع عمليات البناء المتكررة، انسخ package*.json قبل نسخ الكود المصدري بأكمله. إذا لم تتغير التبعيات، فسيتم أخذ الطبقة التي تحتوي على npm ci من ذاكرة التخزين المؤقت.

\n\n
COPY package*.json ./\nRUN npm ci --only=production\nCOPY . .  # يتم النسخ فقط إذا تغيرت المصادر
\n\n

2. Docker Compose للهندسة المعمارية القائمة على الخدمات المصغرة

\n\n

في الإنتاج، نادرًا ما يعمل تطبيق Node.js بشكل منعزل. عادةً ما تكون هناك حاجة إلى قاعدة بيانات (PostgreSQL, MongoDB)، ذاكرة تخزين مؤقت (Redis) أو قائمة انتظار رسائل (RabbitMQ). يتيح Docker Compose وصف البنية التحتية بأكملها في ملف YAML واحد.

\n\n

2.1. مثال على docker-compose.yml لـ Node.js + Redis

\n\n
version: '3.8'\nservices:\n  app:\n    build:\n      context: .\n      dockerfile: Dockerfile.prod\n    ports:\n      - "3000:3000"\n    environment:\n      - NODE_ENV=production\n      - REDIS_URL=redis://redis:6379\n    depends_on:\n      - redis\n    networks:\n      - backend\n\n  redis:\n    image: redis:7-alpine\n    ports:\n      - "6379:6379"\n    volumes:\n      - redis_data:/data\n    networks:\n      - backend\n\nvolumes:\n  redis_data:\n\nnetworks:\n  backend:\n    driver: bridge
\n\n

الجوانب الهامة:

\n
    \n
  • العزل الشبكي: تتواصل الخدمات عبر الشبكة الداخلية backend. Redis غير متاح من الخارج (إذا لم يتم تمرير المنفذ).
  • \n
  • المجلدات المسماة: redis_data تحفظ

المدونات

توصيات الكتب