Ответ
Инструкция EXPOSE в Dockerfile — это декларация о том, что контейнер будет прослушивать указанные сетевые порты на определённом транспортном протоколе (по умолчанию TCP). Это метаинформация, а не команда, открывающая порты.
Как я использую EXPOSE на практике:
-
Документация: Это явное указание для других разработчиков (и для меня в будущем), какие порты использует приложение внутри контейнера. Например, веб-сервер — 80, HTTPS — 443, дебаг-порт приложения — 5005.
FROM nginx:alpine # Документируем, что контейнер использует стандартные порты HTTP/HTTPS EXPOSE 80/tcp 443/tcp -
Автоматическое пробрасывание портов с флагом
-P: При запускеdocker run -PDocker автоматически сопоставит каждый порт изEXPOSEсо случайным высоким портом (например, 32768+) на хосте. Это удобно для тестирования.# Запуск с автоматической публикацией портов docker run -d -P my-nginx docker port <container_id> # Покажет сопоставление 80/tcp -> 0.0.0.0:32768
Критически важное уточнение: EXPOSE НЕ делает порт доступным снаружи хоста. Для публикации порта наружу используется флаг -p (публикация на конкретный порт) или -P (автоматическая публикация).
# EXPOSE 80 в Dockerfile, но без этих флагов порт 80 будет доступен ТОЛЬКО внутри Docker-сети.
# Правильная публикация порта на хост:
docker run -p 8080:80 my-nginx # Теперь приложение доступно на localhost:8080
В CI/CD пайплайнах и оркестраторах (Kubernetes, Docker Compose) информация из EXPOSE также может использоваться для автоматической настройки сетевых правил.