Skip to content
VDS · Docker اور کنٹینرز

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