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के बाद वह गायब हो जाएगा। देखें वॉल्यूम। - मेमोरी लिमिट न होना। एक सर्विस पूरी मशीन की मेमोरी खा जाती है, और कर्नल उसके पड़ोसियों को मार देता है। देखें रिसोर्स लिमिट।