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

📦 إن كنت جديدًا تمامًا على الحاويات، ابدأ أولًا بدليل Docker والحاويات من الصفر، ثم عُد إلى هنا.

⚡ الإجابة المختصرة

Docker Compose أداة تصف بها خدمات مشروعك (التطبيق، قاعدة البيانات، الكاش…) في ملف docker-compose.yml واحد، ثم تشغّلها جميعًا بأمر docker compose up -d. يتكفّل Compose بإنشاء الشبكة بينها، وترتيب تشغيلها، وحفظ بياناتها في volumes. النتيجة: بيئة متكاملة تُشغَّل وتُوقَف وتُنقَل بين السيرفرات بأمر واحد — بدل عشرات أوامر docker run اليدوية.
Docker Compose للمبتدئين: مقارنة بين التشغيل اليدوي والملف الواحد، وتشريح ملف docker-compose.yml والأوامر
Docker Compose: ملف واحد يصف التطبيق وقاعدة بياناته، والأوامر الأساسية لتشغيلها معًا.

ما هو Docker Compose ولماذا يسهّل حياتك؟

Docker Compose أداة رسمية من Docker لتعريف وتشغيل تطبيقات متعدّدة الحاويات. بدل أن تكتب أمرًا طويلًا لكل حاوية وتربطها يدويًا، تضع كل شيء في ملف نصّي واحد يُسمّى docker-compose.yml. ما يوفّره Compose:

  • أمر واحد لكل شيء: docker compose up يشغّل كل الخدمات معًا.
  • شبكة تلقائية: تتحدّث الحاويات مع بعضها بالاسم دون إعداد شبكة يدوي.
  • ترتيب التشغيل: تحدّد أن قاعدة البيانات تبدأ قبل التطبيق.
  • قابلية النقل: الملف نفسه يعمل على جهازك وعلى سيرفرك — نفس البيئة بالضبط.

توثّق صفحة Docker Compose الرسمية كل خياراته، لكن ما ستتعلّمه هنا يكفيك لتشغيل معظم المشاريع.

متى تحتاجه؟ ومتى يكفيك docker run؟

تحتاجه متى كان مشروعك أكثر من حاوية واحدة، وهو الغالب:

  • تطبيق ويب + قاعدة بيانات (الأكثر شيوعًا).
  • تطبيق + قاعدة بيانات + كاش Redis.
  • عدّة خدمات خلفية (Backend + Worker + طابور مهام).
  • أي بيئة تريد تشغيلها بنفس الشكل على جهازك وعلى السيرفر.

لحاوية واحدة فقط قد يكفيك docker run، لكن بمجرّد إضافة قاعدة بيانات يصبح Compose أوضح وأسهل.

المفاهيم الأساسية قبل أول ملف

  • الخدمة (service): كل حاوية في مشروعك (app، db…) تُعرَّف كخدمة.
  • الصورة (image): القالب الذي تُبنى منه الحاوية (مثل postgres:16).
  • المنافذ (ports): ربط منفذ داخلي بالحاوية بمنفذ على السيرفر.
  • التخزين (volumes): مساحة دائمة تحفظ بيانات قاعدتك حتى لو حُذفت الحاوية.
  • الشبكة (network): ينشئها Compose تلقائيًا لتتحدّث الخدمات بالاسم.

أول مثال: تطبيق + قاعدة بيانات بملف Compose

ثبّت Docker على سيرفرك (بعد تجهيز Ubuntu)، ثم أنشئ ملف docker-compose.yml يصف تطبيق Node وقاعدة PostgreSQL:

services:
  app:
    image: node:20
    working_dir: /app
    volumes:
      - ./:/app
    command: npm start
    ports:
      - "3000:3000"
    depends_on:
      - db

  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: "ضع_كلمة_مرور_قوية"
      POSTGRES_DB: myapp
    volumes:
      - dbdata:/var/lib/postgresql/data

volumes:
  dbdata:

لاحظ: خدمتان (app وdb)، التطبيق ينتظر قاعدة البيانات عبر depends_on، وبيانات القاعدة محفوظة في volume اسمه dbdata فلا تضيع. التطبيق يتّصل بقاعدته باسم الخدمة db مباشرة دون عنوان IP.

