डॉकटर-कंपोज़ पोर्ट्स बनाम एक्सपोज़ के बीच क्या अंतर है


जवाबों:


527

Docker- रचना के अनुसार संदर्भ ,

पोर्ट के रूप में परिभाषित किया गया है:

बंदरगाहों को बेनकाब करें । या तो दोनों पोर्ट निर्दिष्ट करें (HOST: कंटेनर), या बस कंटेनर पोर्ट (एक यादृच्छिक होस्ट पोर्ट चुना जाएगा)।

  • Docker-compose.yml में वर्णित पोर्ट्स को docker-compose द्वारा शुरू की गई विभिन्न सेवाओं के बीच साझा किया जाएगा।
  • पोर्ट्स को होस्ट मशीन को एक यादृच्छिक पोर्ट या किसी दिए गए पोर्ट के संपर्क में लाया जाएगा।

मेरी docker-compose.ymlतरह दिखता है:

mysql:
  image: mysql:5.7
  ports:
    - "3306"

अगर मैं करता हूँ docker-compose ps, तो ऐसा लगेगा:

  Name                     Command               State            Ports
-------------------------------------------------------------------------------------
  mysql_1       docker-entrypoint.sh mysqld      Up      0.0.0.0:32769->3306/tcp

एक्सपोज़ के रूप में परिभाषित किया गया है:

होस्ट मशीन पर प्रकाशित किए बिना बंदरगाहों को बेनकाब करें - वे केवल लिंक की गई सेवाओं तक ही पहुंच पाएंगे। केवल आंतरिक पोर्ट निर्दिष्ट किया जा सकता है।

बंदरगाहों को मेजबान मशीनों के संपर्क में नहीं लाया जाता है, केवल अन्य सेवाओं के संपर्क में आता है।

mysql:
  image: mysql:5.7
  expose:
    - "3306"

अगर मैं करता हूँ docker-compose ps, तो ऐसा लगेगा:

  Name                  Command             State    Ports
---------------------------------------------------------------
 mysql_1      docker-entrypoint.sh mysqld   Up      3306/tcp

24
यह समझाने के बारे में कुछ क्या फायदे वहाँ निर्दिष्ट करने के लिए कर रहे हैं संभव होगा exposeएक में docker-compose? जहाँ तक मैं बता सकता हूँ, आपको पोर्ट को लिंक की गई सेवाओं तक पहुँच योग्य बनाने के लिए निर्दिष्ट करने की आवश्यकता नहीं है।
रसदार

3
क्या यह नहीं बताया जाना चाहिए कि उजागर बंदरगाह केवल उसी डॉक नेटवर्क में सेवाओं के लिए उपलब्ध होंगे (लिंकिंग को अधिकांश भागों के लिए प्रतिस्थापित किया जा रहा है)।
मियो

8
@ जूसी मुझे लगता है कि यह exposeडॉकफ़ाइल्स में समान है : "एक्सपोज़ अनुदेश वास्तव में पोर्ट प्रकाशित नहीं करता है। यह एक प्रकार के प्रलेखन के रूप में कार्य करता है ..." docs.docker.com/engine/reference/builder/#expose
tsauerwein

1
क्या पोर्ट फायरवॉल स्तर पर किसी भी सेटिंग को ओवरराइड करते हैं? मैंने अभी देखा कि मैंने फ़ायरवॉल पर mysql के लिए पोर्ट नहीं खोले थे, लेकिन वे दूर से सुलभ थे। मेरे पास एक्सपोज़ के बजाय "3306: 3306" पोर्ट थे।
टेकियसफैनटिकस

3
और याद रखें, यदि आप उपयोग करते हैं docker-compose run, तो डिफ़ॉल्ट रूप से पोर्ट परिभाषा docker-compose.ymlको अनदेखा किया जाता है। या तो docker-compose upपैरामीटर का उपयोग करें या प्रदान करें--service-ports
Juha Untinen

177

पोर्ट :

  1. डॉकटर के बाहर दुनिया से निर्दिष्ट पोर्ट (ओं) को सुनने के लिए कंटेनर को सक्रिय करता है (एक ही मेजबान मशीन या एक अलग मशीन हो सकती है) और डॉकटर के अंदर भी सुलभ दुनिया।
  2. एक से अधिक पोर्ट निर्दिष्ट किए जा सकते हैं (यही वजह है कि पोर्ट पोर्ट नहीं हैं)

यहाँ छवि विवरण दर्ज करें

उजागर करें :

  1. डॉकटर के अंदर दुनिया से केवल एक विशिष्ट पोर्ट को सुनने के लिए कंटेनर को सक्रिय करता है और डॉकटर के बाहर सुलभ दुनिया नहीं है।
  2. एक से अधिक पोर्ट निर्दिष्ट किए जा सकते हैं

यहाँ छवि विवरण दर्ज करें


3
ध्यान दें कि एक्सपोज़ कई पोर्ट्स की अनुमति देता है - docs.docker.com/compose/compose-file/#expose - हालांकि आप केवल आंतरिक + बाहरी के बजाय आंतरिक पोर्ट की आपूर्ति करते हैं
स्टुअर्ट मूर

लेकिन क्या होगा अगर मैं अपने कंटेनर से दुनिया के बाहर लहजे करना चाहता हूं? stackoverflow.com/questions/61322256/…
gstackoverflow

