Docker_compose.yml में लिंक और depend_on के बीच अंतर


292

डॉकटर कम्पोज़ के फ़ाइल-दस्तावेज़ के अनुसार :

  • depends_on - सेवाओं के बीच एक्सप्रेस निर्भरता।
  • links- एक अन्य सेवा में कंटेनरों से लिंक और निर्भरता के रूप में उसी तरह सेवाओं के बीच निर्भरता भी व्यक्त करते हैं

मैं अन्य कंटेनरों से जुड़ने के उद्देश्य को नहीं समझता हूं, इसलिए दो विकल्पों के बीच का अंतर अभी भी मेरे लिए काफी मुश्किल है।

अगर कोई उदाहरण है तो यह बहुत आसान होगा, लेकिन मुझे कोई नहीं मिल सकता है।

मैंने देखा, जब मैं कंटेनर B को कंटेनर A से जोड़ता हूं तो कंटेनर A कंटेनर के खोल के अंदर "पिंगेबल" होगा।

मैं ping Bकंटेनर ए के अंदर भाग bashगया और इस तरह परिणाम आया (सिर्फ संदर्भ के लिए, इंटरनेट से छवि)

यहां छवि विवरण दर्ज करें


6
--linkझंडा अब डोकर की एक पदावनत विरासत सुविधा है और प्रलेखन पता चलता है "यह अंत में हटाया जा सकता है" डोकर: विरासत कंटेनर लिंक । यह सुझाव दिया जाता है कि डॉकर नेटवर्क सुविधा या डॉक कम्पोज़ विधि का उपयोग न करें । मुझे लगा कि इस सुविधा के बारे में जानने के लिए यह किसी के लिए भी उपयोगी होगा।
एक स्टार

जवाबों:


122

linksविकल्प को हटाए जाने के बाद पोस्ट को एक अपडेट की आवश्यकता होती है।

मूल रूप से, linksअब इसकी आवश्यकता नहीं है क्योंकि इसके मुख्य उद्देश्य, पर्यावरण चर को जोड़कर कंटेनर को एक दूसरे से पहुंच योग्य बनाना, इसके साथ निहित है network। जब कंटेनरों को एक ही नेटवर्क में रखा जाता है, तो वे अपने कंटेनर के नाम और होस्ट के रूप में अन्य उपनामों का उपयोग करके एक-दूसरे द्वारा पहुंच जाते हैं।

के लिए docker run, --linkपदावनत भी किया जाता है और इसे कस्टम नेटवर्क द्वारा प्रतिस्थापित किया जाना चाहिए।

docker network create mynet
docker run -d --net mynet --name container1 my_image
docker run -it --net mynet --name container1 another_image

depends_onएक्सप्रेस ऑर्डर शुरू होता है (और स्पष्ट रूप से छवि पुलिंग ऑर्डर), जो का एक अच्छा पक्ष प्रभाव था links


13
आम StackOverflow, मुझे 147 और 43 बिंदुओं के नीचे स्क्रॉल करने के लिए 1 बिंदु उत्तर खोजने के लिए वास्तव में सबसे अच्छा क्यों है।
u8it

3
@ u8it यह समय और इंटरनेट की प्रकृति है।
माइकल कोल

डॉकटर-कंपोज में एक ही काम कैसे करें? मुझे लगता है कि डॉक कंपोज़ के साथ सभी सेवाएं पहले से ही एक ही नेटवर्क में हैं और इसमें कुछ भी जोड़ने की आवश्यकता नहीं है। यदि कंटेनर में से कोई एक कंटेनर से जुड़ने की कोशिश कर रहा है जो तैयार राज्य में नहीं है, तब भी कंटेनरों के बीच लिंक करना काम नहीं करता है।
मक्कसी

मैं डॉकटर-कंपोज़ संस्करण 3 डॉक्स में हटाए जा रहे लिंक के बारे में जानकारी नहीं देख सकता: docs.docker.com/compose/compose-file/#links । मुझे विकल्प बहुत उपयोगी नहीं दिख रहा है, क्योंकि हमारे पास साझा नेटवर्क और depend_on हैं, लेकिन अगर मैं डॉक्स को सही ढंग से पढ़ता हूं (तो वे केवल docker कंटेनर पर -link ध्वज का उल्लेख करते हैं) यह अपग्रेड नहीं किया गया है।
राइडरथॉस्टॉर्मॉर्म

