मेजबान भर में डॉकर सेवाओं को कैसे लिंक करें?


115

डॉकर कई कंटेनरों के सर्वर को लिंक और सर्विस डिस्कवरी के माध्यम से एक दूसरे से कनेक्ट करने की अनुमति देता है । हालाँकि, मैं इस सेवा खोज को होस्ट-लोकल क्या देख सकता हूँ। मैं एक ऐसी सेवा को लागू करना चाहूंगा जो एक अलग मशीन पर होस्ट की गई अन्य सेवाओं का उपयोग करती है।

डॉकर में इस समस्या को हल करने के लिए कई दृष्टिकोण हैं, जैसे कि कोरओएसjumpers , मेजबान-स्थानीय सेवाएं जो अनिवार्य रूप से अन्य मशीन के लिए प्रॉक्सी हैं, और डॉकर की तैनाती का प्रबंधन करने के लिए गीथब परियोजनाओं का एक पूरा समूह है जो इस उपयोग-मामले का समर्थन करने का प्रयास करते दिखाई देते हैं ।

विकास की गति को देखते हुए यह पालन करना कठिन है कि मौजूदा सर्वोत्तम प्रथाएं क्या हैं। इसलिए मेरा प्रश्न अनिवार्य रूप से है:

  1. क्या (यदि कोई हो) डॉकटर में मेजबान को जोड़ने के लिए वर्तमान प्रमुख तरीका है, और
  2. क्या डॉकटर प्रणाली में सीधे इस कार्यक्षमता का समर्थन करने की कोई योजना है?

जवाबों:


58

अपडेट करें

डॉकर ने हाल ही में डॉकर ऑर्केस्ट्रेशन के लिए झुंड नामक एक नए उपकरण की घोषणा की है ।

झुंड आपको कई डॉकटर डेमोंस में "शामिल" करने की अनुमति देता है: आप पहले एक झुंड बनाते हैं, एक मशीन पर एक झुंड प्रबंधक शुरू करते हैं, और डॉक डेमॉन को "झुंड के पहचानकर्ता का उपयोग करते हुए" झुंड प्रबंधक में शामिल करते हैं। Docker क्लाइंट झुंड प्रबंधक से जुड़ता है जैसे कि यह एक नियमित docker सर्वर था।

जब एक कंटेनर स्वार्म के साथ शुरू होता है, तो यह स्वचालित रूप से एक मुक्त नोड को सौंपा जाता है जो परिभाषित किए गए किसी भी बाधाओं को पूरा करता है। निम्नलिखित उदाहरण ब्लॉग पोस्ट से लिया गया है:

$ docker run -d -P -e constraint:storage=ssd mysql

समर्थित बाधाओं में से एक "node"यह है कि आप एक विशिष्ट होस्टनाम के लिए कंटेनर को पिन कर सकते हैं। झुंड भी नोड्स में लिंक को हल करता है।

मेरे परीक्षण में मुझे यह आभास हुआ कि झुंड अभी तक एक निश्चित स्थान पर संस्करणों के साथ बहुत अच्छी तरह से काम नहीं करता है (या कम से कम उन्हें जोड़ने की प्रक्रिया बहुत सहज नहीं है), इसलिए यह ध्यान में रखना है।

झुंड अब बीटा चरण में है।


हाल तक तक, राजदूत पैटर्न दूरस्थ-मेजबान सेवा की खोज के लिए केवल डॉकटर-देशी दृष्टिकोण था। इस पैटर्न को अभी भी इस्तेमाल किया जा सकता है और इसमें सादे डॉकर से परे किसी भी जादू की आवश्यकता नहीं होती है जिसमें पैटर्न में एक या एक से अधिक अतिरिक्त कंटेनर होते हैं जो भविष्यवाणियों के रूप में कार्य करते हैं।

इसके अतिरिक्त, डॉकर क्लस्टर को सक्षम बनाने के लिए कई तृतीय-पक्ष एक्सटेंशन हैं। तृतीय-पक्ष समाधान में शामिल हैं:


2
तो मूल रूप से कंटेनरों को जोड़ने का कोई तरीका अभी भी मेजबान को पार नहीं करता है जिसमें राजदूत पैटर्न या बायकर को शामिल नहीं करना और सीधे lxc से बात करना शामिल है?
user3012759

@ user3012759 एम्बेसडर पैटर्न केवल स्थापित देशी तरीका है, लेकिन स्वार (अल्फा में) एक और देशी तरीका है जो डॉकर अनुसूचक की जगह काम करता है। देरी से जवाब देने के लिए माफी।
lyschoening

