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 में सीक्रेट। उन्हें 600 परमिशन वाली .env में रखें और कमिट न करें।
  • docker-compose और docker compose मिलाना। पुराना v1 वर्ज़न कुछ सिंटैक्स नहीं समझता और प्रोजेक्ट अलग नामों से सेव करता है। प्लगइन इंस्टॉल करें — देखें Docker इंस्टॉलेशन।
  • वॉल्यूम की जगह कंटेनर में डेटा। docker compose down के बाद वह गायब हो जाएगा। देखें वॉल्यूम।
  • मेमोरी लिमिट न होना। एक सर्विस पूरी मशीन की मेमोरी खा जाती है, और कर्नल उसके पड़ोसियों को मार देता है। देखें रिसोर्स लिमिट।