Skip to content
VDS · Docker والحاويات

Docker Compose: خدمات متعددة بأمر واحد

كيفية وصف حزمة تتكون من تطبيق وقاعدة بيانات وخادم ويب في ملف واحد، وتشغيلها بأمر واحد، وتحديثها دون إعادة بناء يدوية.

آخر تحديث 23 أغسطس 2026

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

مثال بسيط

المجلد /opt/myapp، وفيه compose.yaml:

services:
  db:
    image: postgres:17
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: app
    volumes:
      - db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      retries: 5

  app:
    image: ghcr.io/example/app:1.4.2
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    environment:
      DATABASE_URL: postgres://postgres:${DB_PASSWORD}@db:5432/app
    ports:
      - "127.0.0.1:8080:8080"

volumes:
  db-data:

بجانبه ملف .env:

DB_PASSWORD=long-random-password
chmod 600 .env
docker compose up -d
docker compose ps
docker compose logs -f app

ما يهم هنا

  • أسماء بدلًا من العناوين. يصل التطبيق إلى قاعدة البيانات بالاسم db — ينشئ Compose شبكة مشتركة تُحل فيها أسماء الخدمات تلقائيًا. لا تحتاج إلى نشر منفذ قاعدة البيانات خارجيًا، ولا ينبغي لك ذلك.
  • restart: unless-stopped. بدونه لن يعود أي شيء للعمل بعد إعادة تشغيل الجهاز.
  • depends_on مع فحص الحالة. ينتظر depends_on العادي بدء تشغيل الحاوية فقط، لا جاهزية قاعدة البيانات لقبول الاتصالات. فيبدأ التطبيق أبكر وينهار.
  • إصدارات صور دقيقة. postgres:17 وليس postgres:latest. مع latest، سيأتي pull التالي يومًا ما بإصدار رئيسي لن يفتح البيانات القديمة.
  • النشر على 127.0.0.1. لا تكشف منفذًا خارجيًا إلا عبر خادم ويب مزوّد بشهادة.

الأوامر اليومية

docker compose up -d          # bring up or apply changes
docker compose down           # stop and remove containers (volumes intact)
docker compose down -v        # ...and remove volumes too
docker compose restart app    # restart one service
docker compose exec app sh    # go inside
docker compose pull && docker compose up -d   # update images
docker compose config         # show final file with substitutions

docker compose config هي أفضل طريقة للتحقق من الملف قبل التشغيل: ستُظهر ما آلت إليه المتغيرات وما إذا كان أي إزاحة قد ضاع.

docker compose down -v يحذف وحدات التخزين مع قاعدة البيانات. هذا لا رجعة فيه. قبل أي عملية باستخدام -v، تأكد من وجود نسخة — راجع النسخ الاحتياطية.

ملفات البيئة

من المريح فصل نفس الحزمة للاختبار والإنتاج عبر طبقات إضافية:

docker compose -f compose.yaml -f compose.prod.yaml up -d

الملف الثاني يتجاوز الفروقات فقط: حدود الذاكرة، والمنافذ المنشورة، ومستوى السجل.

أخطاء شائعة

  • أسرار في compose.yaml محفوظ في مستودع. احفظها في .env بأذونات 600 ولا ترفعه إلى المستودع.
  • الخلط بين docker-compose وdocker compose. الإصدار القديم v1 لا يفهم بعض الصيغ ويخزّن المشاريع تحت أسماء مختلفة. ثبّت الإضافة — راجع تثبيت Docker.
  • بيانات داخل الحاوية بدلًا من وحدة تخزين. بعد docker compose down ستختفي. راجع وحدات التخزين.
  • بلا حدود للذاكرة. تلتهم خدمة واحدة كل ذاكرة الجهاز، فيقتل النواة جيرانها. راجع حدود الموارد.