स्काईडॉक (अभी तक: 03/2015) में मल्टी-होस्ट समर्थन शामिल नहीं हैरजिस्ट्रार (एक सरल प्रोजेक्ट जो स्काईडएनएस के साथ काम कर सकता है) करता है, लेकिन कॉन्फ़िगरेशन अधिक मैनुअल है (सेवाओं को होस्ट पोर्ट पर मैप करने के लिए पोर्ट होना चाहिए)।
turtlemonvh

6
झुंड की मेरी सरसरी जांच से पता चलता है कि यह क्लस्टर प्रबंधन पर केंद्रित है न कि अंतर-मेजबान कनेक्टिविटी पर। यह कमी स्पष्ट रूप से Docker के स्वयं के डेमो youtube.com/watch?v=M4PFY6RZQHQ&t=3m37s
ब्रूनो ब्रोंस्की

1
@lyschoening Docker ने देशी मल्टी होस्ट नेटवर्किंग की घोषणा की जिसे आप अपने उत्तर को अपडेट करना चाहते हैं
Thomasleveil

15

अद्यतन 3

लिब्स्वर्म को झुंड के रूप में नाम दिया गया है और अब एक अलग आवेदन है।

यहाँ एक प्रारंभिक बिंदु के रूप में उपयोग करने के लिए github पेज डेमो है:

# create a cluster
$ swarm create
6856663cdefdec325839a4b7e1de38e8

# on each of your nodes, start the swarm agent
#  <node_ip> doesn't have to be public (eg. 192.168.0.X),
#  as long as the other nodes can reach it, it is fine.
$ swarm join --token=6856663cdefdec325839a4b7e1de38e8 --addr=<node_ip:2375>

# start the manager on any machine or your laptop
$ swarm manage --token=6856663cdefdec325839a4b7e1de38e8 --addr=<swarm_ip:swarm_port>

# use the regular docker cli
$ docker -H <swarm_ip:swarm_port> info
$ docker -H <swarm_ip:swarm_port> run ... 
$ docker -H <swarm_ip:swarm_port> ps 
$ docker -H <swarm_ip:swarm_port> logs ...
...

# list nodes in your cluster
$ swarm list --token=6856663cdefdec325839a4b7e1de38e8
http://<node_ip:2375>

अद्यतन २

आधिकारिक दृष्टिकोण अब libswarm का उपयोग करने के लिए यहां एक डेमो देखें

अपडेट करें

एक ही दृष्टिकोण का उपयोग कर docker में openvswitch होस्ट संचार के लिए एक अच्छा उपहार है।

सेवा खोज की अनुमति देने के लिए DNS पर आधारित एक दिलचस्प दृष्टिकोण है जिसे स्काइडॉक कहा जाता है ।

एक पेंचकस भी है ।


यह भी पहेली का एक ही टुकड़े का उपयोग कर एक अच्छा लेख है, लेकिन शीर्ष पर भी vlans जोड़ने:

http://fbevmware.blogspot.it/2013/12/coupling-docker-and-open-vswitch.html

पैचिंग का समाधान की मजबूती से कोई लेना-देना नहीं है। डॉकटर वास्तव में लिनक्स कंटेनरों पर केवल डीएसएल का एक प्रकार है और इन लेखों में दोनों समाधान बस कुछ डॉकर स्वचालित सेटिंग्स को बायपास करते हैं और सीधे लिनक्स कंटेनरों में वापस आते हैं।

तो आप सुरक्षित रूप से समाधान का उपयोग कर सकते हैं और डॉकर इसे लागू करने के बाद एक सरल तरीके से करने में सक्षम होने की प्रतीक्षा करेंगे।


2
हाल ही में libswarm में बहुत अधिक गतिविधि नहीं हुई है। मुझे आश्चर्य है कि क्या डॉकटर टीम दूसरी दिशा में बढ़ रही है?
रमन

12

बुनाई एक नई डॉक वर्चुअल नेटवर्क तकनीक है जो टीसीपी / यूडीपी पर एक आभासी ईथरनेट स्विच के रूप में कार्य करती है - आपको इसकी आवश्यकता है एक डॉकटर कंटेनर जो आपके मेजबान पर बुन रहा है।

यहाँ क्या दिलचस्प है

  • लिंक के बजाय, अपने वर्चुअल नेटवर्क में स्थिर आईपी / होस्टनाम का उपयोग करें
  • होस्ट को पूर्ण कनेक्टिविटी की आवश्यकता नहीं है, साथियों के उपलब्ध होने के आधार पर एक जाल बनाया जाता है, और पैकेट को मल्टी-हॉप रूट किया जाएगा जहां उन्हें जाने की आवश्यकता है

