होस्ट (समान नेटवर्क) के बाहर से एक डॉकटर कंटेनर से कैसे जुड़ा जाए [विंडोज]


87

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

इसलिए मेरे पास एक बहुत ही सरल Go कोड है जो एक सर्वर शुरू करता है, मैंने docker की छवि बनाई है जो Go को स्थापित करता है और एक लिनक्स बेस इमेज में कोड बनाता है। मैं 8080 पोर्ट पर सर्वर चला रहा हूं, इसलिए मैं उस पोर्ट को उस कंटेनर को चलाने वाले होस्ट को बेनकाब करता हूं:

docker run -p 8080:8080 dockertest

यह काम करता है और मुझे डॉकर की मशीन आईपी के माध्यम से सर्वर का उपयोग करने के लिए मिलता है (एक जो शुरू होने पर डॉकर क्विकार्टार्ट टर्मिनल पर दिखाई देता है ), समस्या यह है कि मैं होस्ट के बाहर से होस्ट करने वाली वेबसाइट तक नहीं पहुंच सकता, इसलिए यदि मैं कोशिश करता हूं मेरे फ़ोन पर समान IP पता खोलने के लिए यह मुझे एक त्रुटि देता है: यह वेबपृष्ठ उपलब्ध नहीं है (ERR_CONNECTION_TIMED_OUT)।

मैंने भी आईपी को इस तरह निर्दिष्ट करने की कोशिश की है:

docker run -p 192.168.0.157:8080:8080 dockertest

लेकिन जब मैं ऐसा करता हूं कि मैं वेबसाइट को न तो डॉकटर मशीन के आईपी के माध्यम से और न ही ऊपर निर्दिष्ट कमांड लाइन पर एक्सेस कर सकता हूं। मुझे यह भी निश्चित नहीं है कि मैं उस कमांड में लिखने वाला हूं जिसे मैंने अपने कंप्यूटर के आईपी का उपयोग किया है, मैंने 127.0.0.1 (लोकलहोस्ट) की भी कोशिश की है, लेकिन इससे मुझे एक ही परिणाम मिला: किसी भी माध्यम से वेबसाइट तक नहीं पहुंच सका IP जो भी हो।

मैंने इस समस्या को हल कर दिया है और कई StackOverflow प्रश्न पाए हैं, लेकिन न तो मुझे अपने मुद्दे को हल करने में मदद मिली, उनमें से अधिकांश लिनक्स या मैक के लिए उन्मुख थे इसलिए समाधान मेरी स्थिति पर लागू नहीं हुआ।

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


क्या आपने -p विकल्प के साथ संयोजन में अपने डॉकरीफाइल में 80OS का उपयोग किया है? इसके अलावा, उस पोर्ट 8080 को उस बॉक्स पर देखने के लिए जांचें जहां आपका कंटेनर चल रहा है, आपके सुरक्षा नियमों द्वारा अवरुद्ध नहीं है।
keda

@keda हाँ, डॉकरीफ़ाइल में 8080 सम्‍मिलित है। मैं अपने कंप्यूटर पर डॉकटर के क्विकस्टार्ट टर्मिनल के माध्यम से स्थानीय स्तर पर कंटेनर चला रहा हूं, मैंने विंडोज फ़ायरवॉल को अक्षम करने का भी प्रयास किया, लेकिन यह काम नहीं किया, मुझे नहीं पता कि क्या मैं कुछ कर रहा हूं 'मी मिसिंग
रेड्साल्ट

जवाबों:


90

TL, DR आपके वर्चुअलबॉक्स होस्ट के नेटवर्क मोड की जाँच करें - यह होना चाहिए bridgedअगर आप अपने स्थानीय नेटवर्क पर वर्चुअल मशीन (और इसकी मेजबानी कर रहे डॉकटर कंटेनर) को सुलभ चाहते हैं।


ऐसा लगता है कि आपका भ्रम झूठ है जिसमें HTTP के माध्यम से आपके एप्लिकेशन को एक्सेस करने के लिए होस्ट को कनेक्ट करना है। आपने वास्तव में यह नहीं बताया है कि आपका कॉन्फ़िगरेशन क्या है - मैं कुछ अनुमान लगाने जा रहा हूं, इस तथ्य के आधार पर कि आपको अपने टैग में "विंडोज" और "वर्चुअलबॉक्स" मिला है।

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