الأوامر الأساسية في Compose

من داخل مجلّد الملف، هذه كل ما تحتاجه يوميًا:

docker compose up -d      # يشغّل كل الخدمات في الخلفية
docker compose ps         # يعرض حالة الخدمات
docker compose logs -f    # يتابع السجلّات لحظيًا
docker compose down       # يوقف ويزيل الحاويات (تبقى الـ volumes)

أمر up -d وحده يبني الشبكة ويشغّل التطبيق وقاعدته معًا بالترتيب الصحيح. وعند التعديل على الملف، docker compose up -d مرّة أخرى يطبّق التغيير فقط.

حفظ البيانات: لا تفقد قاعدتك عند إعادة التشغيل

أهمّ درس للمبتدئين: الحاوية مؤقّتة، فإن خزّنت بيانات قاعدتك داخلها فقدتها عند أول down. الحلّ هو volume كما في المثال (dbdata): مساحة على قرص السيرفر تبقى مستقلّة عن الحاوية. مع ذلك، الـ volume ليس نسخة احتياطية — ما زلت تحتاج نسخًا احتياطية حقيقية خارج السيرفر.

من التجربة إلى الإنتاج

بعد أن يعمل مشروعك محليًا بـ Compose، لنشره للعالم: ضع Nginx كوكيل عكسي أمام الحاوية وفعّل SSL مجانيًا، وطبّق تأمين VPS الأساسي. ولمشاريع أكبر تحتاج توسّعًا، راجِع Docker Compose في Production: هل يكفي أم تحتاج Kubernetes؟. وحمّل الصور الرسمية من Docker Hub.

أخطاء شائعة عند المبتدئين

  • نسيان volume لقاعدة البيانات: تفقد بياناتك عند أول down.
  • كلمة مرور ضعيفة في environment: استخدم كلمة قوية، ولا ترفع الملف لمستودع عام بها.
  • تعارض المنافذ: منفذ مشغول على السيرفر يمنع التشغيل — غيّر الربط في ports.
  • توقّع أن down يحفظ كل شيء: يزيل الحاويات؛ البيانات تبقى في الـ volume فقط.
  • استخدام الأمر القديم docker-compose (بشرطة): النسخة الحديثة هي docker compose (بمسافة).

الأسئلة الشائعة

ما الفرق بين Docker وDocker Compose؟

Docker يشغّل حاوية واحدة بأمر docker run، بينما Docker Compose يصف ويشغّل عدّة حاويات معًا (تطبيق + قاعدة بيانات + كاش) من ملف واحد بأمر واحد، مع ربطها وترتيب تشغيلها تلقائيًا.

هل Docker Compose مناسب للإنتاج؟

نعم للمشاريع الصغيرة والمتوسّطة على سيرفر واحد، خاصة مع Nginx وSSL أمامه. للمشاريع التي تحتاج توسّعًا أفقيًا عبر عدّة خوادم قد تحتاج أدوات تنسيق أكبر مثل Kubernetes.

أين تُحفظ بيانات قاعدة البيانات؟

في volume تعرّفه في الملف (مثل dbdata)، وهو مساحة على قرص السيرفر مستقلّة عن الحاوية تبقى بعد حذفها. لكنه ليس بديلًا عن النسخ الاحتياطي خارج السيرفر.

هل أكتب docker-compose أم docker compose؟

النسخة الحديثة المدمجة هي docker compose (بمسافة). الأمر القديم docker-compose (بشرطة) ما زال يعمل في بعض الأنظمة لكنه في طريقه للإهمال؛ اعتمد docker compose.

هل أحتاج ملفًا لكل مشروع؟

نعم، لكل مشروع مجلّده وملف docker-compose.yml الخاص به. هذا يبقي مشاريعك معزولة، ويسهّل نقل أي مشروع كاملًا إلى سيرفر آخر بنسخ مجلّده.

الخلاصة

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

جاهز لتشغيل مشروعك بـ Docker Compose؟

تحتاج سيرفرًا بصلاحية root وموارد مرنة: خوادم VPS من مرام هوست بنظام Ubuntu وتخزين NVMe — بيئة مثالية لتشغيل حاوياتك ونقلها بسهولة. اطلب سيرفرك وابدأ الآن ←