Docker للمطورين: الصور والحاويات وCompose
لقد قمت ببناء تطبيق ويب يعمل بشكل مثالي على جهازك، ولكن عند نشره على خادم أو مشاركته مع زميل، يتعطل. التبعيات مفقودة، أو الإصدارات متعارضة، أو متغيرات البيئة خاطئة. هذه هي المشكلة الكلاسيكية "يعمل على جهازي". يحل Docker هذه المشكلة عن طريق تغليف تطبيقك وتبعياته في وحدة موحدة تسمى حاوية. في هذا الدليل، ستتعلم المفاهيم الأساسية لـ Docker—الصور والحاويات وCompose—وكيفية استخدامها لتبسيط سير عمل التطوير الخاص بك.
ما هو Docker؟
Docker هو منصة لبناء وتشغيل وشحن التطبيقات في حاويات. الحاوية هي حزمة خفيفة الوزن ومستقلة وقابلة للتنفيذ تتضمن كل ما يلزم لتشغيل قطعة من البرمجيات: الكود، وقت التشغيل، أدوات النظام، المكتبات، والإعدادات. تعزل الحاويات التطبيقات عن بعضها البعض وعن البنية التحتية الأساسية، مما يضمن الاتساق عبر البيئات.
الصور مقابل الحاويات
الصورة هي قالب للقراءة فقط يحتوي على تعليمات لإنشاء حاوية. إنها مثل لقطة من تطبيقك وبيئته. الحاوية هي نسخة قابلة للتشغيل من صورة. يمكنك إنشاء الحاويات أو تشغيلها أو إيقافها أو نقلها أو حذفها باستخدام Docker API أو CLI.
فكر في الصورة كفئة (class) والحاوية ككائن (instance) من تلك الفئة. يمكنك تشغيل حاويات متعددة من نفس الصورة، كل منها معزولة عن الأخرى.
بناء صورة باستخدام Dockerfile
Dockerfile هو ملف نصي يحتوي على تعليمات لبناء صورة. إليك مثال بسيط لتطبيق Node.js:
# Use an official Node.js runtime as a parent image
FROM node:18-alpine
# Set the working directory
WORKDIR /app
# Copy package.json and package-lock.json
COPY package*.json ./
# Install dependencies
RUN npm install
# Copy the rest of the application code
COPY . .
# Expose the port the app runs on
EXPOSE 3000
# Define the command to run the app
CMD ["node", "server.js"]
لبناء الصورة، قم بتشغيل:
docker build -t my-node-app .
يقوم العلم -t بوسم الصورة باسم (my-node-app). تحدد النقطة . في النهاية سياق البناء (الدليل الحالي).
تشغيل الحاويات
بمجرد حصولك على صورة، يمكنك تشغيل حاوية:
docker run -p 3000:3000 -d my-node-app
هذا يربط المنفذ 3000 على المضيف بالمنفذ 3000 في الحاوية ويشغلها في الوضع المنفصل (-d).
الأوامر الشائعة:
docker ps– عرض الحاويات قيد التشغيلdocker ps -a– عرض جميع الحاويات (بما في ذلك المتوقفة)docker stop <container_id>– إيقاف حاويةdocker rm <container_id>– حذف حاويةdocker images– عرض الصورdocker rmi <image_id>– حذف صورة
إدارة البيانات باستخدام Volumes
الحاويات مؤقتة؛ عند حذفها، يتم فقدان بياناتها. للاحتفاظ بالبيانات، استخدم volumes. الـ volume هو دليل خارج نظام ملفات الحاوية، يديره Docker.
docker run -v my_volume:/app/data my-node-app
يمكنك أيضًا تركيب دليل المضيف (bind mount) للتطوير:
docker run -v $(pwd):/app my-node-app
Docker Compose: تطبيقات متعددة الحاويات
غالبًا ما تتطلب التطبيقات الواقعية خدمات متعددة: خادم ويب، قاعدة بيانات، ذاكرة تخزين مؤقت، إلخ. يتيح لك Docker Compose تعريف وتشغيل تطبيقات Docker متعددة الحاويات باستخدام ملف YAML. إليك مثال docker-compose.yml لتطبيق Node.js مع قاعدة بيانات PostgreSQL:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:password@db:5432/mydb
depends_on:
- db
db:
image: postgres:15-alpine
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
قم بتشغيل المجموعة بأكملها باستخدام:
docker compose up -d
هذا يبني خدمة الويب، ويسحب صورة Postgres، وينشئ شبكة، ويبدأ كلا الحاويتين. يضمن depends_on بدء قاعدة البيانات قبل خدمة الويب.
لإيقاف وإزالة الحاويات والشبكات والـ volumes:
docker compose down -v
أفضل الممارسات لـ Docker في التطوير
- استخدم .dockerignore لاستبعاد ملفات مثل
node_modulesو.gitمن سياق البناء. - استفد من البناء متعدد المراحل للحفاظ على صغر حجم الصور. على سبيل المثال، قم ببناء تطبيقك في مرحلة واحدة وانسخ فقط مخرجات الإنتاج إلى صورة وقت تشغيل أصغر.
- حدد الإصدارات في Dockerfile الخاص بك (مثل
node:18-alpineبدلاً منnode:latest) لضمان قابلية التكرار. - استخدم volumes للبيانات الدائمة و bind mounts لإعادة تحميل الكود المباشر أثناء التطوير.
- حافظ على الحاويات بدون حالة؛ قم بتخزين الحالة في volumes أو خدمات خارجية.
المقارنة: Docker مقابل الأجهزة الافتراضية
| الجانب | حاويات Docker | الأجهزة الافتراضية |
|---|---|---|
| وقت البدء | ثوانٍ | دقائق |
| استخدام الموارد | خفيف (يشارك نواة نظام التشغيل) | ثقيل (نظام تشغيل كامل لكل VM) |
| العزل | على مستوى العملية | على مستوى الأجهزة |
| قابلية النقل | عالية (يعمل في أي مكان يعمل فيه Docker) | محدودة بتوافق hypervisor |
الأسئلة الشائعة
ما الفرق بين الصورة والحاوية؟
الصورة هي قالب للقراءة فقط يحدد التطبيق وبيئته. الحاوية هي نسخة قيد التشغيل من صورة. يمكنك إنشاء حاويات متعددة من نفس الصورة.
متى يجب استخدام Docker Compose؟
استخدم Docker Compose عندما يتكون تطبيقك من خدمات متعددة (مثل خادم ويب، قاعدة بيانات، ذاكرة تخزين مؤقت) تحتاج إلى العمل معًا. إنه يبسط التنسيق للتطوير والاختبار.
كيف أحافظ على البيانات في Docker؟
استخدم volumes للاحتفاظ بالبيانات خارج نظام ملفات الحاوية. يتم إدارة volumes بواسطة Docker ويمكن مشاركتها بين الحاويات. يمكن أيضًا استخدام bind mounts لتركيب أدلة المضيف.
هل أنت مستعد لتحويل مشروعك التالي إلى حاويات؟ ابدأ بكتابة Dockerfile لتطبيق بسيط، ثم أضف الخدمات تدريجيًا باستخدام Docker Compose. لمزيد من أدوات المطورين، تحقق من JSON Formatter للتحقق من ملفات التكوين الخاصة بك وتنسيقها.