नोट: एक ही नेटवर्क में कंटेनर (वास्तव में सेवाएं) सेवा नाम से सुलभ हैं, कंटेनर नाम से नहीं। आधिकारिक दस्तावेज: docs.docker.com/compose/networking/#links
गैरीऑन

194

यह उत्तर docker-compose संस्करण 2 के लिए है और यह संस्करण 3 पर भी काम करता है

जब आप depend_on का उपयोग करते हैं तब भी आप डेटा तक पहुँच सकते हैं।

यदि आप डॉक डॉक्स डॉकर कम्पोज़ और Django को देखते हैं , तो भी आप इस तरह से डेटाबेस तक पहुँच सकते हैं:

version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

लिंक और depend_on के बीच क्या अंतर है?

लिंक:

जब आप डेटाबेस के लिए एक कंटेनर बनाते हैं, उदाहरण के लिए:

docker run -d --name=test-mysql --env="MYSQL_ROOT_PASSWORD=mypassword" -P mysql

docker inspect d54cf8a0fb98 |grep HostPort

और आप पा सकते हैं

"HostPort": "32777"

इसका मतलब है कि आप डेटाबेस को अपने लोकलहोस्ट पोर्ट 32777 (कंटेनर में 3306) से कनेक्ट कर सकते हैं लेकिन यह पोर्ट हर बार आपके द्वारा कंटेनर को पुनरारंभ करने या निकालने पर बदल जाएगा। इसलिए आप यह सुनिश्चित करने के लिए लिंक का उपयोग कर सकते हैं कि आप हमेशा डेटाबेस से जुड़ेंगे और यह नहीं जान पाएंगे कि यह कौन सा पोर्ट है।

web:
  links:
   - db

निर्भर करता है:

मुझे Giorgio Ferraris Docker-compose.yml: V1 से V2 तक एक अच्छा ब्लॉग मिला

जब docker-compose V2 फ़ाइलों को निष्पादित करता है, तो यह स्वचालित रूप से फ़ाइल में परिभाषित सभी कंटेनरों के बीच एक नेटवर्क का निर्माण करेगा, और प्रत्येक कंटेनर तुरंत docker-compose.yml फ़ाइल में परिभाषित नामों का उपयोग करके दूसरों को संदर्भित करने में सक्षम होगा।

तथा

इसलिए हमें अब लिंक की आवश्यकता नहीं है; हमारे db कंटेनर और हमारे वेब-सर्वर कंटेनर के बीच नेटवर्क संचार शुरू करने के लिए लिंक का उपयोग किया गया था, लेकिन यह पहले से ही docker-compose द्वारा किया गया है

अपडेट करें

निर्भर करता है

सेवाओं के बीच एक्सप्रेस निर्भरता, जिसके दो प्रभाव हैं:

  • docker-compose upनिर्भरता क्रम में सेवाएं शुरू करेंगे। निम्नलिखित उदाहरण में, db और redis वेब से पहले शुरू किया जाएगा।
  • docker-compose up SERVICEस्वचालित रूप से सेवा की निर्भरता शामिल करेगा। निम्नलिखित उदाहरण में, docker-compose up web भी db और redis बनाएंगे और शुरू करेंगे।

सरल उदाहरण:

version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

नोट: depend_on वेब शुरू करने से पहले db और redis के लिए "तैयार" होने का इंतजार नहीं करेगा - केवल तब तक जब तक कि उन्हें शुरू नहीं किया गया हो। यदि आपको किसी सेवा के तैयार होने की प्रतीक्षा करने की आवश्यकता है, तो इस समस्या के लिए स्टार्टअप आदेश को नियंत्रित करने और इसे हल करने के लिए रणनीतियों को देखें।


मैंने अपने उत्तर को स्पष्ट करने के लिए अद्यतन किया है कि यह उत्तर फ़ाइल v1 की रचना के लिए था।
जिओंगबिंग जिन

1
क्या यह अभी भी संस्करण 3 के लिए मान्य है?
फेबियोमिया

हां, आपकी नज़र एक नज़र में हैhttps://docs.docker.com/compose/compose-file/compose-versioning/
विंडसून