25

पोर्ट्स इस सेक्शन का उपयोग होस्ट सर्वर और डॉकर कंटेनर के बीच मैपिंग को परिभाषित करने के लिए किया जाता है।

ports:
   - 10005:80

इसका मतलब है कि कंटेनर के अंदर चल रहे एप्लिकेशन को पोर्ट 80 पर दिखाया गया है। लेकिन बाहरी सिस्टम / इकाई इसे एक्सेस नहीं कर सकती है, इसलिए इसे सर्वर पोर्ट होस्ट करने के लिए मैप करने की आवश्यकता है।

नोट: आपको होस्ट पोर्ट 10005 खोलना होगा और बाहरी संस्थाओं को एप्लिकेशन तक पहुंचने की अनुमति देने के लिए फ़ायरवॉल नियमों को संशोधित करना होगा।

वे उपयोग कर सकते हैं

http: // {host IP}: 10005

कुछ इस तरह

एक्सपोजर यह विशेष रूप से पोर्ट को परिभाषित करने के लिए उपयोग किया जाता है जिस पर एप्लिकेशन डॉकटर कंटेनर के अंदर चल रहा है।

आप इसे डॉकटरफाइल में भी परिभाषित कर सकते हैं। आम तौर पर, डॉकफाइल के अंदर एक्सपोज़ को परिभाषित करने के लिए यह अच्छा और व्यापक रूप से इस्तेमाल किया जाने वाला अभ्यास है क्योंकि बहुत कम ही कोई उन्हें डिफ़ॉल्ट रूप से 80 पोर्ट की तुलना में अन्य पोर्ट पर चलाता है


19

बंदरगाहों

portsअनुभाग मेजबान पर बंदरगाहों प्रकाशित करेंगे। डॉकर मेजबान नेटवर्क से कंटेनर में एक विशिष्ट पोर्ट के लिए आगे सेटअप करेगा। डिफ़ॉल्ट रूप से इसे एक यूजरस्पेस प्रॉक्सी प्रक्रिया के साथ लागू किया जाता है (docker-proxy ) के जो पहले पोर्ट पर सुनता है, और कंटेनर में आगे की ओर होता है, जिसे दूसरे बिंदु पर सुनने की आवश्यकता होती है। यदि कंटेनर गंतव्य पोर्ट पर नहीं सुन रहा है, तो आप अभी भी होस्ट पर कुछ सुनते हुए देखेंगे, लेकिन यदि आप अपने कंटेनर में आगे विफल रहे हैं, तो उस होस्ट पोर्ट से कनेक्ट करने का प्रयास करने पर कनेक्शन अस्वीकृत हो जाता है।

ध्यान दें, कंटेनर को सभी नेटवर्क इंटरफेस पर सुनना चाहिए क्योंकि यह प्रॉक्सी कंटेनर के नेटवर्क नेमस्पेस में नहीं चल रहा है और कंटेनर के अंदर 127.0.0.1 तक नहीं पहुंच सकता है। इसके लिए IPv4 विधि आपके एप्लिकेशन को सुनने के लिए कॉन्फ़िगर करना है 0.0.0.0

यह भी ध्यान दें कि प्रकाशित पोर्ट विपरीत दिशा में काम नहीं करते हैं। आप पोर्ट प्रकाशित करके कंटेनर से होस्ट पर एक सेवा से कनेक्ट नहीं कर सकते। इसके बजाय आप पहले से ही उपयोग में होस्ट पोर्ट को सुनने की कोशिश कर रहे docker त्रुटियाँ पाएंगे।

बेनकाब

एक्सपोज है डॉक्यूमेंटेशन। यह छवि पर मेटाडेटा सेट करता है, और जब चल रहा है, तो कंटेनर पर भी। आमतौर पर आप EXPOSEइसे निर्देश के साथ डॉकरफाइल में कॉन्फ़िगर करते हैं , और यह आपकी छवि को चलाने वाले उपयोगकर्ताओं के लिए दस्तावेज के रूप में कार्य करता है, उनके लिए यह जानने के लिए कि आपके एप्लिकेशन को डिफ़ॉल्ट रूप से किन पोर्टों पर सुना जाएगा। जब एक रचना फ़ाइल के साथ कॉन्फ़िगर किया जाता है, तो यह मेटाडेटा केवल कंटेनर पर सेट किया जाता है। जब आप docker inspectछवि या कंटेनर पर चलते हैं तो आप उजागर पोर्ट देख सकते हैं ।

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

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


3

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

वेब फ्रंट-एंड और बैक-एंड के साथ एक एप्लिकेशन की कल्पना करें। बाहरी दुनिया को वेब फ्रंट-एंड (शायद पोर्ट 80 पर) तक पहुंच की आवश्यकता है, लेकिन केवल बैक-एंड को ही डेटाबेस होस्ट और पोर्ट तक पहुंच की आवश्यकता है। उपयोगकर्ता-परिभाषित पुल का उपयोग करते हुए, केवल वेब पोर्ट को खोलने की आवश्यकता होती है, और डेटाबेस अनुप्रयोग को किसी भी पोर्ट को खोलने की आवश्यकता नहीं होती है, क्योंकि वेब फ्रंट-एंड उपयोगकर्ता-परिभाषित पुल पर पहुंच सकता है।

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

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