Что делает инструкция EXPOSE в Dockerfile?

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

Ответ

Инструкция EXPOSE в Dockerfile — это декларация намерений. Она документирует, на каких портах контейнерное приложение ожидает входящие соединения.

Ключевые моменты:

  1. Не открывает порты автоматически. EXPOSE лишь добавляет метаданные к образу.
  2. Не делает порт доступным с хоста. Для этого необходим флаг -p (публикация порта) при запуске контейнера командой docker run.
  3. Полезно для документирования. По Dockerfile и команде docker inspect можно понять, какие порты использует приложение.
  4. Влияет на сеть 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