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ستختفي. راجع وحدات التخزين. - بلا حدود للذاكرة. تلتهم خدمة واحدة كل ذاكرة الجهاز، فيقتل النواة جيرانها. راجع حدود الموارد.