Что такое EXPOSE в Dockerfile?

«Что такое EXPOSE в Dockerfile?» — вопрос из категории Docker, который задают на 24% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Инструкция EXPOSE в Dockerfile — это декларация о том, что контейнер будет прослушивать указанные сетевые порты на определённом транспортном протоколе (по умолчанию TCP). Это метаинформация, а не команда, открывающая порты.

Как я использую EXPOSE на практике:

  1. Документация: Это явное указание для других разработчиков (и для меня в будущем), какие порты использует приложение внутри контейнера. Например, веб-сервер — 80, HTTPS — 443, дебаг-порт приложения — 5005.

    FROM nginx:alpine
    # Документируем, что контейнер использует стандартные порты HTTP/HTTPS
    EXPOSE 80/tcp 443/tcp
  2. Автоматическое пробрасывание портов с флагом -P: При запуске docker run -P Docker автоматически сопоставит каждый порт из 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 также может использоваться для автоматической настройки сетевых правил.