संक्षिप्त जवाब:
EXPOSEदस्तावेजीकरण का एक तरीका है
--publish(या -p) एक होस्ट पोर्ट को रनिंग कंटेनर पोर्ट पर मैप करने का एक तरीका है
उसके नीचे सूचना:
EXPOSEDockerfiles( दस्तावेजीकरण ) से संबंधित है
--publishसे संबंधित है docker run ...( निष्पादन / रन-टाइम )
एक्सपोजिंग और प्रकाशन पोर्ट
डॉकर नेटवर्किंग में, दो अलग-अलग तंत्र हैं जो सीधे नेटवर्क पोर्ट को शामिल करते हैं: पोर्ट को उजागर करना और प्रकाशित करना। यह डिफ़ॉल्ट ब्रिज नेटवर्क और उपयोगकर्ता द्वारा परिभाषित ब्रिज नेटवर्क पर लागू होता है।
आप EXPOSEDockerfile में कीवर्ड का उपयोग करके पोर्ट्स को उजागर करते हैं और --exposeफ्लैग टू डूकर रन करते हैं। एक्सपोज़िंग पोर्ट एक तरह से डॉक्यूमेंटिंग है कि किन पोर्ट्स का उपयोग किया जाता है, लेकिन वास्तव में कोई भी पोर्ट मैप या ओपन नहीं करता है । एक्सपोजिंग पोर्ट वैकल्पिक है।
आप पोर्ट को --publishया --publish-allध्वज का उपयोग करके प्रकाशित करते हैं docker run। यह डॉकटर को बताता है कि कंटेनर के नेटवर्क इंटरफेस पर कौन से पोर्ट खोलने हैं। जब कोई पोर्ट प्रकाशित होता है, तो इसे 30000होस्ट मशीन पर उपलब्ध उच्च-ऑर्डर पोर्ट (उच्चतर ) में मैप किया जाता है , जब तक कि आप पोर्ट को रनटाइम पर होस्ट मशीन पर मैप करने के लिए निर्दिष्ट नहीं करते हैं। आप पोर्ट को होस्ट मशीन पर मैप करने के लिए निर्दिष्ट नहीं कर सकते हैं जब आप छवि का निर्माण करते हैं (डॉकफेराइल में), क्योंकि यह गारंटी देने का कोई तरीका नहीं है कि पोर्ट होस्ट मशीन पर उपलब्ध होगा जहां आप छवि चलाते हैं ।
से: डॉकर कंटेनर नेटवर्किंग
अद्यतन अक्टूबर 2019 : पाठ का उपरोक्त टुकड़ा अब डॉक्स में नहीं है, लेकिन एक संग्रहीत संस्करण यहां है: docs.docker.com/v17.09/engine/userguide/networking/#exposing-and-publisherport
शायद वर्तमान प्रलेखन नीचे है:
प्रकाशित पोर्ट
डिफ़ॉल्ट रूप से, जब आप एक कंटेनर बनाते हैं, तो वह इसके किसी भी पोर्ट को बाहरी दुनिया में प्रकाशित नहीं करता है। किसी पोर्ट को डॉकर के बाहर, या डॉकरी कंटेनरों के लिए उपलब्ध कराने के लिए, जो कंटेनर के नेटवर्क से कनेक्ट नहीं हैं, --publishया -pध्वज का उपयोग करें । यह एक फ़ायरवॉल नियम बनाता है जो डॉकेर होस्ट पर पोर्ट में कंटेनर पोर्ट को मैप करता है।
और यहाँ पाया जा सकता है: docs.docker.com/config/containers/container-networking/#publisher-ports
इसके अलावा,
बेनकाब
... EXPOSEनिर्देश वास्तव में पोर्ट प्रकाशित नहीं करता है । यह एक प्रकार के प्रलेखन के रूप में कार्य करता है छवि बनाने वाले व्यक्ति और कंटेनर चलाने वाले व्यक्ति के बीच , जिसके बारे में बंदरगाहों को प्रकाशित करने का इरादा है।
से: Dockerfile संदर्भ
सेवा का उपयोग कर सकते हैं जब EXPOSE/ --publishपरिभाषित नहीं कर रहे हैं:
@ गोलो रोडेन के जवाब में कहा गया है कि ::
"यदि आप उनमें से किसी को भी निर्दिष्ट नहीं करते हैं, तो कंटेनर में सेवा कंटेनर के अंदर के अलावा कहीं से भी सुलभ नहीं होगी।"
हो सकता है कि उस समय ऐसा था जब उत्तर लिखा जा रहा था, लेकिन अब ऐसा लगता है कि भले ही आप उपयोग न करें EXPOSEया --publish, hostऔर containersउसी नेटवर्क के अन्य आप उस कंटेनर के अंदर शुरू होने वाली सेवा तक पहुंच सकते हैं।
इसका परीक्षण कैसे करें:
मैंने निम्नलिखित प्रयोग किया है Dockerfile। असल में, मैं ubuntu के साथ शुरू करता हूं और एक छोटा वेब सर्वर स्थापित करता हूं:
FROM ubuntu
RUN apt-get update && apt-get install -y mini-httpd
मैं build"टेस्टएक्सपोज" के रूप में छवि और runएक नया कंटेनर के साथ:
docker run --rm -it testexpose bash
कंटेनर के अंदर, मैं कुछ उदाहरण प्रस्तुत करता हूं mini-httpd:
root@fb8f7dd1322d:/# mini_httpd -p 80
root@fb8f7dd1322d:/# mini_httpd -p 8080
root@fb8f7dd1322d:/# mini_httpd -p 8090
फिर मैं curlमेजबान या अन्य कंटेनरों से होम पेज लाने के लिए उपयोग करने में सक्षम हूं mini-httpd।