نظرة عامة

يحدد Docker Compose تطبيقات متعددة الحاويات في ملف YAML واحد. تغطي هذه الورقة المرجعية بنية compose.yaml، كل مفاتيح الخدمة، خيارات البيئة والإعدادات، الشبكات والأحجام، CLI الكامل، ملفات الإلغاء، والملفات الشخصية. جميع الأمثلة موجهة نحو Docker Compose v2 (المكوّن docker compose) ومواصفات Compose؛ المفتاح version: القديم عفا عليه الزمن ويتم تجاهله.

هيكل compose.yaml

البنية الأساسية لملف Compose:

services:      # تحديد الخدمات المحتوية
volumes:       # تحديد الأحجام المسماة
networks:      # تحديد الشبكات المخصصة
configs:       # تحديد الإعدادات (للغواصة، اختياري)
secrets:       # تحديد الأسرار (للغواصة، اختياري)

الخدمات: مفاتيح أساسية

المفتاح الغرض مثال
image: <name>:<tag> استخدام صورة محسوبة مسبقاً image: nginx:1.27
build: <path> بناء صورة من Dockerfile في المسار المحدد build: . أو build: ./services/web
build: { context: <path>, dockerfile: <file> } بناء بسياق ومسار Dockerfile صريح build: { context: ., dockerfile: Dockerfile.prod }
build: { context: <path>, args: { VAR: value } } تمرير حجج البناء build: { context: ., args: { NODE_ENV: production } }
container_name: <name> تعيين اسم الحاوية (لا ينصح به للتحجيم) container_name: my_web_app
restart: <policy> سياسة إعادة التشغيل: no, always, on-failure, unless-stopped restart: unless-stopped
restart: on-failure:<max-retries> إعادة التشغيل عند الفشل حتى N مرات restart: on-failure:5

الشبكات والمنافذ

المفتاح الغرض مثال
ports: [<host>:<container>] تعيين منفذ الحاوية للمضيف ports: ["8080:80"]
ports: [<host-ip>:<host>:<container>] تعيين لعنوان IP محدد للمضيف ports: ["127.0.0.1:8080:80"]
ports: [<container>] الكشف بدون تعيين للمضيف ports: ["8080"]
expose: [<port>] الكشف للاتصال الداخلي (بدون تعيين المضيف) expose: ["8080"]
networks: [<network>] توصيل الخدمة بشبكات مخصصة networks: [frontend, backend]
networks: <network>: { ipv4_address: <ip> } تعيين عنوان IP ثابت networks: { backend: { ipv4_address: 172.20.0.2 } }
hostname: <name> تعيين اسم مضيف الحاوية hostname: db-server
links: [<service>] الربط بخدمة أخرى (قديم، استخدم الشبكات بدلاً من ذلك) links: [db]
dns: [<ip>] تعيين خوادم DNS dns: [8.8.8.8, 8.8.4.4]
dns_search: [<domain>] تعيين مجالات البحث عن DNS dns_search: [example.com]

البيئة والإعدادات

المفتاح الغرض مثال
environment: { VAR: value } تعيين متغيرات البيئة بشكل مضمّن environment: { DEBUG: "true", LOG_LEVEL: info }
environment: [VAR=value] تعيين متغيرات البيئة كقائمة environment: [DEBUG=true, LOG_LEVEL=info]
env_file: <file> تحميل متغيرات البيئة من ملف env_file: .env
env_file: [<file1>, <file2>] التحميل من ملفات متعددة (الملفات اللاحقة تلغي الملفات السابقة) env_file: [.env, .env.local]
working_dir: <path> تعيين دليل العمل داخل الحاوية working_dir: /app
command: <command> تجاوز CMD من Dockerfile command: python -u app.py
command: [<cmd>, <arg1>, <arg2>] الأمر كقائمة (نموذج exec، مفضل) command: [python, -u, app.py]
entrypoint: <cmd> تجاوز ENTRYPOINT من Dockerfile entrypoint: /bin/bash
entrypoint: [<cmd>, <arg>] ENTRYPOINT كقائمة (نموذج exec، مفضل) entrypoint: [python, -u]
stdin_open: true الحفاظ على stdin مفتوحاً حتى لو لم يكن مرتبطاً stdin_open: true
tty: true تخصيص pseudo-terminal tty: true

