पारदर्शी एक एकल डॉकर कंटेनर को दूसरे डॉकर कंटेनर में प्रॉक्सी करना

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

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

पहला कंटेनर आईपी: 172.17.0.4 (पोर्ट पर प्रॉक्सी सेवा चल रही है 8080).दूसरा कंटेनर आईपी: 172.17.0.6 (ब्राउज़र जैसे क्लाइंट टूल हैं) । मैं सभी एचटीटीपी ट्रैफ़िक (पोर्ट) को अग्रेषित करना चाहता था 80) की 172.17.0.6 बंदरगाह के लिए 8080 की 172.17.0.4.

यानी)> 80 के लिए यातायात 172.17.0.4 और लेफ्टिनेंट; - - - 8080 के 172.17.0.6

मैंने उपरोक्त कॉन्फ़िगरेशन के लिए दूसरे कंटेनर के अंदर आईपीटीबल्स नियमों को जोड़ने का प्रयास किया है । लेकिन उनमें से किसी ने भी काम नहीं किया ।

~# sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 172.17.0.4:8080

काम नहीं करता ।

~# sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 172.17.0.4:8080

काम नहीं करता ।

~# sudo iptables -t nat -A POSTROUTING -j MASQUERADE

तो मेरा सवाल यह है कि, मैं एक डॉकर कंटेनर के अंदर एक पारदर्शी प्रॉक्सी को कैसे कॉन्फ़िगर कर सकता हूं जो किसी निर्दिष्ट पोर्ट के सभी ट्रैफ़िक को दूसरे कंटेनर के पोर्ट पर अग्रेषित कर सकता है?

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

मैंने एनजीएनएक्स/हैप्रोक्सी का उपयोग करके एक साथ चलने वाले सभी कंटेनरों को रिवर्स-प्रॉक्सी करने पर कुछ ट्यूटोरियल पढ़े हैं । लेकिन मैं एक जोड़ी के रूप में अपने स्वयं के प्रॉक्सी कंटेनर के साथ व्यक्तिगत कंटेनर को कॉन्फ़िगर करना चाहता था ।

जवाब देने के लिए आपके समय के लिए आप सभी का धन्यवाद । मूल रूप से मैं जो करने की कोशिश कर रहा हूं वह प्रॉक्सी है निवर्तमान / उत्पन्न 2 कंटेनर का यातायात (नोट: मैं हूँ नहीं आने वाले ट्रैफ़िक को प्रॉक्सी करने की कोशिश कर रहा है, इसलिए अपाचे मॉड_प्रॉक्सी या एनजीआईएनएक्स प्रॉक्सी_पास का उपयोग नहीं कर सकता है । ये मॉड्यूल आने वाले ट्रैफ़िक के लिए काम करते हैं) । 1 कंटेनर पोर्ट 8080 पर एक प्रॉक्सी सेवा चलाता है ।

जैसा कि थिएर्नो ने सुझाव दिया था कि मैं आउटगोइंग ट्रैफ़िक को प्रॉक्सी करने के लिए एचटीपी_प्रॉक्सी और एचटीपीएस_प्रॉक्सी एनवी चर का उपयोग कर सकता हूं, लेकिन दुर्भाग्य से नहीं आपके ऑपरेटिंग सिस्टम में चल रहे सभी एप्लिकेशन/सेवाएं इन एचटीपी_प्रॉक्सी और एचटीपीएस_प्रॉक्सी एनवी चर का सम्मान करती हैं । ऐसे एप्लिकेशन हैं जो प्रॉक्सी सेटिंग्स को छोड़ने के लिए मजबूर करते हैं । यही कारण है कि मैं उपयोग करना चाहता था यातायात नियमों को लागू करने के लिए आईपीटीबल्स. इस प्रकार कोई भी एप्लिकेशन / सेवा प्रॉक्सी को छोड़ नहीं सकती है ।

प्रश्न पर पिछली सेटिंग्स में मैंने जो गलती की थी, वह यह है कि मैं आने वाले ट्रैफ़िक को प्रॉक्सी सर्वर के 80 से 8080 पोर्ट पर रूट करने की कोशिश कर रहा था । चूंकि 1 कंटेनर में कोई आने वाला ट्रैफ़िक नहीं है, इसलिए यह काम नहीं करेगा और यह है ट्रैफ़िक को प्रीरूट/पोस्टरूट करने के लिए तार्किक रूप से गलत मैं जो खोज रहा था उसे हासिल करने के लिए । मूल/आउटगोइंग ट्रैफ़िक को रूट करने के लिए, हमें उपयोग करने की आवश्यकता है आउटपुट चेन के iptables.

