نظرة عامة
يحدد 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 لتضمينها. مفيد لخدمات تصحيح أخطاء أو أكوام مراقبة اختيارية.
كيف تم التحقق من هذا الدليل
كُتب يدويًا من الوثائق الرسمية، وأُعيد فحص كل أمر، ثم رُوجع مرة ثانية قبل النشر. آخر مراجعة في .
المصادر الرسمية التي قُرئت لهذا المقال

