كيف تستعمل Docker Compose لتشغيل عدة خدمات معاً
دليل Docker Compose الشامل للمبتدئين: ابدأ بإدارة الحاويات بثقة
—
مقدمة: لماذا يحتاج كل مطوّر إلى معرفة Docker Compose؟
إذا كنت قد سمعت عن Docker من قبل لكنك توقفت عند أول ملف `docker-compose.yml` وجدته، فأنت لست وحدك. الكثير من المطورين المبتدئين يشعرون بنفس الشيء، وأنا شخصياً مررت بنفس التجربة في بداياتي. الحقيقة أن Docker Compose للمبتدئين ليس موضوعاً معقداً كما يبدو، بل هو أداة رائعة تغيّر طريقة عملك كلياً. ومع تزايد الاعتماد على إدارة الحاويات في بيئات التطوير الحديثة، أصبح تعلّم هذه الأداة ضرورة وليس رفاهية. في هذا المقال سأأخذك خطوة بخطوة من الصفر حتى تشغّل أول مشروع متعدد الخدمات بشكل كامل.
—
ما الذي تحتاج معرفته قبل البدء؟
Docker Compose هو أداة تتيح لك تعريف وتشغيل تطبيقات Docker متعددة الحاويات من خلال ملف YAML واحد. بدلاً من أن تكتب أوامر طويلة في كل مرة لتشغيل حاوية، يمكنك ببساطة وضع كل الإعدادات في ملف واحد وتشغيل كل شيء بأمر واحد فقط.
تخيّل أنك تعمل على تطبيق ويب يحتاج إلى:
– خادم Node.js لمعالجة الطلبات
– قاعدة بيانات PostgreSQL لتخزين البيانات
– Redis للتخزين المؤقت
بدون Docker Compose، ستحتاج إلى تشغيل كل واحدة يدوياً وضبط الشبكات والمتغيرات. مع Docker Compose، كل هذا يتم بأمر واحد: `docker compose up`.
الفكرة الجوهرية هنا هي الإعلان عن البنية التحتية كشفرة برمجية (Infrastructure as Code)، وهو مفهوم أساسي في عالم DevOps الحديث.
—
الأدوات والمتطلبات التي ستحتاجها
قبل أن تبدأ، تأكد من توفر ما يلي على جهازك:
المتطلبات الأساسية:
– Docker Desktop (يشمل Docker Compose تلقائياً على Windows وmacOS)
– على Linux: قم بتثبيت Docker Engine ثم Docker Compose Plugin بشكل منفصل
– محرر نصوص: VS Code هو الخيار الأمثل مع إضافة Docker الرسمية
– معرفة أساسية بسطر الأوامر (Terminal أو Command Prompt)
المتطلبات الاختيارية المفيدة:
– إضافة Docker في VS Code لتلوين ملفات YAML وإظهار الأخطاء
– أداة Portainer إذا كنت تفضل واجهة رسومية لمتابعة الحاويات
– معرفة مبسّطة بـ YAML لفهم بنية ملف `docker-compose.yml`
للتحقق من التثبيت:
“`bash
docker –version
docker compose version
“`
إذا ظهر رقم الإصدار، أنت جاهز للبدء.
—
متى تستخدم Docker Compose تحديداً؟

هذا سؤال مهم جداً لأن بعض المطورين يستخدمون Compose حتى في المشاريع التي لا تحتاجه فعلاً. من تجربتي الشخصية، Docker Compose يُضيء قيمته الحقيقية في الحالات التالية:
في بيئة التطوير المحلية:
عندما يعمل أكثر من شخص على نفس المشروع، يضمن Compose أن الجميع يشغّل نفس البيئة بالضبط، بغض النظر عن نظام التشغيل.
في مشاريع الميكروسيرفيسز:
إذا كان تطبيقك مقسّماً إلى خدمات صغيرة مستقلة، Compose هو الطريقة المثلى لتجميعها وتشغيلها معاً.
في بيئات الاختبار:
يمكنك رفع بيئة اختبار كاملة في ثوانٍ وإزالتها فور الانتهاء دون أي أثر على الجهاز.
عندما تريد توثيق البنية التحتية:
ملف `docker-compose.yml` هو بحد ذاته وثيقة تقنية تشرح كيف يعمل النظام.
—
دليل خطوة بخطوة: أول مشروع مع Docker Compose