यह दिलचस्प परिदृश्यों की ओर जाता है

  • WAN के पार एक वर्चुअल नेटवर्क बनाएं, डॉकटर कंटेनरों में से किसी को भी पता नहीं चलेगा या परवाह नहीं करेगा कि वे किस वास्तविक नेटवर्क में बैठे हैं
  • अपने कंटेनरों को अलग-अलग भौतिक डॉक मेजबानों पर ले जाएं, बुनकर अपने अनुसार साथी का पता लगाएंगे

उदाहरण के लिए, आपके लैपटॉप पर एक बहु-नोड कैसंड्रा क्लस्टर बनाने के लिए एक उदाहरण मार्गदर्शिका है और कुछ क्लाउड (EC2) प्रति होस्ट दो आदेशों के साथ होस्ट करता है। मैंने AWS CloudFormation के साथ एक कोरओएस क्लस्टर लॉन्च किया, प्रत्येक / होम / कोर, प्रत्येक में मेरे लैपटॉप आवारा डॉक वीएम को स्थापित किया, और एक घंटे के अंदर क्लस्टर प्राप्त किया। मेरा लैपटॉप फ़ायरवॉल है लेकिन वीव के साथ ठीक लग रहा था, यह सिर्फ उसके ईसी 2 साथियों से जुड़ता है।


मैं जो समझता हूं, वह एक नेटवर्क ओवरले है जो सेवा कनेक्टिविटी के लिए कंटेनरों के अंदर काम करता है , जबकि झुंड एक क्लस्टरिंग तकनीक है जो बुनियादी ढांचे के ऑर्केस्ट्रेशन के लिए डॉक सीएलआई का विस्तार करता है। इंफ्रा कनेक्टिविटी को झुंड के बाहर किया जाना चाहिए (जैसे नियमित स्विच का उपयोग करके) और बुनाई के बाहर सेवा ऑर्केस्ट्रेशन (जैसे मेसोस / कुबेरनेट्स का उपयोग करके)। क्या यह आपके विचार से मेल खाता है कि यह कैसे काम करता है?
हेनरिक

यहां बताया गया है कि मैं इसे कैसे देखूंगा: डॉकटर कंपोजर कंटेनर लिंकिंग और ऑर्केस्ट्रेशन के बारे में है, डॉक झुंड कई डॉक मेजबानों, सॉकेटप्लेन (अब डॉक मालिक के स्वामित्व में) के बारे में डॉक चलाने के बारे में है और बुनाई दोनों ओवरले नेटवर्क हैं। सॉकेटप्लेन ओपनवेस्विच पर आधारित है जो आमतौर पर वीएम में ओवरले के लिए उपयोग किया जाता है (जैसे ओपनस्टैक); दूसरी तरफ बुनकर केवल डॉकटर हैं। इन सभी में से, मेसोस / कुबेरनेट्स / लैटिस डॉक सीएलआई की तुलना में कुछ अलग उपयोगकर्ता अनुभव और स्केलेबिलिटी स्तर के साथ डॉक झुंड के लिए प्रतिस्थापन हैं।
स्टुअर्ट चार्लटन

7

अपडेट करें

डॉकर 1.12 में तथाकथित झुंड मोड शामिल है और एक serviceअमूर्त भी जोड़ता है । वे शायद हर उपयोग के मामले के लिए पर्याप्त परिपक्व नहीं हैं, लेकिन मेरा सुझाव है कि आप उन्हें निगरानी में रखें। झुंड मोड कम से कम एक मल्टी-होस्ट सेटअप में मदद करता है, जो जरूरी नहीं कि लिंकिंग को आसान बना दे। डॉकर-आंतरिक DNS सर्वर (1.11 के बाद से) आपको कंटेनर नामों तक पहुंचने में मदद करनी चाहिए, यदि वे अच्छी तरह से ज्ञात हैं - जिसका अर्थ है कि एक झुंड के संदर्भ में उत्पन्न नाम पता करने के लिए इतना आसान नहीं होगा।


डॉकर 1.9 रिलीज के साथ आप मल्टी होस्ट नेटवर्किंग में निर्मित हो जाएंगे । वे आसानी से काम करने वाले क्लस्टर का प्रावधान करने के लिए एक उदाहरण स्क्रिप्ट भी प्रदान करते हैं ।

आपको एक K / V स्टोर (जैसे कॉन्सुल) की आवश्यकता होगी, जो हर मेजबान पर अलग-अलग डॉक इंजन में राज्य साझा करने की अनुमति देता है। प्रत्येक Docker इंजन को उस K / V स्टोर के साथ कॉन्फ़िगर करने की आवश्यकता होती है और फिर आप अपने होस्ट को कनेक्ट करने के लिए झुंड का उपयोग कर सकते हैं।

फिर आप इस तरह एक नया ओवरले नेटवर्क बनाते हैं:

$ docker network create --driver overlay my-network

