Ответ
Инструкция EXPOSE в Dockerfile — это декларация намерений. Она документирует, на каких портах контейнерное приложение ожидает входящие соединения.
Ключевые моменты:
- Не открывает порты автоматически.
EXPOSEлишь добавляет метаданные к образу. - Не делает порт доступным с хоста. Для этого необходим флаг
-p(публикация порта) при запуске контейнера командойdocker run. - Полезно для документирования. По
Dockerfileи командеdocker inspectможно понять, какие порты использует приложение. - Влияет на сеть Docker. При запуске контейнера в пользовательской сети Docker (
docker network create) порты, объявленные черезEXPOSE, становятся доступными для других контейнеров в этой же сети без явной публикации.
Пример:
# Dockerfile
FROM nginx:alpine
EXPOSE 80 # Сообщаем, что nginx слушает на порту 80
# Запуск контейнера
# Без публикации порта: доступен только изнутри Docker-сети
docker run --name my-nginx nginx-custom
# С публикацией порта: порт 80 контейнера мапируется на порт 8080 хоста
docker run -p 8080:80 --name my-nginx nginx-custom
# Теперь приложение доступно по http://localhost:8080