D = डॉकटर कंटेनर का आईपी पता

L वर्चुअलबॉक्स में चल रहे लिनक्स होस्ट का आईपी पता

W = विंडोज होस्ट का आईपी पता

जब आप अपने Windows होस्ट पर अपना Go एप्लिकेशन चलाते हैं, तो आप इसे http://W:8080/अपने स्थानीय नेटवर्क पर कहीं से भी कनेक्ट कर सकते हैं । यह काम करता है क्योंकि गो एप्लिकेशन विंडोज मशीन पर पोर्ट 8080 को बांधता है और जो कोई भी आईपी पते पर पोर्ट 8080 तक पहुंचने की कोशिश करता है वह Wकनेक्ट हो जाएगा।

और यहाँ है जहाँ यह और अधिक जटिल हो जाता है:

VirtualBox, जब यह एक वर्चुअल मशीन (VM) सेट करता है, तो नेटवर्क को कई अलग-अलग मोडों में से एक में कॉन्फ़िगर कर सकता है। मुझे याद नहीं है कि सभी विभिन्न विकल्प क्या हैं, लेकिन आप जो चाहते हैं वह है bridged। इस मोड में, वर्चुअलबॉक्स वर्चुअल मशीन को आपके स्थानीय नेटवर्क से जोड़ता है जैसे कि यह नेटवर्क पर एक स्टैंड-अलोन मशीन थी, ठीक उसी तरह जैसे कोई अन्य मशीन जो आपके नेटवर्क में प्लग की गई थी। मेंbridged मोड, आभासी मशीन किसी भी अन्य मशीन की तरह अपने नेटवर्क पर दिखाई देता है। अन्य मोड अलग चीजें सेट करते हैं और मशीन आपके नेटवर्क पर दिखाई नहीं देगी।

तो, मान लें कि आपने लिनक्स होस्ट ( bridged) के लिए नेटवर्किंग सही ढंग से सेट की है , तो लिनक्स होस्ट का आपके स्थानीय नेटवर्क (जैसे कि 192.168.0.x) पर एक आईपी एड्रेस होगा और आप अपने डॉकर कंटेनर को एक्सेस कर पाएंगे http://L:8080/

यदि लिनक्स होस्ट के अलावा कुछ मोड में सेट है bridged, तो आप कर सकते हैं विंडोज मेजबान से पहुंच प्राप्त कर सकेंगे, लेकिन यह वास्तव में क्या मोड क्या है पर निर्भर जा रहा है।

EDIT - नीचे दी गई टिप्पणियों के आधार पर, यह बहुत अधिक लगता है जैसे मैंने ऊपर वर्णित स्थिति सही है।

आइए थोड़ा पीछे चलते हैं: यहाँ बताया गया है कि कैसे डॉकर मेरे कंप्यूटर (उबंटू लिनक्स) पर काम करता है।

कल्पना कीजिए कि मैं एक ही आदेश आप चलाएँ: docker run -p 8080:8080 dockertest। यह क्या करता है कंटेनर पर dockertest8080 पोर्ट करने के लिए लिनक्स होस्ट (मेरा पीसी) पर छवि और आगे (कनेक्ट) पोर्ट 8080 के आधार पर एक नया कंटेनर शुरू करें । डॉकटर डेमन को संवाद करने के लिए और कंटेनरों को एक दूसरे के साथ संवाद करने की अनुमति देने के लिए डॉकटर सेट करता है यह स्वयं का आंतरिक नेटवर्किंग (आईपी पते के अपने सेट के साथ) है। तो मूल रूप से आप उसके साथ क्या कर रहे हैं-p 8080:8080 डॉकर की आंतरिक नेटवर्किंग को "बाहरी" नेटवर्क से जोड़ रहा है - यानी। होस्ट का नेटवर्क एडेप्टर - एक विशेष पोर्ट पर।

