Docker وJavaScript: حاويات التطبيقات من الألف إلى الياء

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

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

ابدأ الدورة

Docker وJavaScript: حاويات التطبيقات على Node.js — دليل شامل



في تطوير الويب الحديث، أصبحت الحاويات ليست مجرد موضة، بل ضرورة. يتيح Docker تغليف تطبيق JavaScript مع جميع التبعيات والإعدادات وبيئة التشغيل في حاوية معزولة، والتي ستعمل بشكل مضمون بنفس الطريقة على أي نظام — من كمبيوتر المطور المحمول إلى خادم الإنتاج. في هذه المقالة، سنشرح عملية حاويات تطبيقات Node.js من الصفر، ونستعرض أفضل الممارسات والسيناريوهات النموذجية للاستخدام.



أساسيات Docker لمطور JavaScript



قبل الغوص في التفاصيل، دعنا نفهم المفاهيم الأساسية لـ Docker فيما يتعلق بنظام JavaScript البيئي.



  • الصورة (Image) — قالب غير قابل للتغيير يحتوي على الكود، وبيئة تشغيل Node.js، والتبعيات (node_modules) والإعدادات. يتم تخزين الصور في سجل (مثل Docker Hub).
  • الحاوية (Container) — مثيل قيد التشغيل من الصورة. كل حاوية معزولة عن الأخرى وعن النظام المضيف.
  • Dockerfile — تعليمات بناء الصورة. بالنسبة لتطبيقات Node.js، هذا هو الملف الرئيسي الذي سنقوم بإنشائه.
  • docker-compose — أداة لتحديد وتشغيل التطبيقات متعددة الحاويات (مثل Node.js + MongoDB + Redis).


إنشاء Dockerfile لتطبيق Node.js



لنبدأ بتطبيق Express بسيط. لننشئ ملف Dockerfile في جذر المشروع:



# صورة أساسية Node.js 18 (Alpine — إصدار خفيف الوزن)FROM node:18-alpine

# إنشاء دليل العمل داخل الحاويةWORKDIR /usr/src/app

# نسخ package.json و package-lock.json (إن وجد)COPY package*.json ./

# تثبيت تبعيات الإنتاجRUN npm ci --only=production

# نسخ الكود المصدري للتطبيقCOPY . .

# فتح المنفذ الذي سيستمع عليه التطبيقEXPOSE 3000

# أمر تشغيل التطبيقCMD ["node", "src/index.js"]


نقاط مهمة لمشاريع JavaScript:

  • ترتيب التعليمات مهم. نسخ package.json قبل الكود يسمح لـ Docker بتخزين الطبقة التي تحتوي على تثبيت التبعيات مؤقتًا. إذا قمت بتغيير الكود فقط، فلن يتم إعادة تثبيت التبعيات — مما يسرع عملية البناء.
  • استخدم npm ci بدلاً من npm install — هذا أسرع ويضمن أن إصدارات التبعيات تتوافق مع ملف القفل.
  • إصدار Alpine من صورة Node.js (~120 MB بدلاً من ~900 MB) يقلل بشكل كبير من حجم الصورة النهائية.


العمل مع docker-compose: ربط Node.js بقاعدة البيانات



نادرًا ما تكتفي التطبيقات الحقيقية بحاوية واحدة. يتيح docker-compose.yml تشغيل Node.js وMongoDB وRedis بأمر واحد:



version: '3.8'services:  app:    build: .    ports:      - "3000:3000"    environment:      - NODE_ENV=production      - MONGODB_URI=mongodb://mongo:27017/myapp      - REDIS_URL=redis://redis:6379    depends_on:      - mongo      - redis    volumes:      - ./logs:/usr/src/app/logs

mongo: image: mongo:6 volumes: - mongo_data:/data/db ports: - "27017:27017"

redis: image: redis:7-alpine ports: - "6379:6379"

volumes: mongo_data:


كيف يعمل هذا:

  • خدمة app تُبنى من ملف Dockerfile الخاص بنا.
  • خدمات mongo و redis تستخدم صورًا جاهزة من Docker Hub.
  • متغيرات البيئة MONGODB_URI و REDIS_URL تُمرر إلى التطبيق — لاحظ أننا نستخدم أسماء الخدمات كاسم المضيف (DNS الخاص بـ Docker يحل تلقائيًا عناوين IP للحاويات).
  • وحدة التخزين mongo_d

المدونات

توصيات الكتب