2016-12-15 5 views
7

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

यहाँ मेरी सेटअप है। मेरे पास मेरी देव मशीन है। और मेरे पास दो कंटेनर वाला डॉकर होस्ट मशीन है। CONT_A सुनता है और बंदरगाह पर एक वेब सेवा को प्रकाशित करता है 3000.

DEV-MACHINE 

HOST (Public IP = 111.222.333.444) 
    CONT_A (Publish 3000) 
    CONT_B 

enter image description here

मेरे देव मशीन पर (एक पूरी तरह से अलग मशीन)

मैं कर्ल कर सकते हैं बिना किसी समस्या के

curl http://111.222.333.444:3000 --> OK 

जब मैं मेजबान में SSH

मैं जब मैं CONT_B

संभव नहीं है, बस समय समाप्ति के अंदर निष्पादित किसी भी problesm

curl http://111.222.333.444:3000 --> OK 

बिना कर्ल कर सकते हैं। पिंग ठीक है हालांकि ...

docker exec -it CONT_B bash 
$ curl http://111.222.333.444:3000 --> TIMEOUT 
$ ping 111.222.333.444 --> OK 

क्यों?

उबंटू 16.04, डोकर 1.12.3 (डिफ़ॉल्ट नेटवर्क सेटअप)

+0

मैं सोच रहा हूँ इस की वजह से शायद कैसे डोकर नेटवर्किंग IPTables और ब्रिज नेटवर्क का उपयोग कर संभालती है (यहाँ वेब मेरी nginx कंटेनर का नाम है)। मुझे इसे देखना होगा, लेकिन मुझे लगता है कि आप जो आईपी पता दे रहे हैं वह शायद मेजबान से देखा गया आईपी पता है, न कि डॉकर नेटवर्क के भीतर "आंतरिक आईपी" असाइन किया गया है। कारण पिंग हल हो सकता है क्योंकि यह डॉकर होस्ट (कंटेनर नहीं) को हल करता है। लेकिन इसे प्राप्त करने का डॉकर तरीका कंटेनर ए में पोर्ट को प्रकाशित नहीं करना है बल्कि इसके बजाय ओवरले नेटवर्क https://docs.docker.com/engine/userguide/networking/ बनाना है। –

+2

@RikNauta मैं जिस आईपी पते का उपयोग कर रहा हूं वह है ** सार्वजनिक होस्ट आईपी **। निश्चित रूप से यह हमेशा सही ढंग से हल करना चाहिए जब तक कि यह किसी भी तरह से आंतरिक डॉकर नेटवर्क से विवादित न हो। यह '104 ....' आईपी पता है। – pqvst

+0

यह काम करना चाहिए। मेजबान पर सुनने और कंटेनर में टीसीपी कनेक्शन को आगे बढ़ाने के लिए एक उपयोगकर्तालैंड प्रॉक्सी प्रक्रिया डॉकर चलता है। डॉकर 1.11 में वही काम करता है? क्या आपके पास 'उपयोगकर्तालैंड-प्रॉक्सी' डॉकर डिमन पर गलत है? – Matt

उत्तर

2

मैं जानता हूँ कि इस सख्ती से सवाल का जवाब नहीं है, लेकिन आपकी समस्या को हल करने का एक और अधिक डोकर-ish तरीका है। मैं पूरी तरह से अंतर-कंटेनर संचार के लिए बंदरगाह के प्रकाशन के बारे में भूल जाएगा। इसके बजाय डॉकर झुंड का उपयोग करके ओवरले नेटवर्क बनाएं। पूर्ण गाइड here पा सकते हैं, लेकिन संक्षेप में आप निम्न कार्य करें:

//create network  
docker network create --driver overlay --subnet=10.0.9.0/24 my-net 
//Start Container A 
docker run -d --name=A --network=my-net producer:latest 
//Start Container B 
docker run -d --name=B --network=my-net consumer:latest 

//Magic has occured 
docker exec -it B /bin/bash 
> curl A:3000 //MIND BLOWN! 

तो कंटेनर के अंदर तुम सिर्फ कर्ल होस्ट नाम एक और यह आपके लिए समाधान हो जाएगा कर सकते हैं (यहां तक ​​कि जब आप स्केलिंग कर आदि शुरू)

हो

आप डोकर झुंड आप अभी भी रूप में अच्छी तरह डोकर विरासत लिंक का उपयोग कर सकते का उपयोग कर के लिए उत्सुक नहीं हैं, तो:

docker run -d --name B --link A:A consumer:latest 

अपने कंटेनर के किसी भी संपर्क में (नहीं प्रकाशित) बंदरगाहों लिंक होगा।

और अंत में, यदि आप उत्पादन की ओर बढ़ने शुरू ... & ओवरले नेटवर्क पूरी तरह लिंक के बारे में भूल जाते हैं ... का उपयोग Kubernetes :-) बिट और अधिक कठिन प्रारंभिक सेटअप पर वे अवधारणाओं का एक गुच्छा & उपकरण & स्केलिंग जोड़ने बनाने के लिए परिचय कंटेनरों के क्लस्टर बहुत आसान है! लेकिन यह सिर्फ मेरी व्यक्तिगत राय है।

+2

जब आप एक होस्ट पर होते हैं तो इसे ओवरले नेटवर्क होने की भी आवश्यकता नहीं होती है, डिफ़ॉल्ट ब्रिज ड्राइवर फ़ाइल काम करेगा। – BMitch

0

मुझे एक ही समस्या थी, मेरे पास एक कंटेनर में एक nginx सर्वर है (इसे वेब पर कॉल करें) कई सर्वर ब्लॉक के साथ, और क्रॉन दूसरे कंटेनर में स्थापित है (इसे क्रॉन कहते हैं)। मैं डॉकर रचना का उपयोग करता हूं। मैं कर्ल क्रॉन से आवेदन में से एक पर कुछ php स्क्रिप्ट को निष्पादित करने के लिए समय-समय पर वेब करने के लिए उपयोग करना चाहता था।इसे निम्नानुसार दिखना चाहिए:

curl http://app1.example.com/some_maintance.php 

लेकिन मैं हमेशा कुछ समय बाद मेजबान पहुंचने योग्य नहीं था।

पहले समाधान अद्यतन करने के लिए/etc/क्रॉन कंटेनर में होस्ट करता है, और जोड़ने था:

1.2.3.4 app1.example.com 

जहां 1.2.3.4 वेब कंटेनर के लिए आईपी है, और यह काम किया - लेकिन यह एक हैक है - के रूप में भी जहां तक ​​मुझे पता है कि ऐसे मैन्युअल अपडेट को प्रोत्साहित नहीं किया जाता है। आपको डॉकर कंपोज़ में extra_hosts का उपयोग करना चाहिए, जिसके लिए आईपी एड्रेस निर्दिष्ट करने के लिए कंटेनर के नाम के बजाय स्पष्ट आईपी एड्रेस की आवश्यकता है।

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

अंत में मैं सर्वर का IP पता निर्दिष्ट करने के लिए कर्ल क्षमता का इस्तेमाल किया है, और मैं अलग पैरामीटर में एक हेडर के रूप में डोमेन नाम पारित:

curl -H'Host: app1.example.com' web/some_maintance.php 

बहुत ही सुंदर नहीं है, लेकिन काम करता है।