ทำไมต้องใช้ EXPOSE ใน Dockerfile - เนื่องจากคุณสามารถผูกเข้ากับพอร์ตทั้งหมดได้


23

ฉันสามารถทำได้docker run -p 3000:3000 image โดยไม่ต้อง EXPOSEพอร์ตที่อยู่ในภาชนะ (ดูด้านล่าง) หากเป็นจริงแล้วทำไมต้องกังวลกับการวาง EXPOSE ไว้ใน Dockerfile มันเป็นเพียงการสื่อสารกับผู้ใช้ภาพ? เพราะฉันไม่รู้เหตุผลที่ใช้งานได้ของพอร์ต EXPOSE หากพวกมันถูกผูกมัดอยู่ดี


นี่คือขั้นตอนที่แสดงการเชื่อมโยงพอร์ตในคอนเทนเนอร์แม้ว่าจะไม่ใช่ EXPOSEd ก็ตาม

$ cat Dockerfile
FROM alpine
RUN apk add nodejs npm vim
COPY webserver /webserver
CMD [ "node", "/webserver/index.js" ]


$ docker build .
Sending build context to Docker daemon  1.931MB
Step 1/4 : FROM alpine
 ---> 11cd0b38bc3c
Step 2/4 : RUN apk add nodejs npm vim
 ---> Using cache
 ---> 4270f8bdb201
Step 3/4 : COPY webserver /webserver
 ---> Using cache
 ---> 67f4cda61ff0
Step 4/4 : CMD [ "node", "/webserver/index.js" ]
 ---> Using cache
 ---> 1df8f9024b85
Successfully built 1df8f9024b85


$ curl localhost:4400
curl: (7) Failed to connect to localhost port 4400: Connection refused


$ docker run -d -p 4400:3000 1df8f9024b85
7d0e6c56f8ad8827fe72830a30c1aac96821104b8ea111291ca39e6536aad8fd


$ curl localhost:4400
Hello World!


$

คำตอบ:


29

เอกสาร EXPOSEของนักเทียบเรือระบุจุดเฉพาะนี้:

EXPOSEการเรียนการสอนไม่ได้จริงเผยแพร่พอร์ต มันทำหน้าที่เป็นเอกสารประเภทหนึ่งระหว่างผู้ที่สร้างอิมเมจและผู้ที่รันคอนเทนเนอร์ซึ่งมีจุดประสงค์ในการเผยแพร่พอร์ต หากต้องการเผยแพร่พอร์ตจริงเมื่อใช้งานคอนเทนเนอร์ให้ใช้การ-pตั้งค่าสถานะdocker runเพื่อเผยแพร่และแมปพอร์ตหนึ่งพอร์ตขึ้นไปหรือ-Pตั้งค่าสถานะเพื่อเผยแพร่พอร์ตที่เปิดเผยทั้งหมดและแมปพอร์ตเหล่านั้นกับพอร์ตที่มีลำดับสูง

ให้ความสนใจกับประโยคสุดท้ายหากคุณเปิดเผยหลายพอร์ตแล้ว-Pจะมีประโยชน์เพื่อหลีกเลี่ยงการตั้งค่าหลายรายการ-pในบรรทัดคำสั่ง


"เอกสาร" อยู่ในรูปของข้อมูลเมตาของรูปภาพ นอกเหนือจากการเป็นประโยชน์กับการ-Pตั้งค่าสถานะยูทิลิตี้อื่น ๆ สามารถสอบถามการเรียกใช้คอนเทนเนอร์สำหรับข้อมูลเมตานี้ซึ่งเป็นประโยชน์ในพร็อกซีที่ปรับปรุงกฎการส่งต่อแบบไดนามิกโดยใช้พอร์ตที่เปิดเผยเหล่านี้เป็นค่าเริ่มต้น
BMitch

@BMitch อย่างผมรู้สึกว่ามันเป็นข้อมูลภายนอกไม่ได้มีประโยชน์สำหรับ OP แต่รู้สึกอิสระที่จะแก้ไขใน.
Tensibai

EXPOSE เป็นเอกสารประกอบ
井上智文

4

สิ่งนี้ทำเพื่อประโยชน์ของระบบอัตโนมัติ คุณสามารถมีคำสั่งสากลที่เรียกใช้docker run -Pเพื่อเริ่มต้นคอนเทนเนอร์และ Dockerfile นั้นใช้เพื่อระบุว่าคอนเทนเนอร์ใดจะเปิดเผยพอร์ตใด ในกรณีที่คุณจัดการกับภาชนะบรรจุหลายสิบหรือหลายร้อยแห่งที่ถูกสร้างขึ้นผ่านไปป์ไลน์สิ่งนี้มีประโยชน์มาก การส่งผ่านรายละเอียดภายนอกที่ไม่มีอยู่ใน Dockerfile พร้อมกับคอนเทนเนอร์ผ่านไปป์ไลน์จากเวทีหนึ่งไปอีกขั้นนั้นค่อนข้างยาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.