मेरे साथ इतनी दूर? ठीक है, अब हम एक कदम पीछे लेते हैं और अपने सिस्टम को देखते हैं। आपकी मशीन विंडोज चल रही है - डॉकर विंडोज पर (वर्तमान में) नहीं चलता है, इसलिए आप जिस टूल का उपयोग कर रहे हैं, उसने वर्चुअलबॉक्स वर्चुअल मशीन में लिनक्स होस्ट सेट किया है। जब आप docker runअपने वातावरण में करते हैं, तो ठीक यही काम हो रहा है - लिनक्स होस्ट पर पोर्ट 8080 कंटेनर पर पोर्ट 8080 से जुड़ा हुआ है। यहां बड़ा अंतर यह है कि आपका विंडोज होस्ट लिनक्स होस्ट नहीं है जिस पर कंटेनर चल रहा है, इसलिए यहां एक और परत है और यह इस परत पर संचार है जहां आप समस्याओं में चल रहे हैं।

आपको दो चीजों में से एक की जरूरत है:

  1. विंडोज 80 होस्ट करने के लिए वर्चुअलबॉक्स वीएम पर पोर्ट 8080 कनेक्ट करने के लिए, ठीक उसी तरह जैसे आप डॉकर कंटेनर को होस्ट पोर्ट से कनेक्ट करते हैं।

  2. वर्चुअलबॉक्स वीएम को सीधे आपके स्थानीय नेटवर्क से जोड़ने के लिए, bridgedऊपर वर्णित नेटवर्क मोड के साथ ।

यदि आप पहले विकल्प के लिए जाते हैं, तो आप उस कंटेनर तक पहुंच सकेंगे http://W:8080जहां Wविंडोज होस्ट का आईपी पता या होस्टनाम है। यदि आप दूसरे के लिए चुनते हैं, तो आप कंटेनर को एक्सेस करने में सक्षम होंगे http://L:8080जहां Lलिनक्स वीएम का आईपी पता या होस्टनाम है।

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

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

के लिए bridgedमोड (और यह वास्तव में सरल विकल्प है), अपने वीएम शट डाउन, शीर्ष पर "सेटिंग" बटन क्लिक करें और के लिए नेटवर्क मोड बदलने के bridgedलिए, तो वी एम को पुनः आरंभ और आप अच्छा जाने के लिए। VM को आपके स्थानीय नेटवर्क पर DHCP के माध्यम से एक IP पता चुनना चाहिए और उस IP पते पर नेटवर्क के अन्य कंप्यूटरों पर दिखाई देना चाहिए।


1
मैं केवल 2 IP पा सकता हूं, एक जो डॉकर दिखाता है जब मैं क्विकस्टार्ट टर्मिनल (192.168.99.100) खोलता हूं और मेरे कंप्यूटर में एक (192.168.0.157) होता है, तो docker run -p 8080:8080 dockertestमैं अपनी वेबसाइट का उपयोग करके अपनी वेबसाइट का उपयोग कर सकता हूं, http://192.168.99.100:8080लेकिन केवल अपने विंडोज कंप्यूटर ( होस्ट) और मेरे फोन से नहीं। अगर मैं उपयोग करता docker run -p 192.168.0.157:8080:8080 dockertestहूं तो मैं कहीं से भी किसी भी आईपी के साथ वेबसाइट तक नहीं पहुंच सकता। मुझे यकीन नहीं है कि नेटवर्किंग कैसे सेट की जाए, मैंने उपयोग करने की कोशिश की --net=bridgeलेकिन यह काम नहीं किया। क्या मुझे वर्चुअलबॉक्स खोलने की संभावना है? क्या मैं डॉकर के टर्मिनल का उपयोग नहीं कर सकता?
redsalt

समस्या डॉकर के साथ नहीं है, इसलिए नहीं, डॉकर आपकी मदद नहीं कर सकता। मैं कुछ संपादन जोड़ने जा रहा हूं, जो मुझे लगता है कि चल रहा है।
क्रिएटन

ठीक है धन्यवाद! अब मैं समझता हूं, मैं पूरे लिनक्स वर्चुअल मशीन भाग से भ्रमित हो रहा था। मैं इस धारणा के तहत था कि डॉकर आंतरिक सामान के लिए वर्चुअल बॉक्स का उपयोग कर रहा था जिसे मैं छूने के लिए नहीं मान रहा था। यह वास्तव में बहुत आसान था, मुझे बस bridgedवर्चुअल बॉक्स में बदलना पड़ा और अब यह अद्भुत काम करता है, बहुत-बहुत धन्यवाद।
redsalt

