คำตอบสั้น ๆ :
EXPOSEเป็นวิธีการจัดทำเอกสาร
--publish(หรือ-p) เป็นวิธีการทำแผนที่พอร์ตของโฮสต์ที่จะวิ่งพอร์ตภาชนะ
แจ้งให้ทราบด้านล่างว่า:
EXPOSEเกี่ยวข้องกับDockerfiles( เอกสาร )
--publishเกี่ยวข้องกับdocker run ...( การกระทำ / เวลาทำงาน )
การเปิดเผยและเผยแพร่พอร์ต
ในระบบเครือข่ายนักเทียบท่ามีสองกลไกที่แตกต่างกันที่เกี่ยวข้องกับพอร์ตเครือข่ายโดยตรง: การเปิดเผยและการเผยแพร่พอร์ต สิ่งนี้ใช้กับเครือข่ายบริดจ์เริ่มต้นและเครือข่ายบริดจ์ที่ผู้ใช้กำหนด
คุณเปิดเผยพอร์ตโดยใช้EXPOSEคีย์เวิร์ดใน Dockerfile หรือแฟล็ก--exposeเพื่อเรียกใช้นักเทียบท่า เปิดเผยพอร์ตเป็นวิธีของการจัดเก็บเอกสารที่พอร์ตที่ใช้แต่ไม่ได้จริง map หรือเปิดพอร์ตใด การเปิดเผยพอร์ตเป็นตัวเลือก
คุณเผยแพร่พอร์ตใช้--publishหรือธง--publish-all docker runสิ่งนี้บอกนักเทียบท่าว่าจะเปิดพอร์ตใดบนอินเตอร์เฟซเครือข่ายของคอนเทนเนอร์ เมื่อพอร์ตถูกเผยแพร่พอร์ตนั้นจะถูกแมปกับพอร์ตลำดับสูงที่มีอยู่ (สูงกว่า30000) บนเครื่องโฮสต์ยกเว้นว่าคุณจะระบุพอร์ตที่จะแมปไปยังบนเครื่องโฮสต์เมื่อรันไทม์ คุณไม่สามารถระบุพอร์ตไปยังแผนที่บนเครื่องโฮสต์เมื่อคุณสร้างภาพ (ใน Dockerfile) เพราะมีวิธีที่จะรับประกันว่าพอร์ตที่จะมีอยู่บนเครื่องโฮสต์ที่คุณเรียกใช้ภาพ
จาก: เครือข่ายคอนเทนเนอร์ Docker
อัปเดตตุลาคม 2562 : ข้อความข้างต้นไม่อยู่ในเอกสารอีกต่อไป แต่เวอร์ชันที่เก็บถาวรอยู่ที่นี่: docs.docker.com/v17.09/engine/userguide/networking/#exposing-and-publishing-ports
อาจเป็นเอกสารปัจจุบันด้านล่าง:
พอร์ตที่เผยแพร่
ตามค่าเริ่มต้นเมื่อคุณสร้างคอนเทนเนอร์มันจะไม่เผยแพร่พอร์ตใด ๆ ไปยังโลกภายนอก ในการทำให้พอร์ตพร้อมใช้งานกับบริการที่อยู่นอก Docker หรือไปยังคอนเทนเนอร์ Docker ที่ไม่ได้เชื่อมต่อกับเครือข่ายของคอนเทนเนอร์ให้ใช้--publishหรือ-pตั้งค่าสถานะ สิ่งนี้สร้างกฎไฟร์วอลล์ซึ่งแมปพอร์ตคอนเทนเนอร์กับพอร์ตบนโฮสต์ Docker
และสามารถพบได้ที่นี่: docs.docker.com/config/containers/container-networking/#published-ports
นอกจากนี้
โดน
... EXPOSEคำสั่งไม่ได้เผยแพร่พอร์ตจริง มันทำหน้าที่เป็นประเภทของเอกสารระหว่างบุคคลที่สร้างอิมเมจและบุคคลที่รันคอนเทนเนอร์ซึ่งมีจุดประสงค์ในการเผยแพร่พอร์ต
จาก: การอ้างอิง Dockerfile
การเข้าถึงบริการเมื่อEXPOSE/ --publishไม่ได้ถูกกำหนด:
ที่คำตอบของ @Golo Rodenมีการระบุว่า ::
"ถ้าคุณไม่ได้ระบุสิ่งเหล่านี้บริการในคอนเทนเนอร์จะไม่สามารถเข้าถึงได้จากทุกที่ยกเว้นจากภายในคอนเทนเนอร์เอง"
บางทีนั่นอาจจะเป็นกรณีที่ในเวลานั้นคำตอบที่ถูกเขียน แต่ตอนนี้มันดูเหมือนว่าแม้ว่าคุณจะไม่ได้ใช้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ที่จะสามารถดึงข้อมูลหน้าแรกของ