docker-compose आपके पास आदेशों का एक टन लिखने के लिए मौजूद रहता है जो आपको docker-cli के साथ करना होगा।
docker-compose भी एक ही समय में कई कंटेनरों को स्टार्टअप करना आसान बनाता है और स्वचालित रूप से उन्हें किसी न किसी रूप में नेटवर्किंग के साथ जोड़ता है।
Docker-compose का उद्देश्य docker cli के रूप में कार्य करना है, लेकिन कई कमांड को अधिक तेज़ी से जारी करना है।
डॉकटर-कम्पोज़ का उपयोग करने के लिए, आपको उन कमांड्स को एनकोड करना होगा जो आप एक docker-compose.ymlफाइल में पहले चला रहे थे ।
आप उन्हें यम फ़ाइल में पेस्ट करने के लिए नहीं जा रहे हैं, एक विशेष वाक्यविन्यास है।
एक बार बनाने के बाद, आपको इसे डॉकटर-कम्पोज़ी क्ली को फीड करना होगा और यह फ़ाइल को पार्स करने और हमारे द्वारा निर्दिष्ट सही कॉन्फ़िगरेशन के साथ सभी विभिन्न कंटेनरों को बनाने के लिए क्ली तक होगा।
तो आपके पास अलग कंटेनर होंगे, उदाहरण के लिए कह सकते हैं, एक है redis-serverऔर दूसरा है node-appऔर आप चाहते हैं कि Dockerfileआपकी वर्तमान निर्देशिका में इसका उपयोग करके बनाया जाए ।
इसके अतिरिक्त, उस कंटेनर को बनाने के बाद आप कंटेनर से लोकल मशीन में कुछ पोर्ट मैप करेंगे ताकि उसके अंदर चल रही हर चीज को एक्सेस किया जा सके।
तो अपनी docker-compose.ymlफ़ाइल के लिए आप पहली पंक्ति को शुरू करना चाहते हैं जैसे:
version: '3'
यह बताता है कि डॉकर जिस संस्करण का docker-composeआप उपयोग करना चाहते हैं। उसके बाद आपको जोड़ना होगा:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
कृपया इंडेंटेशन पर ध्यान दें, बहुत महत्वपूर्ण है। इसके अलावा, एक सेवा के लिए नोटिस मैं एक छवि को हथियाने वाला हूं, लेकिन दूसरी सेवा के लिए मैं docker-composeउस छवि को बनाने के लिए वर्तमान निर्देशिका के अंदर देखने के लिए कह रहा हूं जिसका उपयोग दूसरे कंटेनर के लिए किया जाएगा।
फिर आप सभी अलग-अलग बंदरगाहों को निर्दिष्ट करना चाहते हैं जो आप इस कंटेनर पर खोलना चाहते हैं।
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
-
कृपया ध्यान दें, यम फ़ाइल में एक डैश है कि हम एक सरणी कैसे निर्दिष्ट करते हैं। इस उदाहरण में मैं 8081अपने स्थानीय मशीन 8081पर कंटेनर पर मैपिंग कर रहा हूं जैसे:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "8081:8081"
तो पहला पोर्ट आपकी स्थानीय मशीन है, और दूसरा कंटेनर पर पोर्ट है, आप भ्रम की स्थिति से बचने के लिए दोनों के बीच अंतर कर सकते हैं:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "4001:8081"
अपनी docker-compose.ymlफ़ाइल को इस तरह से विकसित करने से यह इन कंटेनरों को अनिवार्य रूप से एक ही नेटवर्क पर बनाएगा और उनके पास एक दूसरे के साथ संवाद करने और किसी भी तरह से संपर्क करने की उनकी नि: शुल्क पहुंच होगी और वे जितनी चाहें उतनी जानकारी का आदान-प्रदान करेंगे।
जब दो कंटेनरों का उपयोग करके बनाया जाता है docker-composeतो हमें किसी पोर्ट घोषणा की आवश्यकता नहीं होती है।
अब मेरे उदाहरण में, हमें Nodejs ऐप में कुछ कोड कॉन्फ़िगरेशन करने की आवश्यकता है जो कुछ इस तरह दिखता है:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server'
});
मैं ऊपर दिए गए इस उदाहरण का उपयोग आपको यह बताने के लिए करता हूं docker-compose.ymlकि आपके प्रोजेक्ट के लिए विशिष्ट फ़ाइल के अतिरिक्त कुछ विशिष्ट कॉन्फ़िगरेशन भी हो सकते हैं।
अब, यदि आप कभी भी अपने आप को एक Nodejs ऐप के साथ काम करते हुए पाते हैं और आप यह सुनिश्चित करना चाहते हैं कि आप डिफ़ॉल्ट पोर्ट Nodejs के उपयोग से अवगत हैं, तो मैं इसे जोड़ूंगा:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server',
port: 6379
});
इसलिए डॉकर यह देखने वाला है कि नोड ऐप खोज रहा है redis-serverऔर इस चालू कंटेनर में उस कनेक्शन को रीडायरेक्ट करता है।
पूरे समय, Dockerfileकेवल यह होता है:
FROM node:alpine
WORKDIR '/app'
COPY /package.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
इसलिए, जबकि इससे पहले कि आप docker run myimageफ़ाइल के अंदर सभी कंटेनरों या सेवाओं का एक उदाहरण बनाने के लिए दौड़ सकते हैं जिसे आप बजाय चला सकते हैं, docker-compose upऔर आपको एक छवि निर्दिष्ट करने की आवश्यकता नहीं है क्योंकि डॉकर वर्तमान कार्यशील निर्देशिका में दिखेगा और पहले की तलाश करेगा docker-compose.ymlवहाँ अंदर फ़ाइल करें।
इससे पहले docker-compose.yml, हम की दो अलग-अलग आदेशों का सामना करना पड़ा docker build .और docker run myimageहै, लेकिन में docker-composeदुनिया आप अपने चित्रों तुम लिखो पुनर्निर्माण करना चाहते हैं docker-compose up --build। यह डॉकटर को कंटेनरों को फिर से शुरू करने के लिए कहता है लेकिन नवीनतम परिवर्तनों को प्राप्त करने के लिए इसका पुनर्निर्माण करता है।
इसलिए docker-composeकई कंटेनरों के साथ काम करना आसान बनाता है। अगली बार जब आप पृष्ठभूमि में कंटेनरों के इस समूह को शुरू कर सकते हैं जो आप कर सकते हैं docker-compose up -dऔर उन्हें रोकने के लिए आप कर सकते हैं docker-compose down।