डॉकर कंपोज़ चिटशीट - सबसे उपयोगी कमांड्स के साथ उदाहरण
BTW, docker-compose docker compose से अलग है...
यहाँ एक Docker Compose चिट्ठी उदाहरणों के साथ एनोटेटेड है जो आपको Compose फाइलों और कमांड्स को तेज़ी से मास्टर करने में मदद करेगा।
Compose File Reference: docker-compose.yml
कोर स्ट्रक्चर:
version: '3' # Compose file format version
services:
web:
image: nginx:latest
ports:
- "8080:80" # Host port 8080:Container port 80
db:
image: postgres
environment: # Environment variables
POSTGRES_PASSWORD: example
volumes:
- db_data:/var/lib/postgresql/data
networks: # Custom network
appnet:
driver: bridge
volumes: # Named volume
db_data:
- services: आपके मल्टी-कंटेनर ऐप में हर कंटेनर। ऊपर के उदाहरण में हमारी दो सेवाएं हैं:
web
औरdb
। - networks & volumes: अलग-अलग नेटवर्क और स्थायी स्टोरेज को परिभाषित करें - यहाँ
appnet
नेटवर्क औरdb_data
वॉल्यूम है।
उदाहरण
एकल सेवा के साथ पोर्ट मैपिंग
services:
app:
build: .
ports:
- "8000:80" # Host port 8000:Container port 80
एप्लिकेशन को होस्ट पोर्ट 8000 पर एक्सपोज करता है और वर्तमान डायरेक्टरी में Dockerfile से बिल्ड करता है।
मल्टी-सर्विस के साथ शेयर्ड वॉल्यूम और कस्टम नेटवर्क
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- type: bind
source: ./app
target: /app
networks:
- mynet
db:
image: postgres
volumes:
- db_data:/var/lib/postgresql/data
networks:
- mynet
networks:
mynet:
volumes:
db_data:
वेब और DB एक ही नेटवर्क पर हैं; DB एक स्थायी नामित वॉल्यूम का उपयोग करता है - db_data
।
बिल्ड कॉन्टेक्स्ट और Dockerfile पाथ का उपयोग
आप डॉकर इमेज बिल्ड को docker-compose.yml में निर्दिष्ट Dockerfile से मांग पर बिल्ड कर सकते हैं।
services:
app:
build:
context: .
dockerfile: docker/MyDockerfile
सेवाओं के बीच डेटा शेयरिंग
services:
web:
image: nginx
volumes:
- shared_data:/usr/share/nginx/html
worker:
image: myworker
volumes:
- shared_data:/usr/src/app/data
volumes:
shared_data:
दोनों सेवाएं एक ही वॉल्यूम तक पहुंचती हैं (स्टैटिक फाइलों या डेटा एक्सचेंज के लिए) - shared_data
।
एडवांस्ड Compose File विकल्प
- environment: कंटेनरों के लिए ENV चर सेट करें।
- depends_on: सेवा स्टार्टअप ऑर्डर को नियंत्रित करें।
- deploy.replicas: Swarm mode में सेवा को स्केल करें।
उदाहरण:
services:
web:
image: nginx
deploy:
replicas: 3
depends_on:
- db
3 वेब इंस्टेंस स्टार्ट करता है; केवल स्टार्टअप ऑर्डर को नियंत्रित करता है (रेडीनेस नहीं)।
एसेंशियल Docker Compose कमांड्स
Command | Description | Example Usage |
---|---|---|
docker-compose up |
कंटेनर बनाता और स्टार्ट करता है | docker-compose up |
docker-compose up -d |
बैकग्राउंड में चलाएं | docker-compose up -d |
docker-compose exec |
चल रहे कंटेनर में कमांड एक्सीक्यूट करें | docker-compose exec web bash |
docker-compose build |
इमेजेस बिल्ड/रीबिल्ड करें | docker-compose build |
docker-compose down |
कंटेनर, नेटवर्क, वॉल्यूम, और इमेजेस को स्टॉप और हटाएं | docker-compose down |
docker-compose logs -f |
लॉग्स देखें और फॉलो करें | docker-compose logs -f |
docker-compose ps |
चल रहे कंटेनर सूची बनाएं | docker-compose ps |
docker-compose run |
वन-ऑफ कमांड्स चलाएं (Compose file में कमांड बाइपास) | docker-compose run web python manage.py migrate |
docker-compose stop |
चल रहे कंटेनर स्टॉप करें (पुनः स्टार्ट start के साथ) |
docker-compose stop |
docker-compose restart |
सेवाओं को रीस्टार्ट करें | docker-compose restart web |
docker-compose pull |
सेवा इमेजेस पुल करें | docker-compose pull |
docker-compose rm |
स्टॉप की गई सेवा कंटेनर हटाएं | docker-compose rm web |
docker-compose config |
Compose file वैलिडेट और देखें | docker-compose config |
docker-compose up --scale web=3 |
एक सेवा के कई इंस्टेंस स्टार्ट करें | docker-compose up --scale web=3 |
कॉमन Compose पैटर्न
-
पर्सिस्टेंट डेटा के साथ डेटाबेस
services: mysql: image: mysql environment: MYSQL_ROOT_PASSWORD: password volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:
DB डेटा
mysql_data
वॉल्यूम में कंटेनर रीस्टार्ट्स के बीच पर्सिस्ट रहता है। -
डेवलपमेंट के लिए कोड बाइंड माउंटिंग
services: app: build: . volumes: - .:/app
होस्ट पर लाइव-एडिट कोड, कंटेनर में स्वचालित रूप से प्रतिबिंबित होता है।
उपयोगी फ्लैग्स
-d
: डिटैच मोड (बैकग्राउंड में चलाएं)।--build
: स्टार्ट करने से पहले इमेजेस को फोर्स रीबिल्ड करें।--force-recreate
: कंटेनर को रीक्रिएट करें भले ही वे अपरिवर्तित हों।--remove-orphans
: Compose file में परिभाषित नहीं किए गए कंटेनर हटाएं।
सेवाओं को परिभाषित और कस्टमाइज़ करना
आप सेवाओं, नेटवर्क, और वॉल्यूम को परिभाषित और कस्टमाइज़ कर सकते हैं Docker Compose का उपयोग करके docker-compose.yml
फाइल, जो आपकी एप्लिकेशन के सभी कॉन्फ़िगरेशन और ऑर्केस्ट्रेशन की आवश्यकताओं को सेंट्रलाइज़ करता है।
- सेवाएं
services
की में परिभाषित की जाती हैं। - हर सेवा एक कंटेनर कॉन्फ़िगरेशन का प्रतिनिधित्व करती है, जहाँ आप सेट कर सकते हैं:
- इमेज: Docker Hub या अन्य रजिस्ट्री से एक इमेज चुनें।
- पोर्ट्स: कंटेनर पोर्ट्स को होस्ट पोर्ट्स से मैप करें।
- एन्वायरनमेंट वेरिएबल्स: कॉन्फ़िगरेशन वैल्यूज पास करें।
- वॉल्यूम: डेटा पर्सिस्ट करें या फाइलों/फोल्डरों को होस्ट या अन्य सेवाओं के साथ शेयर करें।
- नेटवर्क: नियंत्रित करें कि सेवा किस नेटवर्क तक पहुंच सकती है।
उदाहरण:
services:
web:
image: nginx:latest
ports:
- "8080:80" # Host port 8080:Container port 80
environment:
- NGINX_HOST=localhost
volumes:
- web_data:/usr/share/nginx/html
networks:
- frontend
db:
image: postgres:13
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: secret
volumes:
- db_data:/var/lib/postgresql/data
networks:
- backend
- यहाँ,
web
सेवा nginx इमेज का उपयोग करती है, एक एन्वायरनमेंट वेरिएबल सेट करती है, एक वॉल्यूम अटैच करती है, होस्ट पर पोर्ट 80 को 8080 के रूप में ओपन करती है, औरfrontend
नेटवर्क से कनेक्ट होती है।db
सेवा PostgreSQL के लिए कुछ समान करती है।
नेटवर्क को कस्टमाइज़ करना
- नेटवर्क नियंत्रित करते हैं कि किस सेवा को संचार करने की अनुमति है। Compose एक डिफ़ॉल्ट नेटवर्क बनाता है, लेकिन आप और अधिक परिभाषित कर सकते हैं, कस्टम ड्राइवर सेट कर सकते हैं, विकल्प सेट कर सकते हैं, और निर्धारित कर सकते हैं कि किस सेवा को किस नेटवर्क में शामिल होना चाहिए फाइन-ग्रेन्ड आइसोलेशन के लिए।
- नेटवर्क को टॉप-लेवल में
networks
के तहत परिभाषित करें, और सेवा-लेवलnetworks
की के साथ सूचीबद्ध करें कि किस सेवा को किस नेटवर्क में शामिल होना चाहिए।
उदाहरण:
networks:
frontend:
driver: bridge
backend:
driver: bridge
driver_opts:
com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
- नेटवर्क को सेवाओं से अटैच करें:
services:
app:
networks:
- frontend
- backend
db:
networks:
- backend
- इस सेटअप में
app
सेवा कोfrontend
औरbackend
नेटवर्क दोनों पर उपयोगकर्ताओं तक पहुंचने की अनुमति है, जबकिdb
केवलbackend
के भीतर ही एक्सेस किया जा सकता है।
वॉल्यूम को कस्टमाइज़ करना
- वॉल्यूम टॉप-लेवल
volumes
की के तहत परिभाषित किए जाते हैं। उन्हें कंटेनरों में माउंट करने के लिए सेवा-लेवलvolumes
की का उपयोग करें। - वॉल्यूम नामित हो सकते हैं, कस्टम ड्राइवर का उपयोग कर सकते हैं, और डेटा पर्सिस्टेंस और शेयरिंग के लिए कई सेवाओं के बीच शेयर किए जा सकते हैं।
उदाहरण:
volumes:
web_data: # वेब कंटेंट के लिए नामित वॉल्यूम
db_data: # डेटाबेस के लिए नामित वॉल्यूम
services:
web:
volumes:
- web_data:/usr/share/nginx/html
db:
volumes:
- db_data:/var/lib/postgresql/data
- इस उदाहरण में,
web_data
पर्सिस्ट रहता है और इसे कोई भी कंटेनर माउंट करता है।db_data
सुनिश्चित करता है कि डेटाबेस डेटा कंटेनर रीक्रिएशन पर कभी नहीं खोता। - आप एडवांस्ड केस के लिए कस्टम ड्राइवर विकल्पों के साथ बाइंड-माउंट्स परिभाषित कर सकते हैं:
volumes:
db_data:
driver: local
driver_opts:
type: none
device: /data/db_data
o: bind
- यह कॉन्फ़िगरेशन होस्ट पाथ
/data/db_data
को कंटेनर में बाइंड-माउंट सेटअप करता है।
बेस्ट प्रैक्टिसेस का सारांश:
- इंटर-सर्विस कम्युनिकेशन के लिए सेवा नाम का उपयोग DNS होस्टनेम के रूप में करें।
- आवश्यकता के अनुसार सेवाओं को कई नेटवर्कों से अटैच करें ताकि एक्सेस को नियंत्रित किया जा सके।
- पर्सिस्टेंट स्टोरेज और डेटा शेयरिंग के लिए नामित वॉल्यूम का उपयोग करें।
- सब कुछ YAML का उपयोग करके परिभाषित करें, जिससे वर्जन कंट्रोल और आसान डिप्लॉयमेंट स्क्रिप्ट्स संभव हो सकें।
मल्टीपल कंपोज फाइलें
डॉकर कंपोज में जटिल मल्टी-सर्विस सेटअप्स को संगठित करने के लिए, आप मल्टीपल कंपोज फाइलें और ओवरराइड फाइलें का उपयोग कर सकते हैं, जिससे मॉड्यूलर, पर्यावरण-विशिष्ट, और स्केलेबल कॉन्फ़िगरेशन संभव होती हैं। यह कैसे काम करता है, इसके बारे में जानें:
- बेस और ओवरराइड फाइल संरचना
- एक बेस फाइल बनाएं (
compose.yaml
याdocker-compose.yml
) जिसमें सभी सामान्य, डिफ़ॉल्ट सर्विस डिफ़िनिशन हों। - पर्यावरण-विशिष्ट ओवरराइड फाइलें जोड़ें (उदाहरण के लिए,
docker-compose.override.yml
,docker-compose.dev.yml
,docker-compose.prod.yml
)।
उदाहरण फाइल संरचना:
/project-directory
|-- docker-compose.yml # बेस कॉन्फ़िगरेशन
|-- docker-compose.override.yml # लोकल/डेव ओवरराइड्स (स्वतः लागू होते हैं)
|-- docker-compose.prod.yml # प्रोडक्शन ओवरराइड्स
|-- docker-compose.test.yml # टेस्ट ओवरराइड्स (अगर आवश्यक हो)
बेस कॉन्फ़िगरेशन कोर सर्विसेस को परिभाषित करता है, जबकि प्रत्येक ओवरराइड एक विशिष्ट पर्यावरण या मामले के लिए सेटिंग्स को अनुकूलित करता है।
- फाइल ओवरराइड्स का कामकाज
- मर्जिंग: जब आप
docker compose up
चलाते हैं, तो डॉकर कंपोज बेस और किसी भी ओवरराइड्स को क्रमानुसार मर्ज करता है; बाद की फाइलें पिछली फाइलों में परिभाषित सेटिंग्स को ओवरराइड, एक्सटेंड, या जोड़ती हैं। - फील्ड्स ओवरराइड करना: अगर एक सर्विस या फील्ड कई फाइलों में परिभाषित है, तो अंतिम-स्पेसिफाइड फाइल का मान उपयोग किया जाता है। नए फील्ड्स जोड़े जाते हैं।
उदाहरण मर्ज:
docker-compose.yml
:services: web: image: myapp ports: - "8000:80"
docker-compose.override.yml
:services: web: environment: - DEBUG=true
- परिणाम:
web
सर्विस बेस इमेज और पोर्ट के साथ-साथ ओवरराइडेडDEBUG
एन्वायरनमेंट वेरिएबल का उपयोग करता है।
- मल्टीपल फाइलें के लिए कमांड उपयोग
- डिफ़ॉल्ट व्यवहार: अगर मौजूद है, तो डॉकर कंपोज स्वतः
docker-compose.override.yml
कोdocker-compose.yml
के साथ लोड करता है जब आप कोई कमांड चलाते हैं। - फाइलें मैन्युअल रूप से स्पेसिफाई करना:
-f
फ्लैग्स का उपयोग करके नियंत्रित करें कि कौन सी फाइलें मर्ज की जाएंगी और किस क्रम में:docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
- यह डिफ़ॉल्ट ओवरराइड को नज़रअंदाज़ करता है और प्रोडक्शन-विशिष्ट सेटिंग्स का उपयोग करता है।
- प्रैक्टिकल संगठन रणनीतियाँ
- पर्यावरण अलगाव: हर पर्यावरण के लिए एक ओवरराइड का उपयोग करें: डेव, टेस्ट, प्रोड, आदि।
- माइक्रोसर्विसेस और टीम्स: कॉन्फ़िगरेशन को अलग-अलग सर्विसेस या टीम्स के लिए अलग-अलग फाइलों में तोड़ें, और आवश्यकता के अनुसार मिलाएं।
- फीचर टॉगल्स: अतिरिक्त फाइलें अस्थायी आवश्यकताओं के लिए वैकल्पिक सर्विसेस या कॉन्फ़िगरेशन को शामिल या हटाने के लिए उपयोग की जा सकती हैं (उदाहरण के लिए, एक
compose.debug.yml
अतिरिक्त लॉगिंग के लिए)।
- लाभ
- स्पष्टता: व्यक्तिगत फाइलें छोटी और केंद्रित रखती हैं।
- स्केलेबिलिटी: नई सर्विसेस, पर्यावरण, या सेटिंग्स को आसानी से जोड़ा जा सकता है।
- मेन्टेनेंस: किसी विशेष डिप्लॉयमेंट के लिए केवल संबंधित सेक्शन को बदलें या समीक्षा करें।
- उदाहरण: पर्यावरण स्विच करना
डेवलपमेंट:
docker compose -f docker-compose.yml -f docker-compose.dev.yml up
प्रोडक्शन:
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
हर पर्यावरण को केवल उसको आवश्यक कॉन्फ़िगरेशन मिलती है, जबकि सभी साझा कॉन्फ़िगरेशन बेस फाइल में होती है।
मल्टीपल फाइलें के साथ जटिल कंपोज सेटअप्स को संगठित करना - और ओवरराइड/मर्ज सिस्टम का लाभ उठाना - मॉड्यूलरिटी, पर्यावरण-विशिष्ट अनुकूलन, और बड़े, मल्टी-सर्विस डॉकर एप्लिकेशन्स के लिए आसान स्केलेबिलिटी सुनिश्चित करता है।