Вопрос проверяет понимание назначения директивы EXPOSE в Dockerfile и её отличия от публикации портов через флаг -p.
Директива EXPOSE в Dockerfile используется для указания портов, которые контейнер будет слушать во время выполнения. Она не публикует порты на хосте, а служит в первую очередь документацией для разработчиков и инструментов, таких как Docker Compose.
Когда вы добавляете EXPOSE 8080 в Dockerfile, вы сообщаете, что приложение внутри контейнера будет доступно на порту 8080. Однако без дополнительных флагов этот порт не будет доступен с хоста. Для публикации порта необходимо использовать флаг -p или --publish при запуске контейнера.
# Dockerfile
FROM node:18
WORKDIR /app
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]При запуске контейнера порт публикуется явно:
docker run -p 8080:3000 my-appЗдесь порт 3000 внутри контейнера маппится на порт 8080 на хосте.
docker run -P, который публикует все EXPOSE порты на случайные порты хоста.Вывод: EXPOSE — это декларативная метка, улучшающая читаемость Dockerfile и упрощающая работу с сетевыми настройками, но не заменяющая явную публикацию портов.