क्या एक ही नेटवर्क में खिड़कियां और डॉकटर कंटेनर रखने का कोई तरीका नहीं है, इसलिए हम पोर्ट फॉरवर्डिंग के बिना कंटेनरों को सीधे एक्सेस कर सकते हैं?
15

डॉकटर में जुपिटर सर्वर को चलाने के लिए खोज करने पर इस पर ठोकर लगी और इसे LAN के माध्यम से एक्सेस करने का प्रयास किया। क्या वैसे भी मुझे पता चल सकता है कि मोड स्विच करने के बाद L क्या है?
पॉलडोंग जूल

121
  1. Oracle VM VirtualBox प्रबंधक खोलें
  2. Docker द्वारा उपयोग किए गए VM का चयन करें
  3. सेटिंग्स -> नेटवर्क पर क्लिक करें
  4. एडेप्टर 1 (डिफ़ॉल्ट?) "संलग्न होना चाहिए: NAT"
  5. उन्नत -> पोर्ट अग्रेषण पर क्लिक करें
  6. नियम जोड़ें: प्रोटोकॉल टीसीपी, होस्ट पोर्ट 8080, गेस्ट पोर्ट 8080 (होस्ट आईपी और गेस्ट आईपी खाली छोड़ दें)
  7. अतिथि आपका डॉकटर कंटेनर है और होस्ट आपकी मशीन है

अब आपको अपने कंटेनर को लोकलहोस्ट: 8080 और अपने आंतरिक-आईपी: 8080 के माध्यम से ब्राउज़ करने में सक्षम होना चाहिए।


10
पुष्ट, अच्छा और आसान।
डर्क

2
सर्वश्रेष्ठ उत्तर, चयनित कोई विशाल विवरण नहीं
अमीर कय्यूम खान

2
आवारा उपयोगकर्ताओं के लिए इसे व्रांटफाइल में जोड़ें: config.vm.network "अग्रेषित_पोर्ट", अतिथि: 8080, मेजबान: 8080, प्रोटोकॉल: "टीसीपी"
विंस वरोहवेन

3
यो! इसने एकदम जादू की तरह काम किया! धन्यवाद!!!! मैं इस एक को जानने की कोशिश में घंटों लगाता हूं।
जोसेफ फ्रीमैन

2
यह VBox के माध्यम से डॉकर चलाने वाले किसी के लिए एक शानदार समाधान है!
मिरोडिन्हो

7

कई चीजों की कोशिश करने के बाद, इसने मेरे लिए काम किया:

  • thepublish = 0.0.0.0: 8080: 8080 docker ध्वज का उपयोग करें
  • NAT को वर्चुअलबॉक्स नेटवर्क मोड सेट करें, और किसी भी पोर्ट फ़ॉरवर्डिंग का उपयोग न करें

के अलावा अन्य पते के साथ 0.0.0.0मुझे कोई सफलता नहीं मिली।


4

TLDR: यदि आपके पास Windows फ़ायरवॉल सक्षम है, तो सुनिश्चित करें कि निजी नेटवर्क पर "vpnkit" के लिए कोई अपवाद नहीं है।

अपने विशेष मामले के लिए, मुझे पता चला कि जब मैं अपने कंटेनर के प्रकाशित पोर्ट को अपने स्थानीय नेटवर्क पर किसी अन्य मशीन से देखने की कोशिश कर रहा था, तो विंडोज फ़ायरवॉल मेरे कनेक्शन को रोक रहा था, क्योंकि इसे अक्षम करने से सब कुछ काम हो गया।

हालाँकि, मैं फ़ायरवॉल को पूरी तरह से निष्क्रिय नहीं करना चाहता था, इसलिए मैं अपने कंटेनर की सेवा तक पहुँच सकता था। इसने इस सवाल का जवाब दिया कि "कंटेनर" मेरी कंटेनर सेवा की ओर से कौन सा ऐप सुन रहा था। एक और SO थ्रेड खोजने के बाद , जिसने netstat -a -bमुझे मेरी मशीन पर सुनने वाले सॉकेट्स के पीछे के ऐप्स को खोजने के लिए उपयोग करने के लिए सिखाया , मैंने सीखा कि यह था vpnkit.exe, जिसमें पहले से ही मेरी विंडोज फ़ायरवॉल सेटिंग्स में एक प्रविष्टि थी: लेकिन "निजी नेटवर्क" उस पर अक्षम था, और एक बार मैंने इसे सक्षम कर दिया, मैं फ़ायरवॉल को पूरी तरह से अक्षम किए बिना अपने कंटेनर की सेवा को किसी अन्य मशीन से देखने में सक्षम था।


