डॉकर कंपोज़ चिटशीट - सबसे उपयोगी कमांड्स के साथ उदाहरण

BTW, docker-compose docker compose से अलग है...

Page content

यहाँ एक Docker Compose चिट्ठी उदाहरणों के साथ एनोटेटेड है जो आपको Compose फाइलों और कमांड्स को तेज़ी से मास्टर करने में मदद करेगा।

docker-compose schema

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 का उपयोग करके परिभाषित करें, जिससे वर्जन कंट्रोल और आसान डिप्लॉयमेंट स्क्रिप्ट्स संभव हो सकें।

मल्टीपल कंपोज फाइलें

डॉकर कंपोज में जटिल मल्टी-सर्विस सेटअप्स को संगठित करने के लिए, आप मल्टीपल कंपोज फाइलें और ओवरराइड फाइलें का उपयोग कर सकते हैं, जिससे मॉड्यूलर, पर्यावरण-विशिष्ट, और स्केलेबल कॉन्फ़िगरेशन संभव होती हैं। यह कैसे काम करता है, इसके बारे में जानें:

  1. बेस और ओवरराइड फाइल संरचना
  • एक बेस फाइल बनाएं (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      # टेस्ट ओवरराइड्स (अगर आवश्यक हो)

बेस कॉन्फ़िगरेशन कोर सर्विसेस को परिभाषित करता है, जबकि प्रत्येक ओवरराइड एक विशिष्ट पर्यावरण या मामले के लिए सेटिंग्स को अनुकूलित करता है।

  1. फाइल ओवरराइड्स का कामकाज
  • मर्जिंग: जब आप docker compose up चलाते हैं, तो डॉकर कंपोज बेस और किसी भी ओवरराइड्स को क्रमानुसार मर्ज करता है; बाद की फाइलें पिछली फाइलों में परिभाषित सेटिंग्स को ओवरराइड, एक्सटेंड, या जोड़ती हैं।
  • फील्ड्स ओवरराइड करना: अगर एक सर्विस या फील्ड कई फाइलों में परिभाषित है, तो अंतिम-स्पेसिफाइड फाइल का मान उपयोग किया जाता है। नए फील्ड्स जोड़े जाते हैं।

उदाहरण मर्ज:

  • docker-compose.yml:
    services:
      web:
        image: myapp
        ports:
          - "8000:80"
    
  • docker-compose.override.yml:
    services:
      web:
        environment:
          - DEBUG=true
    
  • परिणाम: web सर्विस बेस इमेज और पोर्ट के साथ-साथ ओवरराइडेड DEBUG एन्वायरनमेंट वेरिएबल का उपयोग करता है।
  1. मल्टीपल फाइलें के लिए कमांड उपयोग
  • डिफ़ॉल्ट व्यवहार: अगर मौजूद है, तो डॉकर कंपोज स्वतः docker-compose.override.yml को docker-compose.yml के साथ लोड करता है जब आप कोई कमांड चलाते हैं।
  • फाइलें मैन्युअल रूप से स्पेसिफाई करना: -f फ्लैग्स का उपयोग करके नियंत्रित करें कि कौन सी फाइलें मर्ज की जाएंगी और किस क्रम में:
    docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
    
    • यह डिफ़ॉल्ट ओवरराइड को नज़रअंदाज़ करता है और प्रोडक्शन-विशिष्ट सेटिंग्स का उपयोग करता है।
  1. प्रैक्टिकल संगठन रणनीतियाँ
  • पर्यावरण अलगाव: हर पर्यावरण के लिए एक ओवरराइड का उपयोग करें: डेव, टेस्ट, प्रोड, आदि।
  • माइक्रोसर्विसेस और टीम्स: कॉन्फ़िगरेशन को अलग-अलग सर्विसेस या टीम्स के लिए अलग-अलग फाइलों में तोड़ें, और आवश्यकता के अनुसार मिलाएं।
  • फीचर टॉगल्स: अतिरिक्त फाइलें अस्थायी आवश्यकताओं के लिए वैकल्पिक सर्विसेस या कॉन्फ़िगरेशन को शामिल या हटाने के लिए उपयोग की जा सकती हैं (उदाहरण के लिए, एक compose.debug.yml अतिरिक्त लॉगिंग के लिए)।
  1. लाभ
  • स्पष्टता: व्यक्तिगत फाइलें छोटी और केंद्रित रखती हैं।
  • स्केलेबिलिटी: नई सर्विसेस, पर्यावरण, या सेटिंग्स को आसानी से जोड़ा जा सकता है।
  • मेन्टेनेंस: किसी विशेष डिप्लॉयमेंट के लिए केवल संबंधित सेक्शन को बदलें या समीक्षा करें।
  1. उदाहरण: पर्यावरण स्विच करना

डेवलपमेंट:

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

हर पर्यावरण को केवल उसको आवश्यक कॉन्फ़िगरेशन मिलती है, जबकि सभी साझा कॉन्फ़िगरेशन बेस फाइल में होती है।

मल्टीपल फाइलें के साथ जटिल कंपोज सेटअप्स को संगठित करना - और ओवरराइड/मर्ज सिस्टम का लाभ उठाना - मॉड्यूलरिटी, पर्यावरण-विशिष्ट अनुकूलन, और बड़े, मल्टी-सर्विस डॉकर एप्लिकेशन्स के लिए आसान स्केलेबिलिटी सुनिश्चित करता है।

उपयोगी लिंक्स