जवाबों:
Docker- रचना के अनुसार संदर्भ ,
बंदरगाहों को बेनकाब करें । या तो दोनों पोर्ट निर्दिष्ट करें (HOST: कंटेनर), या बस कंटेनर पोर्ट (एक यादृच्छिक होस्ट पोर्ट चुना जाएगा)।
मेरी 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
expose
डॉकफ़ाइल्स में समान है : "एक्सपोज़ अनुदेश वास्तव में पोर्ट प्रकाशित नहीं करता है। यह एक प्रकार के प्रलेखन के रूप में कार्य करता है ..." docs.docker.com/engine/reference/builder/#expose
docker-compose run
, तो डिफ़ॉल्ट रूप से पोर्ट परिभाषा docker-compose.yml
को अनदेखा किया जाता है। या तो docker-compose up
पैरामीटर का उपयोग करें या प्रदान करें--service-ports
पोर्ट :
उजागर करें :
पोर्ट्स इस सेक्शन का उपयोग होस्ट सर्वर और डॉकर कंटेनर के बीच मैपिंग को परिभाषित करने के लिए किया जाता है।
ports:
- 10005:80
इसका मतलब है कि कंटेनर के अंदर चल रहे एप्लिकेशन को पोर्ट 80 पर दिखाया गया है। लेकिन बाहरी सिस्टम / इकाई इसे एक्सेस नहीं कर सकती है, इसलिए इसे सर्वर पोर्ट होस्ट करने के लिए मैप करने की आवश्यकता है।
नोट: आपको होस्ट पोर्ट 10005 खोलना होगा और बाहरी संस्थाओं को एप्लिकेशन तक पहुंचने की अनुमति देने के लिए फ़ायरवॉल नियमों को संशोधित करना होगा।
वे उपयोग कर सकते हैं
http: // {host IP}: 10005
कुछ इस तरह
एक्सपोजर यह विशेष रूप से पोर्ट को परिभाषित करने के लिए उपयोग किया जाता है जिस पर एप्लिकेशन डॉकटर कंटेनर के अंदर चल रहा है।
आप इसे डॉकटरफाइल में भी परिभाषित कर सकते हैं। आम तौर पर, डॉकफाइल के अंदर एक्सपोज़ को परिभाषित करने के लिए यह अच्छा और व्यापक रूप से इस्तेमाल किया जाने वाला अभ्यास है क्योंकि बहुत कम ही कोई उन्हें डिफ़ॉल्ट रूप से 80 पोर्ट की तुलना में अन्य पोर्ट पर चलाता है
ports
अनुभाग मेजबान पर बंदरगाहों प्रकाशित करेंगे। डॉकर मेजबान नेटवर्क से कंटेनर में एक विशिष्ट पोर्ट के लिए आगे सेटअप करेगा। डिफ़ॉल्ट रूप से इसे एक यूजरस्पेस प्रॉक्सी प्रक्रिया के साथ लागू किया जाता है (docker-proxy
) के जो पहले पोर्ट पर सुनता है, और कंटेनर में आगे की ओर होता है, जिसे दूसरे बिंदु पर सुनने की आवश्यकता होती है। यदि कंटेनर गंतव्य पोर्ट पर नहीं सुन रहा है, तो आप अभी भी होस्ट पर कुछ सुनते हुए देखेंगे, लेकिन यदि आप अपने कंटेनर में आगे विफल रहे हैं, तो उस होस्ट पोर्ट से कनेक्ट करने का प्रयास करने पर कनेक्शन अस्वीकृत हो जाता है।
ध्यान दें, कंटेनर को सभी नेटवर्क इंटरफेस पर सुनना चाहिए क्योंकि यह प्रॉक्सी कंटेनर के नेटवर्क नेमस्पेस में नहीं चल रहा है और कंटेनर के अंदर 127.0.0.1 तक नहीं पहुंच सकता है। इसके लिए IPv4 विधि आपके एप्लिकेशन को सुनने के लिए कॉन्फ़िगर करना है 0.0.0.0
।
यह भी ध्यान दें कि प्रकाशित पोर्ट विपरीत दिशा में काम नहीं करते हैं। आप पोर्ट प्रकाशित करके कंटेनर से होस्ट पर एक सेवा से कनेक्ट नहीं कर सकते। इसके बजाय आप पहले से ही उपयोग में होस्ट पोर्ट को सुनने की कोशिश कर रहे docker त्रुटियाँ पाएंगे।
एक्सपोज है डॉक्यूमेंटेशन। यह छवि पर मेटाडेटा सेट करता है, और जब चल रहा है, तो कंटेनर पर भी। आमतौर पर आप EXPOSE
इसे निर्देश के साथ डॉकरफाइल में कॉन्फ़िगर करते हैं , और यह आपकी छवि को चलाने वाले उपयोगकर्ताओं के लिए दस्तावेज के रूप में कार्य करता है, उनके लिए यह जानने के लिए कि आपके एप्लिकेशन को डिफ़ॉल्ट रूप से किन पोर्टों पर सुना जाएगा। जब एक रचना फ़ाइल के साथ कॉन्फ़िगर किया जाता है, तो यह मेटाडेटा केवल कंटेनर पर सेट किया जाता है। जब आप docker inspect
छवि या कंटेनर पर चलते हैं तो आप उजागर पोर्ट देख सकते हैं ।
कुछ उपकरण हैं जो उजागर बंदरगाहों पर भरोसा करते हैं। डॉकटर में, द-P
ध्वज सभी उजागर बंदरगाहों को मेजबान पर अल्पकालिक बंदरगाहों पर प्रकाशित करेगा। यदि आप स्पष्ट रूप से कंटेनर पोर्ट सेट नहीं करते हैं, तो आपके रिवर्स ट्रैफ़िक का उपयोग करने के लिए डिफ़ॉल्ट पोर्ट का उपयोग करने पर डिफ़ॉल्ट रूप से विभिन्न रिवर्स प्रॉक्सी भी होती हैं।
उन बाहरी उपकरणों के अलावा, एक्सपोजर का कंटेनर के बीच नेटवर्किंग पर कोई प्रभाव नहीं पड़ता है। आपको केवल एक कंटेनर से दूसरे कंटेनर तक पहुंचने के लिए, एक सामान्य डॉकटर नेटवर्क और कंटेनर पोर्ट से कनेक्ट करने की आवश्यकता है। यदि वह नेटवर्क उपयोगकर्ता द्वारा बनाया गया है (उदाहरण के लिए डिफ़ॉल्ट ब्रिज नेटवर्क नहीं है bridge
), तो आप अन्य कंटेनरों से कनेक्ट करने के लिए DNS का उपयोग कर सकते हैं।
मैं पहले के जवाबों से पूरी तरह सहमत हूं। मैं सिर्फ यह बताना चाहता हूं कि एक्सपोज और पोर्ट के बीच का अंतर डॉकटर में सुरक्षा अवधारणा का हिस्सा है। यह डॉकटर की नेटवर्किंग के साथ हाथ से जाता है । उदाहरण के लिए:
वेब फ्रंट-एंड और बैक-एंड के साथ एक एप्लिकेशन की कल्पना करें। बाहरी दुनिया को वेब फ्रंट-एंड (शायद पोर्ट 80 पर) तक पहुंच की आवश्यकता है, लेकिन केवल बैक-एंड को ही डेटाबेस होस्ट और पोर्ट तक पहुंच की आवश्यकता है। उपयोगकर्ता-परिभाषित पुल का उपयोग करते हुए, केवल वेब पोर्ट को खोलने की आवश्यकता होती है, और डेटाबेस अनुप्रयोग को किसी भी पोर्ट को खोलने की आवश्यकता नहीं होती है, क्योंकि वेब फ्रंट-एंड उपयोगकर्ता-परिभाषित पुल पर पहुंच सकता है।
डॉकटर में नेटवर्क आर्किटेक्चर सेट करते समय यह एक सामान्य उपयोग का मामला है। इसलिए एक डिफ़ॉल्ट ब्रिज नेटवर्क में उदाहरण के लिए, पोर्ट बाहरी दुनिया से सुलभ नहीं हैं। वहाँ आप "बंदरगाहों" के साथ एक प्रवेश द्वार खोल सकते हैं। "एक्सपोज़" का उपयोग करने के साथ आप नेटवर्क के भीतर संचार को परिभाषित करते हैं। यदि आप डिफ़ॉल्ट पोर्ट्स को उजागर करना चाहते हैं, तो आपको अपने डॉक-कम्पोज़ फ़ाइल में "एक्सपोज़" को परिभाषित करने की आवश्यकता नहीं है।
expose
एक मेंdocker-compose
? जहाँ तक मैं बता सकता हूँ, आपको पोर्ट को लिंक की गई सेवाओं तक पहुँच योग्य बनाने के लिए निर्दिष्ट करने की आवश्यकता नहीं है।