सर, आपने मुझे घंटों और घंटों की हताशा से बचाया। धन्यवाद।
बेहदाद

2

यह डॉकटर कंटेनर चलाने के लिए विंडोज उपयोगकर्ताओं द्वारा सामना किया जाने वाला सबसे आम मुद्दा है। IMO यह "डॉकर पर मिलियन डॉलर का प्रश्न" है; @ "रोक्को स्मिट" ने "मेरे मेजबान मशीन के फ़ायरवॉल पर डिफ़ॉल्ट रूप से अक्षम किया गया था" इसके लिए "इनबाउंड ट्रैफ़िक" को ठीक से इंगित किया है; मेरे मामले में, मेरा McAfee एंटी वायरस सॉफ्टवेयर। मैंने अतिरिक्त पोर्ट्स को McAfee की फ़ायरवॉल सेटिंग्स में उसी Wifi LAN पर अन्य कंप्यूटरों से इनबाउंड ट्रैफ़िक के लिए अनुमति दी है; तब यह जादू था। मैंने एक सप्ताह से अधिक समय तक इंटरनेट, एसओ, डॉकर डॉक्यूमेंटेशन, ट्यूटोरियल के बाद ट्यूटोरियल, डॉकिंग की नेटवर्किंग से संबंधित ट्यूटोरियल, और "मैकवैलन", "आईपावलान", "उपयोगकर्ता" के लिए विंडोज पर समर्थित नहीं "के कई चित्र के लिए संघर्ष किया था। परिभाषित पुल "और यहां तक ​​कि इसी एसओ थ्रेड जोड़े का भी। मैंने "उत्पादन में डॉकर का उपयोग करने वाला कोई भी व्यक्ति" के साथ Google ब्राउज़ करना भी शुरू कर दिया है, (हाँ मुझे पता है कि लिनक्स विंडोज सर्वर की तुलना में प्रोडक्शन वर्कलोड के लिए अधिक लोकप्रिय है) क्योंकि मैं एक्सेस नहीं कर पा रहा था (उसी होम वाईफाई में मेरे मोबाइल से) एक ngin विंडोज पर डॉकटर कंटेनर में तैनात ऐप। सब के बाद, यह कितना अच्छा है, अगर आप कम से कम उसी लैन में अन्य कंप्यूटर / उपकरणों से एप्लिकेशन (डॉकटर कंटेनर पर तैनात) तक पहुंच नहीं सकते हैं; अंततः मेरे मामले में, मुद्दा सिर्फ एक फ़ायरवॉल इनबाउंड ट्रैफ़िक को रोकने के साथ था; यदि आप कम से कम एक ही लैन में अन्य कंप्यूटर / उपकरणों से एप्लिकेशन (डॉकर कंटेनर पर तैनात) तक नहीं पहुंच सकते हैं; अंततः मेरे मामले में, मुद्दा सिर्फ एक फ़ायरवॉल इनबाउंड ट्रैफ़िक को रोकने के साथ था; यदि आप कम से कम एक ही लैन में अन्य कंप्यूटर / उपकरणों से एप्लिकेशन (डॉकर कंटेनर पर तैनात) तक नहीं पहुंच सकते हैं; अंततः मेरे मामले में, मुद्दा सिर्फ एक फ़ायरवॉल इनबाउंड ट्रैफ़िक को रोकने के साथ था;


0

मैंने पाया कि -p पोर्ट वैल्यू सेट करने के साथ-साथ, विंडोज के लिए डॉकर vpnkit का उपयोग करता है और इसके लिए इनबाउंड ट्रैफ़िक को मेरे होस्ट मशीन के फ़ायरवॉल पर डिफ़ॉल्ट रूप से अक्षम कर दिया गया था। Vpnkit के लिए इनबाउंड टीसीपी नियमों को सक्षम करने के बाद मैं अपने कंटेनरों को अन्य मशीनों से स्थानीय नेटवर्क पर एक्सेस करने में सक्षम था।

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