Докер автоматически связывает порт - PullRequest
0 голосов
/ 13 мая 2018

Когда я не выставляю какие-либо порты при записи моего Dockerfile, а также не привязываю никакие порты при запуске docker run, я все еще могу взаимодействовать с приложениями, работающими внутри контейнера.Почему?


Я пишу свой Dockerfile для приложения Node.Это довольно просто и выглядит так:

FROM node:8

COPY . .
RUN yarn
RUN yarn run build

ARG PORT=80
EXPOSE $PORT

CMD yarn run serve

Используя этот Dockerfile, я смог построить образ, используя docker build

$ cd ~/project/dir/
$ docker build . --build-arg PORT=8080

И запустить его, используя docker run

$ docker run -p 8080 <image-id>

Затем я получил доступ к приложению, запущенному внутри контейнера Docker, по IP-адресу, например http://172.17.0.12:8080/, и он работает.


Однако, когда я удалил инструкцию EXPOSEиз Dockerfile и удалите опцию -p в docker run, , приложение все еще работает !Как будто Docker автоматически связывает мои порты


Дополнительные примечания:

  1. Похоже, что другой пользователь испытал ту же проблему
  2. Я попытался восстановить свое изображение, используя --no-cache после удаления инструкций EXPOSE, но эта проблема все еще существует.
  3. Используя docker inspect, я не вижу записей для Config.ExposedPorts

1 Ответ

0 голосов
/ 13 мая 2018

команда EXPOSE в Dockerfile действительно мало что делает, и я думаю, что людям, которые читают Dockerfile, лучше знать, какие порты / службы работают внутри контейнера.Однако EXPOSE полезен, когда вы запускаете contianer с аргументом -P (-P, --publish-all Опубликовать все открытые порты на случайные порты)

docker run -P my_image

, но если вы используете* нижний регистр -p Вы должны указать источник: порт назначения ... Смотрите это thread

Если вы не пишете EXPOSE в Dockerfile, это не имеет никакого влияния на приложение внутриконтейнер, это только для заглавной буквы -P аргумент ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...