هذا المقال يتطلب مستوى: مبتدئ
لو بتفتح 3 نوافذ terminal كل صبح وبتشغّل قاعدة البيانات في واحدة والتطبيق في تانية والـ Redis في تالتة، أنت بتدفع 4 دقائق ضايعة كل يوم وبتنسى متغير environment مرة من كل أسبوعين. Docker Compose بيلخّص ده كله في ملف واحد وأمر واحد اسمه docker compose up. هتطلع من المقال ده وأنت قادر تشغّل تطبيق Node.js + PostgreSQL + Redis في 28 ثانية بدون ما تلمس أي terminal تاني.
Docker Compose: نسّق containers زي أوركسترا بملف واحد
المشكلة باختصار
تطبيق Web الحقيقي مش container واحد. هو على الأقل: تطبيق (Node.js أو Python أو Go)، قاعدة بيانات (PostgreSQL مثلاً)، وكاش (Redis غالباً). تشغيل كل واحد فيهم لوحده يدوياً معناه: تذاكر port mapping، تعرّف network مشتركة، تتذكر متغيرات environment، وتفتكر الترتيب الصح. لو نسيت ترتيب، التطبيق بيقع لأن قاعدة البيانات لسه ما اتفتحتش.
المبتدئ غالباً بيخش في رحلة من 6 أوامر docker run بـ flags طويلة، وأي تعديل بسيط معناه إغلاق كل حاجة وتشغيلها من الأول. ده مش شغل، ده هدر وقت.
المفهوم بمثال للمبتدئ: الأوركسترا والقائد
تخيّل أوركسترا فيها 3 عازفين: عازف بيانو (التطبيق)، عازف كمان (قاعدة البيانات)، وعازف طبلة (Redis). من غير قائد، كل واحد بيبدأ في وقته الخاص والنتيجة فوضى. القائد بيقرا "نوتة" واحدة، بيقول لكل عازف يبدأ امتى، وبيتأكد إن الكل سامع بعض على نفس النغمة.
الفرق هنا إن القائد ده مش بشر. هو ملف نصي اسمه docker-compose.yml، نوتة مكتوبة. كل ما تكتب docker compose up، الأوركسترا بتتشكّل من الصفر في ثواني، وكل service بيلاقي الباقي على شبكة مشتركة بأسمائهم — مش بـ IP عشوائي.
التعريف العلمي الدقيق
Docker Compose أداة رسمية من Docker Inc. بتعرّف وتشغّل تطبيقات multi-container باستخدام ملف YAML واحد. هي بديل لـ docker run اليدوي، وبتدير 4 حاجات: shared network بين الـ services، dependencies (مين يبدأ قبل مين)، volumes للـ persistence (data ميتفقدش بعد restart)، وbuild context للصور المخصّصة من Dockerfile محلي.
النسخة الحالية اسمها Compose v2، مكتوبة بـ Go ومدمجة كـ plugin مع Docker CLI. الأمر بقى docker compose (بمسافة)، مش docker-compose القديم اللي كان مكتوب بـ Python. لو لقيت توتوريال قديم بيستخدم الشكل القديم، السطاكسات نفسها بس الأمر اتغيّر.
مثال تنفيذي: تطبيق + PostgreSQL + Redis في ملف واحد
الملف ده بيشغّل تطبيق Node.js على بورت 3000، قاعدة PostgreSQL، وRedis، كلهم على شبكة افتراضية بيعملها Compose تلقائياً:
services:
app:
build: .
ports: ["3000:3000"]
environment:
DATABASE_URL: postgres://user:pass@db:5432/app
REDIS_URL: redis://cache:6379
depends_on: [db, cache]
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: app
volumes: ["pgdata:/var/lib/postgresql/data"]
cache:
image: redis:7-alpine
volumes:
pgdata: