تحويل سيرفر Node.js متكامل إلى حاوية Docker قابلة للنقل


تحويل سيرفر Node.js متكامل إلى حاوية Docker قابلة للنقل

اليوم، سنتعلم كيفية تحويل تطبيق Node.js بسيط إلى حاوية Docker محمولة، مما يضمن بيئة تشغيل متسقة عبر مختلف الأنظمة.

الخطوة 1: إعداد تطبيق Node.js بسيط

سنبدأ بإنشاء تطبيق Node.js صغير يعرض رسالة "Hello Docker" عند زيارته.

أنشئ ملفاً باسم app.js:

// app.js
const http = require('http'); // استيراد وحدة HTTP لإنشاء خادم ويب

const hostname = '0.0.0.0'; // تعيين اسم المضيف للاستماع على جميع الواجهات المتاحة
const port = 3000; // تعيين المنفذ الذي سيستمع عليه الخادم

// إنشاء الخادم
const server = http.createServer((req, res) => {
  res.statusCode = 200; // تعيين رمز حالة الاستجابة إلى 200 (موافق)
  res.setHeader('Content-Type', 'text/plain'); // تعيين نوع المحتوى إلى نص عادي
  res.end('Hello Docker from Node.js!\n'); // إرسال الاستجابة وإغلاق الاتصال
});

// بدء تشغيل الخادم والاستماع على المنفذ المحدد
server.listen(port, hostname, () => {
  console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">Server running at http://${hostname}:${port}/</code>); // طباعة رسالة عند بدء تشغيل الخادم
});

ملاحظة تقنية: استخدام 0.0.0.0 كاسم مضيف يضمن أن التطبيق يستمع على جميع واجهات الشبكة المتاحة داخل الحاوية، مما يجعله قابلاً للوصول من خارج الحاوية.

الخطوة 2: إنشاء ملف Dockerfile

الـ Dockerfile هو وصفة لكيفية بناء صورة Docker. سنحدد فيه البيئة، نسخ الملفات، وتثبيت التبعيات.

أنشئ ملفاً باسم Dockerfile (بدون امتداد):

# Dockerfile
FROM node:18-alpine // تحديد الصورة الأساسية: Node.js 18 على Alpine Linux (صورة خفيفة الوزن)

WORKDIR /app // تعيين دليل العمل داخل الحاوية

# إذا كان لديك ملف package.json، فستحتاج للخطوتين التاليتين:
# COPY package*.json ./ // نسخ ملفات package.json و package-lock.json (إن وجدت) إلى دليل العمل
# RUN npm install // تثبيت تبعيات المشروع

COPY . . // نسخ جميع ملفات المشروع المتبقية إلى دليل العمل

EXPOSE 3000 // إخبار Docker بأن الحاوية تستمع على المنفذ 3000

CMD ["node", "app.js"] // الأمر الذي سيتم تنفيذه عند بدء تشغيل الحاوية

ملاحظة تقنية: في المشاريع الأكبر التي تحتوي على package.json، يفضل وضع COPY package*.json ./ و RUN npm install قبل COPY . .. هذا يسمح لـ Docker بتخزين طبقة التبعيات مؤقتاً، مما يسرع عملية البناء إذا لم تتغير التبعيات.

الخطوة 3: بناء وتشغيل صورة Docker

الآن بعد أن أصبح لدينا تطبيق Node.js وملف Dockerfile، حان الوقت لبناء الصورة وتشغيل الحاوية.

أولاً، قم ببناء الصورة. تأكد أنك في نفس الدليل الذي يحتوي على app.js و Dockerfile:

docker build -t node-docker-app . // بناء الصورة وتسميتها 'node-docker-app' باستخدام Dockerfile في الدليل الحالي

بعد بناء الصورة بنجاح، يمكنك تشغيل الحاوية:

docker run -d -p 80:3000 --name my-node-app node-docker-app // تشغيل الحاوية في الخلفية، ربط المنفذ 80 على المضيف بالمنفذ 3000 داخل الحاوية، وتسمية الحاوية 'my-node-app'

ملاحظة تقنية: الخيار -p 80:3000 ينشئ ربطاً للمنفذ. هذا يعني أن أي طلبات تصل إلى المنفذ 80 على جهازك المضيف ستتم إعادة توجيهها إلى المنفذ 3000 داخل حاوية Docker الخاصة بك. الخيار -d يشغل الحاوية في وضع الخلفية (detached mode).

الكود النهائي الكامل

للتلخيص، إليك ملف Dockerfile الذي استخدمناه:

# Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]

وإليك الأوامر الطرفية (Bash Script) لبناء وتشغيل الحاوية:

#!/bin/bash

echo "Building Docker image..."
docker build -t node-docker-app .

echo "Running Docker container..."
docker run -d -p 80:3000 --name my-node-app node-docker-app

echo "Container 'my-node-app' is running. Access it at http://localhost/"
echo "To stop the container: docker stop my-node-app"
echo "To remove the container: docker rm my-node-app"
echo "To view logs: docker logs my-node-app"

النتيجة المتوقعة

بعد تنفيذ أمر docker run، ستعمل الحاوية في الخلفية. يمكنك التحقق من تشغيلها باستخدام docker ps في الطرفية، وسترى قائمة بالحاويات العاملة، بما في ذلك my-node-app.

عند فتح متصفح الويب الخاص بك والتوجه إلى http://localhost/ (أو http://your_docker_host_ip/ إذا كنت تستخدم آلة افتراضية لـ Docker)، سترى الرسالة التالية:

Hello Docker from Node.js!

بالإضافة إلى ذلك، سترى في سجلات الحاوية (يمكنك رؤيتها باستخدام docker logs my-node-app) الرسالة التي طبعها تطبيق Node.js عند بدء التشغيل:

Server running at http://0.0.0.0:3000/