سنبني معاً تطبيقاً يتكون من خادم ويب بسيط وقاعدة بيانات MySQL. هذا مثال واقعي ستجده في معظم مشاريع الويب.
الخطوة الأولى: إنشاء مجلد المشروع
“`bash
mkdir my-first-compose
cd my-first-compose
“`
الخطوة الثانية: إنشاء ملف docker-compose.yml
أنشئ الملف وأضف المحتوى التالي:
“`yaml
version: ‘3.8’
services:
web:
image: nginx:alpine
ports:
– “8080:80”
volumes:
– ./html:/usr/share/nginx/html
depends_on:
– db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass123
MYSQL_DATABASE: myapp
MYSQL_USER: appuser
MYSQL_PASSWORD: apppass123
volumes:
– db_data:/var/lib/mysql
volumes:
db_data:
“`
> تحذير مهم: لا تستخدم كلمات مرور بسيطة في بيئة الإنتاج. هذا مثال تعليمي فقط.
الخطوة الثالثة: إنشاء صفحة HTML بسيطة
“`bash
mkdir html
echo “
مرحباً من Docker Compose!
” > html/index.html
“`
الخطوة الرابعة: تشغيل كل شيء
هنا يأتي دور Docker Compose للمبتدئين في تبسيط العملية كلها، إذ تحتاج فقط إلى:
“`bash
docker compose up -d
“`
الـ `-d` تعني تشغيل الحاويات في الخلفية (detached mode).
الخطوة الخامسة: التحقق من التشغيل
“`bash
docker compose ps
“`
افتح المتصفح على `http://localhost:8080` وستجد صفحتك.
الخطوة السادسة: إيقاف كل شيء بأمر واحد
“`bash
docker compose down
“`
هذا هو جمال إدارة الحاويات مع Compose، كل شيء في أمر واحد، بسيط ونظيف.
—
فوائد Docker Compose التي ستشعر بها فوراً
بعد أول أسبوع من استخدام Compose، ستلاحظ الفرق بشكل واضح:
توفير الوقت بشكل ملحوظ:
بدلاً من كتابة 5 أوامر أو أكثر لتشغيل بيئتك، أمر واحد يكفي.
تناسق البيئات:
انتهت مشكلة “يعمل عندي لكن لا يعمل عندك”. كل من يستخدم نفس الملف يحصل على نفس البيئة تماماً.
سهولة التوثيق:
ملف `docker-compose.yml` هو أفضل توثيق تقني يمكنك تقديمه لزميل جديد في الفريق.
عزل المشاريع:
كل مشروع يعمل في شبكته المعزولة دون أن يتعارض مع المشاريع الأخرى.
سرعة الإعداد:
إعداد بيئة تطوير كاملة لمشروع جديد يستغرق دقائق بدلاً من ساعات.
—
نصائح متقدمة وبدائل مفيدة
استخدام ملفات .env لإدارة المتغيرات:
بدلاً من كتابة كلمات المرور مباشرة في الملف، أنشئ ملف `.env`:
“`
DB_PASSWORD=mysecurepassword
DB_NAME=myapp
“`
ثم استدعها في `docker-compose.yml` هكذا: `${DB_PASSWORD}`
استخدام ملفات Override للبيئات المختلفة:
– `docker-compose.yml` للإعدادات الأساسية
– `docker-compose.override.yml` لبيئة التطوير
– `docker-compose.prod.yml` لبيئة الإنتاج
بدائل مفيدة:
– Podman Compose: بديل مفتوح المصدر لمن يفضل Podman
– Docker Swarm: للمشاريع التي تحتاج توزيعاً على خوادم متعددة
– Kubernetes: الحل المتكامل للإنتاج على نطاق واسع
نصيحة شخصية: ابدأ دائماً بـ Compose قبل أن تقفز إلى Kubernetes. أغلب المشاريع لا تحتاج هذا التعقيد في البداية.
—
أخطاء شائعة يقع فيها المبتدئون