मेरा समाधान:

मैंने सर्वर से पूर्ण आउटगोइंग ट्रैफ़िक के लिए प्रॉक्सी को लागू करने के लिए आईपीटेबल्स संयोजन के साथ रेडसॉक्स का उपयोग किया है । यहां आईपीटीबल्स कॉन्फ़िगरेशन है जिसका मैंने उपयोग किया है:

# रेडसॉक्स के लिए नई चेन बनाएं

root# iptables -t nat -N REDSOCKS

# लैन और कुछ अन्य आरक्षित पते पर ध्यान न दें

root# iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURNroot# iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURNroot# iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURNroot# iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURNroot# iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURNroot# iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURNroot# iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURNroot# iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN

# सभी एचटीटीपी को रेडसॉक्स लोकल पोर्ट पर रीडायरेक्ट करें

root# sudo iptables -t nat -A REDSOCKS -p tcp --dport 80 -j REDIRECT --to-ports 12345

# एचटीटीपीएस ट्रैफिक के लिए पोर्ट 80 को 443 से बदलें

# एथ0 पर सभी आउटगोइंग ट्रैफ़िक के लिए सभी रेडसॉक्स श्रृंखला का उपयोग करें

root# sudo iptables -t nat -A OUTPUT -p tcp -o eth0 -j REDSOCKS

अब, आने वाले ट्रैफ़िक के लिए स्थानीय पोर्ट 12345 को सुनने के लिए रेडसॉक्स को कॉन्फ़िगर करें और इसे प्रॉक्सी सर्वर के आईपी और पोर्ट पर अग्रेषित करें । ऐसा करना संपादित करें redsocks.conf इस तरह से,

redsocks {local_ip = 127.0.0.1;local_port = 12345;ip = 172.17.0.4;port = 8080;type = http-relay;}

बस को बचाने और conf को पुनः आरंभ redsocks सेवा. अब 1 कंटेनर से उत्पन्न सभी आउटगोइंग ट्रैफ़िक को प्रॉक्सी का उपयोग करने के लिए लागू किया जाएगा । (नोट: मैंने आईपीटीबल्स का उपयोग किया है-सर्वर रिबूट पर नियमों को बनाए रखने के लिए लगातार) वास्तव में मैंने आईपीटीबल्स कॉन्फ़िगरेशन में एक और लाइन जोड़कर एचटीटीपी और एचटीटीपीएस ट्रैफिक दोनों के लिए समान लागू किया है । हालांकि यह एक पारदर्शी प्रॉक्सी नहीं है, यह मेरे लिए काम करता है ।

अगर किसी के पास इसका कोई अन्य वैकल्पिक समाधान है तो कृपया सुझाव दें ।

मुझे लगता है कि का उपयोग कर $http_proxy एनवी वर मदद करनी चाहिए.

कंटेनर शुरू होने पर एनवी संस्करण निर्यात करने के लिए आप अपनी डॉकर फ़ाइल (कंटेनर #2 के लिए) में एंट्रीपॉइंट सेट कर सकते हैं । में कहीं न कहीं अपने entrypoint, आप कुछ इस तरह होना चाहिए:

export http_proxy=http://$CONATAINER1_PORT_8080_TCP_ADDR:$CONATAINER1_PORT_8080_TCP_PORT

मुझे ठीक से पता नहीं है कि आपका क्लाइंट (ब्राउज़र) $एचटीपी_प्रॉक्सी एनवी संस्करण का उपयोग कर सकता है, लेकिन यह एक समान विधि मौजूद होना चाहिए । उदाहरण के लिए, फ़ायरफ़ॉक्स के लिए:

user_pref("network.proxy.http", "$CONATAINER1_PORT_8080_TCP_ADDR");user_pref("network.proxy.http_port", $CONATAINER1_PORT_8080_TCP_PORT);user_pref("network.proxy.type", 1);

टिप्स: उपयोग करें printenv दूसरे कंटेनर पर यह जानने के लिए कि आपको अपने प्रवेश बिंदु में किस चर नाम का उपयोग करना चाहिए

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

अगर आप को तैयार कर रहे हैं का उपयोग करने के लिए व्यवस्थाएं की तरह अंजीर या बुनाई, कि मुझे विश्वास है yaml या json विन्यास फाइल, आप शायद सक्षम होना करने के लिए इस सेट अप के साथ सिर्फ दो पारस्परिक कंटेनर.

यदि आप एक तिहाई के लिए तैयार हैं, तो सभी बंदरगाहों और नलसाजी को आपके दोनों 'भाई' कंटेनरों के लिए सामान्य पूर्वजों के माध्यम से जोड़ा जा सकता है ।