Навіщо використовувати 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

Docker це піддає ДОКУМЕНТАЦІЯ вирішує цю конкретну точку:

EXPOSEІнструкція фактично не публікує порт. Він функціонує як тип документації між людиною, яка створює зображення, і особою, яка управляє контейнером, про які порти призначені для публікації. Щоб фактично опублікувати порт під час запуску контейнера, використовуйте -pпрапор, docker runщоб опублікувати та зіставити один або кілька портів, або -Pпрапор, щоб опублікувати всі відкриті порти та відобразити їх у порти високого порядку.

Зверніть увагу на останнє речення, якщо ви виставляєте кілька портів, то -Pстане корисним, щоб уникнути встановлення множин -pу командному рядку.


"Документація" у вигляді метаданих зображень. Крім корисної для -Pпрапора, інші утиліти можуть запитувати запущені контейнери для цих метаданих, що корисно в проксі-серверах, які динамічно оновлюють свої правила переадресації, використовуючи ці відкриті порти як свої за замовчуванням.
BMitch

@BMitch абсолютно, я вважав, що це не є корисною інформацією, яка ще не є корисною для ОП, але
сміливо

ЕКСПОЗИЦІЯ - це документація
井上 智 文

4

Це робиться заради автоматизації. Ви можете мати універсальну команду, яка запускається docker run -Pдля запуску контейнера, а сам Dockerfile використовується для вказівки, який контейнер відкриває, який порт. Якщо ви маєте справу з десятками чи сотнями контейнерів, які будуються трубопроводом, це дуже корисно. Передавати зовнішні деталі, які не містяться в Dockerfile разом з контейнером, через трубопровід від стадії до етапу досить важко.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.