คำตอบสั้น ๆ :
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
ที่จะสามารถดึงข้อมูลหน้าแรกของ