"इसका मतलब है कि आप डेटाबेस को अपने लोकलहोस्ट पोर्ट 32777 (कंटेनर में 3306) से कनेक्ट कर सकते हैं लेकिन यह पोर्ट हर बार आपके द्वारा कंटेनर को पुनरारंभ करने या निकालने पर बदल जाएगा" यदि आप पोर्ट बाइकर-डोज़-फाइल में निर्दिष्ट करते हैं, तो यह नहीं होगा । और चूंकि यह प्रश्न विशेष रूप से डॉकटर-कम्पोज़ के बारे में है, इसलिए मुझे लगता है कि docker runयहाँ उदाहरण पूरी तरह से अप्रासंगिक है, वैसे भी कंटेनर को कैसे चलाया जाएगा। मैं क्या खो रहा हूँ?
एंड्रयू सविनाख

यदि आप पोर्ट निर्दिष्ट करते हैं, तो आप सही हैं। मेरा docker run उदाहरण इंगित करना चाहता है कि हमें हार्ड-कोड के बजाय depend_on या लिंक का उपयोग करने की आवश्यकता है क्योंकि पोर्ट नंबर। अन्याय क्योंकि यदि आप इसे निर्दिष्ट नहीं करते हैं, तो यह हर बार बदलता है। मुझे लगता है कि यह लोगों को depend_on या लिंक के बारे में अधिक समझने देगा।
विंडसून

50

[अद्यतन सितम्बर २०१६]: यह उत्तर डॉक कंपोज़ फ़ाइल v1 (जैसा कि नीचे दिए गए सैंपल कम्पोज़ फ़ाइल द्वारा दिखाया गया है) के लिए था। V2 के लिए, @Windsooon द्वारा अन्य उत्तर देखें।

[मूल उत्तर]:

यह प्रलेखन में बहुत स्पष्ट है। depends_onकंटेनर निर्माण की निर्भरता और क्रम का फैसला करता है और linksन केवल ये करता है, बल्कि यह भी

लिंक की गई सेवा के लिए कंटेनर होस्ट नाम पर अन्य नाम के समान उपलब्ध होंगे, या यदि कोई अन्य नाम निर्दिष्ट नहीं किया गया था तो सेवा का नाम।

उदाहरण के लिए, निम्न docker-compose.ymlफ़ाइल को मानते हुए :

web:
  image: example/my_web_app:latest
  links:
    - db
    - cache

db:
  image: postgres:latest

cache:
  image: redis:latest

इसके साथ links, कोड webका उपयोग करके डेटाबेस का उपयोग करने में सक्षम हो जाएगा db:5432, यह मानते हुए कि पोर्ट 5432 dbछवि में सामने आया है । यदि depends_onउपयोग किया जाता है, तो यह संभव नहीं होगा, लेकिन कंटेनरों का स्टार्टअप क्रम सही होगा।


क्या आप मुझे एक उदाहरण दे सकते हैं? क्योंकि वह हिस्सा वह है जिसके बारे में मैं अभी भी स्पष्ट नहीं हूं। हो सकता है कि अन्य रचना-फ़ाइल विकल्प हैं जो इसे और अधिक विशिष्ट बना सकते हैं। कृपया आगे के विवरण दीजिए। धन्यवाद!
इसकाजफ

आपका बहुत बहुत धन्यवाद! मैं समझ गया। एक अंतिम प्रश्न, कृपया। तो, मेरी विशेष मामले में, मैं अपने पटरियों ऐप का परिनियोजन कर रहा हूँ, मैं का उपयोग करना चाहिए linksया depends_onया उनमें से या तो ठीक है? मेरे वर्तमान docker-compose.ymlउपयोग depends_onऔर चीजें ठीक काम करने लगती हैं। :)
इसकाजफ

यदि आपको सीधे अन्य कंटेनर तक पहुंचने की आवश्यकता नहीं है, name:portतो depends_onठीक है।
जिओंगबिंग जिन

9
नाम: पोर्ट तब भी बिना लिंक किए काम करता है जब आप एक्सपोज़ करते हैं:
अमित गोल्डस्टीन

7
"अगर depend_on का उपयोग किया गया था, तो यह संभव नहीं होगा, लेकिन कंटेनरों का स्टार्टअप क्रम सही होगा।" यह सही नहीं है। यदि आप सिर्फ depend_on का उपयोग करते हैं तो यह काम करेगा। आप अभी भी अपने उपयोग कर सकते हैं dbमें webउपयोग करते हुए डेटाबेस होस्ट नाम।
प्रोगुशन।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.