कंटेनरों को अब रन पैरामीटर के रूप में नेटवर्क नाम से चलाया जा सकता है:

$ docker run -itd --net=my-network busybox

जब वे पहले से ही चल रहे हों तो उन्हें एक नेटवर्क से जोड़ा जा सकता है:

$ docker network connect my-network my-container

प्रलेखन में अधिक विवरण उपलब्ध हैं ।


6

निम्नलिखित लेख में कई मेजबानों पर डॉक कंटेनर को जोड़ने का अच्छा तरीका बताया गया है: http://goldmann.pl/blog/2014/01/21/connecting-docker-containers-on-multiple-hosts/


1
यह वास्तव में एक बहुत अच्छा समाधान है; मैं इसे भर में आया हूँ। मुझे इस बात की चिंता है कि लेख केवल कल पोस्ट किया गया था और यह डॉकटर पैच के लिए कहता है। (यह देखते हुए कि हाल ही में यह कैसे पोस्ट किया गया था, मुझे यह देखने के लिए थोड़ा इंतजार करना होगा कि क्या वे उस पैच को डोकर में मिला देते हैं)।
lyschoening

डॉकर एक प्रारंभिक विकास के चरण में है, संभवतः सभी आवश्यकताओं को अभी तक स्पष्ट नहीं किया गया है और परिभाषित आवश्यकताओं को लागू नहीं किया गया है। इसलिए पैचिंग आवश्यक है।
पावेलोकेक

2
यह एक गैर जवाब है। लिंक को उत्तर लेख से कॉपी करें। वह SO मानक है।
ब्रूनो ब्रोंस्की

6

ओपन vSwitch या Tinc का उपयोग करके कई डॉकर सबनेट को एक साथ पाटना संभव है। मैंने यह करने के लिए तैयार करने के लिए Gists तैयार किया है:

--linkविकल्प और एंबेसडर पैटर्न के बजाय मैं इस समाधान का उपयोग कर रहा हूं, इसका फायदा यह है कि मुझे यह अधिक पारदर्शी लगता है: अतिरिक्त कंटेनरों और अधिक महत्वपूर्ण बात, मेजबान पर बंदरगाहों को उजागर करने की कोई आवश्यकता नहीं है। वास्तव में मुझे लगता है --linkकि डॉकर को मल्टी-होस्ट (या मल्टी-डेमॉन) सेटअप के बारे में एक अच्छी कहानी मिलने से पहले एक अस्थायी हैक होने के विकल्प के बारे में सोचना चाहिए।

नोट: मुझे पता है कि मेरे पहले जिस्ट की ओर इशारा करते हुए एक और उत्तर है लेकिन मेरे पास उस उत्तर को संपादित करने या उस पर टिप्पणी करने के लिए पर्याप्त कर्म नहीं हैं।


आप सेवा का पता कैसे लगाएंगे? यह कहें कि यदि मेरे पास एक मशीन पर रेडिस और किसी अन्य मशीन पर क्लाइंट एप्लिकेशन है, तो क्लाइंट एप्लिकेशन को रेडिस सेवा का आईपी कैसे मिलेगा?
lyschoening

उसी तरह से आप इसे एक ही होस्ट पर करेंगे: खुद को नई शुरू की गई सेवाओं के लिए आईपी / पोर्ट प्रदान करना, या एक कुंजी / मूल्य स्टोर (जैसे कि etcd) का उपयोग करना या DNS का उपयोग करना जो सेवाएं क्वेरी कर सकते हैं। मुझे DNS का उपयोग करना पसंद है क्योंकि कई मौजूदा सेवाएं इसे बिना संशोधन के उपयोग कर सकती हैं।
8

1

जैसा कि ऊपर बताया गया है, वीवर्स निश्चित रूप से मेजबानों में डोकर कंटेनरों को जोड़ने के लिए एक व्यवहार्य समाधान है। इसके साथ मेरे अपने अनुभव के आधार पर, इसे स्थापित करना काफी सीधा है। अब इसमें DNS सेवा भी है जिसे आप कंटेनर के DNS नामों से संबोधित कर सकते हैं।

दूसरी ओर, मेजबान भर में कंटेनरों को तार करने के लिए कोरओएस के फ्लैनेल और जुनिपर के ओपेंकोन्त्रिल हैं।


1

Docker swarm की तरह लगता है 1.14आप के लिए अनुमति देता है:

  • होस्टनाम को कंटेनर में --hostnameटैग करना, टैग का उपयोग करना , लेकिन मैं इसे काम करने में सक्षम नहीं हूं, कंटेनर होस्ट किए गए नामों से एक दूसरे को पिंग करने में सक्षम नहीं हैं।

  • मशीन के उपयोग से सेवाएं प्रदान करना --constraint 'node.hostname == <host>'

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.