2015-09-07 8 views
9

मैं विभिन्न मेजबानों पर कुछ डॉकर कंटेनरों में एक कार्य चलाने के लिए चाहता हूं। और मैंने कंटेनरों को प्रबंधित करने के लिए एक प्रबंधक ऐप लिखा है (कार्य शुरू करें, कार्य रोकें, स्थिति प्राप्त करें, आदि ...)। एक बार एक कंटेनर शुरू हो जाने पर, यह प्रबंधक को अपने पते और बंदरगाह के साथ एक http अनुरोध भेज देगा, इसलिए प्रबंधक को पता चलेगा कि कंटेनर का प्रबंधन कैसे करें।एक डॉकर कंटेनर से मेजबान पर मैप किए गए बंदरगाह को कैसे प्राप्त करें?

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

मैप किए गए पोर्ट के अंदर एक डॉकर कंटेनर कैसे प्राप्त कर सकता हूं?

यहां एक समाधान है How do I know mapped port of host from docker container?। लेकिन अगर मैं कंटेनर चलाता हूं तो यह लागू नहीं होता है। चूंकि इस सवाल को 1 साल पहले से पूछा गया है, इसलिए मुझे आश्चर्य है कि इस समस्या को हल करने के लिए डॉकर में एक नई सुविधा शामिल हो सकती है।

उत्तर

1

एक बार एक कंटेनर शुरू कर दिया है, यह करने के लिए एक http अनुरोध भेज देंगे कर सकते हैं इसके पते और बंदरगाह के साथ प्रबंधक

यह काम नहीं करेगा। एक कंटेनर के अंदर से आप यह नहीं समझ सकते कि डॉकर होस्ट पोर्ट किस कंटेनर पोर्ट को मैप किया गया है।

मैं क्या सोच सकता हूं कि आप किस चीज के बारे में सोच सकते हैं और जो आप वर्णन करते हैं उसके निकटतम होने के लिए कंटेनर प्रबंधक प्रबंधक के लिए एक वेबस्केट कनेक्शन खोलता है। ऐसा कनेक्शन आपके प्रबंधक और कंटेनर के बीच दो तरीकों से संचार की अनुमति देगा जबकि अभी भी HTTP पर हो रहा है।


जो आप प्राप्त करने का प्रयास कर रहे हैं उसे service discovery कहा जाता है। सेवा खोज के लिए पहले से ही उपकरण हैं जो डॉकर के साथ काम करते हैं। आपको स्वयं को बनाने की कोशिश करने के बजाय उनमें से एक को चुनना चाहिए।

उदाहरण के लिए देखें:


तुम सच में अपने सेवा खोज प्रणाली को लागू करना चाहते हैं, एक रास्ता तय करना है करने के लिए है आपका प्रबंधक docker event कमांड (या 0 में से एक का उपयोग करें)। इससे कंटेनर पक्ष पर कुछ भी करने के लिए आपके प्रबंधक को कंटेनर निर्माण/हटाना अधिसूचित करने में सक्षम बनाया जाएगा।

फिर docker port के साथ अपने कंटेनर में मैप किए गए बंदरगाहों को समझने के लिए डॉकर होस्ट से पूछें।

9

तुम भी आप docker port container_id

डॉक

https://docs.docker.com/reference/commandline/port/

दस्तावेज़ से उदाहरण

$ docker port test 
7890/tcp -> 0.0.0.0:4321 
9876/tcp -> 0.0.0.0:1234 
$ docker port test 7890/tcp 
0.0.0.0:4321 
$ docker port test 7890/udp 
2014/06/24 11:53:36 Error: No public port '7890/udp' published for test 
$ docker port test 7890 
0.0.0.0:4321 
+1

धन्यवाद, लेकिन इस एक कंटेनर के अंदर नहीं चलाया जा सकता है। क्या एक कंटेनर के अंदर बंदरगाह प्राप्त करना संभव है? – iuradz

2

मैं कंटेनर खोल में कंटेनर के लिए /var/run/docker.sock का हिस्सा है और स्वयं की जानकारी

docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock alpine:latest sh 

मिल

env //get HOSTNAME 

curl --unix-socket /var/run/docker.sock http://localhost/containers/3c6b9e44a622/json 

3c6b9e44a622 अपने HOSTNAME है

+0

केवल समस्या यह है कि यदि आपकी सेवा से समझौता हो जाता है तो आप अपने पूरे डॉकर सिस्टम पर हमले का एक नया वेक्टर बना रहे हैं ... मुझे लगता है कि मैं आपको कंटेनर के लिए जानकारी देने के लिए एक समर्पित डॉकर कंटेनर बनाना चाहता हूं ... क्योंकि केवल आपका कंटेनर इसके साथ संवाद करेगा, बाहरी दुनिया के बाहर नहीं –

संबंधित मुद्दे