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کے بعد یہ غائب ہو جائے گا۔ دیکھیں والیومز۔ - میموری کی حدوں کا نہ ہونا۔ ایک سروس پوری مشین کی میموری کھا جاتی ہے، اور کرنل اس کے پڑوسیوں کو مار دیتا ہے۔ دیکھیں ریسورس کی حدیں۔