التخزين: الأحجام والربط

المفتاح الغرض مثال
volumes: [<host>:<container>] ربط مجلد المضيف volumes: [./data:/app/data]
volumes: [<name>:<container>] تثبيت حجم مسمّى volumes: [my_data:/app/data]
volumes: { <container>: {} } حجم مجهول volumes: { /app/data: {} }
volumes: { <container>: { ro: true } } تثبيت للقراءة فقط volumes: { /data: { ro: true } }
volumes: { <container>: { consistency: <mode> } } وضع الاتساق (macOS/Windows فقط) volumes: { /data: { consistency: delegated } }
tmpfs: [<path>] تثبيت نظام ملفات مؤقت tmpfs: [/tmp]

ملاحظة: حدد الأحجام المسماة على المستوى الأعلى:

volumes:
  my_data:
    driver: local

حدود الموارد

المفتاح الغرض مثال
cpus: <float> تحديد أنوية CPU (مثل 0.5 لنصف ядро) cpus: 2
cpu_shares: <int> وزن حصة CPU (الأولوية النسبية) cpu_shares: 512
mem_limit: <value> تحديد الذاكرة (مثل 512m، 1g) mem_limit: 512m
memswap_limit: <value> تحديد الذاكرة + المبادلة memswap_limit: 1g
mem_reservation: <value> حد الذاكرة الناعم (يسمح بتجاوز إذا كانت المساحة متاحة) mem_reservation: 256m

فحوصات صحية