الخطأ الأول: نسيان إضافة Volumes للبيانات المهمة
إذا لم تضف Volume لقاعدة البيانات، ستفقد كل بياناتك عند تشغيل `docker compose down`. الحل: دائماً عرّف Volume لأي خدمة تخزّن بيانات دائمة.
الخطأ الثاني: تعارض المنافذ
تشغيل خدمتين على نفس المنفذ سيتسبب في خطأ فوري. تأكد دائماً أن المنافذ التي تحددها غير مستخدمة بأمر `netstat -tulnp`.
الخطأ الثالث: تجاهل depends_on
إذا كان تطبيقك يحتاج قاعدة البيانات لتكون جاهزة قبل بدء تشغيله، استخدم `depends_on` أو أحسن من ذلك استخدم `healthcheck` للتحقق من جاهزية الخدمة.
الخطأ الرابع: كتابة بيانات حساسة مباشرة في الملف
لا تضع كلمات المرور أو مفاتيح API مباشرة في `docker-compose.yml` وترفعه إلى GitHub. استخدم ملفات `.env` وأضفها إلى `.gitignore`.
الخطأ الخامس: عدم تنظيف الموارد غير المستخدمة
الحاويات والصور والشبكات المتراكمة تأكل مساحة القرص. استخدم `docker system prune` بانتظام.
—
كيف تحسّن استخدامك على المدى البعيد؟
التحسين المستمر مع Docker Compose يتطلب منك بناء عادات صحيحة من البداية:
أولاً: تعلّم كتابة Healthchecks:
“`yaml
healthcheck:
test: [“CMD”, “mysqladmin”, “ping”, “-h”, “localhost”]
interval: 10s
timeout: 5s
retries: 5
“`
هذا يضمن أن الخدمات لا تبدأ قبل أن تكون جاهزة فعلاً.
ثانياً: استخدم Named Networks بدلاً من الشبكة الافتراضية:
التحكم في الشبكات يعطيك مرونة أكبر في عزل الخدمات وتأمينها.
ثالثاً: راجع إصدارات الصور بانتظام:
لا تستخدم `latest` دائماً. حدد إصداراً معيناً (`mysql:8.0.33`) لتتجنب مفاجآت التحديثات التلقائية.
رابعاً: وثّق ملف Compose بتعليقات:
“`yaml
خدمة قاعدة البيانات الرئيسية
db:
image: mysql:8.0
“`
تعليق بسيط يوفر ساعات من الفهم لاحقاً.
—
الخلاصة: ابدأ اليوم ولا تؤجّل
إذا كان عليّ أن أختار أداة واحدة فقط أنصح بها كل مطوّر في بداية مسيرته، ستكون Docker Compose بلا تردد. من خلال هذا الدليل، رأيت كيف أن Docker Compose للمبتدئين يمكن أن يكون بوابتك الحقيقية لعالم DevOps الحديث دون أن تغرق في التعقيدات. وبمجرد أن تتقن إدارة الحاويات على مستواها الأساسي، ستجد أن التعامل مع Kubernetes وأدوات الأتمتة المتقدمة يصبح أكثر منطقية وأقل ترويعاً. ابدأ بالمثال البسيط الذي شرحته، ثم طوّره تدريجياً. أفضل طريقة للتعلم هي البناء الفعلي، وليس القراءة فقط.
—
الأسئلة الشائعة
س1: ما الفرق بين Docker و Docker Compose؟
Docker هو المحرك الأساسي لتشغيل الحاويات بشكل منفرد، بينما Docker Compose هو أداة تنسيق تسمح لك بتشغيل عدة حاويات معاً وإدارة العلاقات بينها من خلال ملف تكوين واحد.
س2: هل Docker Compose مناسب للإنتاج؟
يمكن استخدامه في الإنتاج للمشاريع الصغيرة والمتوسطة، لكن للمشاريع الكبيرة التي تحتاج قابلية التوسع العالية والتوزيع على خوادم متعددة، Kubernetes هو الخيار الأنسب.
س3: كيف أحدّث صورة حاوية موجودة؟
“`bash
docker compose pull
docker compose up -d
“`
هذان الأمران يسحبان آخر الإصدارات ويعيدان تشغيل الخدمات المتأثرة فقط.
س4: هل يمكنني استخدام Docker Compose مع GitHub Actions؟
نعم بالتأكيد. كثير من المطورين يستخدمون Compose في خطوط CI/CD لبناء وتشغيل بيئات الاختبار بشكل تلقائي قبل كل عملية نشر.
س5: ماذا يحدث لبياناتي عند تشغيل docker compose down؟
الحاويات تُحذف لكن Volumes المُعرّفة تبقى. إذا أردت حذف كل شيء بما فيه البيانات، استخدم `docker compose down -v` مع الانتباه أن هذا لا يمكن التراجع عنه.




