Когда я не выставляю какие-либо порты при записи моего 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 автоматически связывает мои порты
Дополнительные примечания:
- Похоже, что другой пользователь испытал ту же проблему
- Я попытался восстановить свое изображение, используя
--no-cache
после удаления инструкций EXPOSE
, но эта проблема все еще существует. - Используя
docker inspect
, я не вижу записей для Config.ExposedPorts