2016-02-27 2 views
1

Я смущен опцией «-expose» в Docker, я не знаю, что она на самом деле сделает.Зачем нужна опция «-expose» в Docker?

Когда я укажу его (например, --expose = 1234) в «docker run ...», где будет отображаться порт EXPOSED? Я не думаю, что могу получить доступ к порту в хосте, если я этого хочу, я думаю, что мне нужно «-p», и что на самом деле «-expose»?

Я думаю, что если я хочу получить доступ к порту контейнера с хоста, то мне нужно, пусть служба в контейнере прослушивает порт, используйте параметр «-p» в «docker run», чтобы опубликовать порт на гостья. Или в этом случае мне все еще нужно использовать «--expose», чтобы открыть порт?

+0

Что показали ваши испытания? Делает ли '-p' то, что вы хотите? Два параметра [для разных направлений] (https://docs.docker.com/engine/reference/run/#expose-incoming-ports), входящие и исходящие. – msw

ответ

1

-p позволит вам отобразить порт EXPOSE'd (как установлено в файле Docker).

Но если этот порт не был EXPOSE'd в Dockerfile и его результирующее изображение, вы можете выставить его --expose:

От docker run:

EXPOSE инструкция определяет начальные входящие порты которые предоставляют услуги. Эти порты доступны для процессов внутри контейнера. Оператор может использовать опцию --expose для добавления к открытым портам.

Это способ перезаписать определение изображения (которое не отображало порт), выставив этот порт во время выполнения.
На самом деле «перезаписать» неправильный термин, как указано в PR 14625 и PR 15675:

С исключением EXPOSE директивы, разработчик изображения не получил большой контроль над сетями. Команда EXPOSE определяет начальные входящие порты , предоставляющие услуги. Эти порты доступны процессов внутри контейнера.
Оператор может использовать опцию --expose для добавления в открытые порты.

(«добавить» является ключевым здесь: вы можете объявить во время выполнения дополнительные порты)

Как уже говорилось в комментарии, это не имеет ничего общего с деятельностью на EXPOSE порту (это делает не гарантирует, что процесс прослушивает порт в контейнере)
Это всего лишь способ объявить open port, то есть порт, который будет принимать пакеты.

+0

Спасибо, так это значит, что даже служба, запущенная в контейнере, прослушивает порт, если я не выставляю его EXPOSE или «--expose», я не могу опубликовать этот порт на «-p» в хосте? I.e., EXPOSE или «--expose» является предварительным условием «-p»? – Eric

+1

@ Эрик да, это идея. EXPOSE позволяет другим контейнерам получить доступ к этому порту (или для того, чтобы пользователь мог отобразить порт на порт хоста). EXPOSE означает, что порт невидим за пределами контейнера. – VonC

+0

, но для этого нужен контейнер, чтобы быть кооперативным, не так ли?Я имею в виду, что, если порт экспонируется EXPOSE или «--expose», но служба, запущенная в контейнере, на самом деле не прослушивает этот порт? Есть ли механизм, гарантирующий, что открытый порт действительно прослушивается внутри контейнера? – Eric