المفتاح الغرض مثال
healthcheck: { test: [CMD, curl, -f, 'http://localhost/health'] } تحديد أمر فحص صحي (انظر أدناه)
healthcheck: { test: CMD curl -f http://localhost/health } فحص صحي كسلسلة healthcheck: { test: CMD curl -f http://localhost/health }
healthcheck: { test: CMD-SHELL, 'pg_isready -U postgres' } فحص صحي مع shell (انظر أدناه)
healthcheck: { interval: 30s } عدد مرات تشغيل الفحص (الافتراضي: 30 ثانية) interval: 30s
healthcheck: { timeout: 5s } مهلة انتظار الفحص (الافتراضي: 30 ثانية) timeout: 5s
healthcheck: { start_period: 10s } فترة رحمة قبل أول فحص (الافتراضي: 0 ثانية) start_period: 10s
healthcheck: { retries: 3 } الفشل المتتالي قبل وضع العلامة كغير صحي (الافتراضي: 3) retries: 3
healthcheck: disable: true تعطيل فحص صحي (إذا ورث من صورة) disable: true

مثال كامل:

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
  interval: 30s
  timeout: 5s
  start_period: 10s
  retries: 3

التبعيات وترتيب البدء

المفتاح الغرض مثال
depends_on: [<service>] انتظر بدء الخدمات (بدون فحص الجاهزية) depends_on: [db, cache]
depends_on: { <service>: { condition: service_started } } انتظر بدء الخدمة depends_on: { db: { condition: service_started } }
depends_on: { <service>: { condition: service_healthy } } انتظر أن تكون الخدمة صحية depends_on: { db: { condition: service_healthy } }
depends_on: { <service>: { condition: service_completed_successfully } } انتظر اكتمال الخدمة بنجاح (وظائف لمرة واحدة) depends_on: { migration: { condition: service_completed_successfully } }

تحذير: condition: service_healthy يتطلب أن تحتوي الخدمة على healthcheck. بدونها، يفشل الشرط على الفور.

مثال كامل:

services:
  web:
    depends_on:
      db:
        condition: service_healthy
      cache:
        condition: service_started

الأمان: الأسرار والإعدادات

المفتاح الغرض مثال
secrets: [<name>] تثبيت ملف سر في /run/secrets/<name> secrets: [db_password]
configs: [<name>] تثبيت ملف إعدادات في / configs: [nginx_config]

التعريف على المستوى الأعلى:

secrets:
  db_password:
    file: ./secrets/db_password.txt

configs:
  nginx_config:
    file: ./nginx.conf

الوصول في الحاوية:

# في shell: cat /run/secrets/db_password

الملفات الشخصية

تسمح الملفات الشخصية بتضمين الخدمات بشكل مشروط.

services:
  web:
    image: nginx:latest
    # يتم تضمينها دائماً

  debug:
    image: busybox:latest
    profiles: [debug]
    # يتم تضمينها فقط مع --profile debug

  monitoring:
    image: prom/prometheus:latest
    profiles: [monitoring, prod]
    # يتم تضمينها مع --profile monitoring أو --profile prod

الاستخدام:

docker compose up                        # تضمين الخدمات بدون ملفات شخصية فقط
docker compose --profile debug up        # تضمين web + debug
docker compose --profile monitoring up   # تضمين web + monitoring
docker compose --profile debug --profile monitoring up  # تضمين الجميع

الشبكات (على المستوى الأعلى)

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.name: br0

استخدام الخدمة:

services:
  web:
    networks: [frontend, backend]
  db:
    networks: [backend]

الأحجام (على المستوى الأعلى)

volumes:
  db_data:
    driver: local
  shared_cache:
    driver: local
    driver_opts:
      type: tmpfs
      device: tmpfs

ملفات الإلغاء

يحمّل Docker Compose تلقائياً docker-compose.override.yaml ويدمجها مع compose.yaml.

compose.yaml (الإنتاج):

services:
  web:
    image: myapp:latest
    environment:
      LOG_LEVEL: warn

docker-compose.override.yaml (التطوير المحلي):

services:
  web:
    build: .
    ports:
      - "8000:8000"
    environment:
      LOG_LEVEL: debug

النتيجة عند تشغيل docker compose up:
– تم بناء الصورة من ./Dockerfile (يلغي image: myapp:latest)
– يتم كشف المنفذ 8000 على المضيف
– تم تعيين LOG_LEVEL إلى debug
– يتم دمج تعيين المنفذ و LOG_LEVEL

ملف إلغاء صريح:

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

أوامر CLI

الأمر الغرض مثال
docker compose up إنشاء وبدء جميع الخدمات docker compose up
docker compose up -d بدء الخدمات في وضع الفصل (الخلفية) docker compose up -d
docker compose up -d --scale web=3 تحجيم خدمة إلى N نسخة docker compose up -d --scale web=3
docker compose down إيقاف وإزالة جميع الخدمات والشبكات (يحتفظ بالأحجام) docker compose down
docker compose down -v إيقاف وإزالة الخدمات والشبكات والأحجام docker compose down -v
docker compose down --rmi all إزالة الخدمات وحذف جميع الصور docker compose down --rmi all
docker compose down --remove-orphans إزالة الخدمات غير الموجودة في ملف Compose docker compose down --remove-orphans
docker compose ps قائمة الخدمات قيد التشغيل docker compose ps
docker compose logs عرض السجلات من جميع الخدمات docker compose logs
docker compose logs -f بث السجلات بشكل مستمر (متابعة) docker compose logs -f
docker compose logs -f <service> بث السجلات من خدمة واحدة docker compose logs -f web
docker compose logs --tail 50 <service> عرض آخر 50 سطر من خدمة docker compose logs --tail 50 web
docker compose exec <service> <command> تشغيل أمر داخل خدمة docker compose exec web bash
docker compose exec -it <service> bash تشغيل bash بشكل تفاعلي داخل خدمة docker compose exec -it db psql -U postgres
docker compose exec -u <user> <service> <command> التشغيل كمستخدم محدد docker compose exec -u appuser web whoami
docker compose pull سحب أحدث الصور لجميع الخدمات docker compose pull
docker compose build بناء جميع الصور (إذا تم تحديد build:) docker compose build
docker compose build --no-cache <service> إعادة البناء بدون ذاكرة مؤقتة docker compose build --no-cache web
docker compose start بدء الخدمات المتوقفة docker compose start
docker compose stop إيقاف الخدمات قيد التشغيل docker compose stop
docker compose stop <service> إيقاف خدمة محددة docker compose stop web
docker compose restart إعادة تشغيل جميع الخدمات docker compose restart
docker compose restart <service> إعادة تشغيل خدمة محددة docker compose restart web
docker compose pause إيقاف جميع الخدمات docker compose pause
docker compose unpause استئناف الخدمات المجمدة docker compose unpause
docker compose config التحقق من صحة وطباعة إعدادات Compose النهائية docker compose config
docker compose config --resolve-image-digests حل image digests (مفيد للاستنساخ) docker compose config --resolve-image-digests
docker compose watch مراقبة التغييرات ومزامنة/إعادة بناء الخدمات (Compose 2.22+) docker compose watch
docker compose version عرض إصدار Docker Compose docker compose version
docker compose -f <file> <command> تحديد ملف Compose صراحةً docker compose -f docker-compose.prod.yaml up
docker compose --project-name <name> <command> استخدم اسم مشروع مخصص (الافتراضي: اسم المجلد) docker compose --project-name myapp up

الأنماط التي ستعاد استخدامها

# التطوير مع ملف override
# compose.yaml: إعداد الإنتاج
# docker-compose.override.yaml: تعديلات التطوير المحلي

# قاعدة البيانات مع فحص صحي و depends_on
services:
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: secret
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
  web:
    depends_on:
      db:
        condition: service_healthy

# تطبيق متعدد الطبقات
services:
  web:
    networks: [frontend, backend]
  cache:
    networks: [backend]
  db:
    networks: [backend]

# حمّل البيئة من ملف مع الإلغاءات
services:
  app:
    env_file: .env
    environment:
      LOG_LEVEL: debug  # تجاوز من .env

# الملفات الشخصية للخدمات الاختيارية
  monitoring:
    profiles: [monitoring]
  debug:
    profiles: [debug]

# استخدم compose watch لإعادة التحميل المباشرة (Compose 2.22+)
# docker compose watch
watch:
  - path: ./src
    action: sync
    target: /app/src
  - path: ./requirements.txt
    action: rebuild

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

ما الفرق بين docker-compose.yml و compose.yaml؟

كلاهما مدعوم. يفضل Docker compose.yaml (بدون شرطة). كلاهما متكافئ؛ اختر عرفاً واحداً والتزم به. تستخدم التوثيق الحديثة compose.yaml.

كيف أعيّن متغيرات البيئة في Docker Compose؟

استخدم مفتاح environment في الخدمة، أو حمّل من ملف باستخدام env_file: .env. يمكن أن تكون المتغيرات مرمّزة أو من shell المضيف (${VAR_NAME}) أو من ملفات .env. استخدم الأسرار للقيم الحساسة.

كيف أتأكد من بدء خدمة واحدة قبل أخرى؟

استخدم depends_on: db: condition: service_healthy (يتطلب HEALTHCHECK). لمجرد ترتيب البدء بدون التحقق من الجاهزية، استخدم الصيغة القصيرة depends_on: [db]؛ يرتب البدء فقط ولا ينتظر الجاهزية.

كيف أستخدم ملفات override في Docker Compose؟

أنشئ docker-compose.override.yaml في نفس المجلد. يحمّله Compose تلقائياً ويدمجه مع compose.yaml. تجاوز خدمات محددة بدون تعديل الملف الرئيسي. مفيد للتطوير المحلي مقابل الإنتاج.

ما هي ملفات تعريف Docker Compose؟

تسمح الملفات الشخصية بتضمين الخدمات بشكل مشروط. عيّن profiles: [debug] في خدمة، ثم استخدم docker compose --profile debug up لتضمينها. مفيد لخدمات تصحيح أخطاء أو أكوام مراقبة اختيارية.

كيف تم التحقق من هذا الدليل

كُتب يدويًا من الوثائق الرسمية، وأُعيد فحص كل أمر، ثم رُوجع مرة ثانية قبل النشر. آخر مراجعة في .

المصادر الرسمية التي قُرئت لهذا المقال

شاركها.

التعليقات مغلقة.