Как используются эфемерные порты хоста при использовании docker?

#docker #docker-compose

Вопрос:

Согласно документации раздела порты в файле docker compose, когда мы опускаем порт хоста, он будет выбран случайным образом. Например:

 ports:
  - "80" # container port: 80, host port: ephemeral(random)
 

Чем это полезно? Как эта функция используется на практике?

Ответ №1:

Термин «эфемерный» обычно определяется как атрибут чего-то, что имеет короткий срок службы. Здесь это означает, что каждый раз, когда вы перезапускаете контейнер, он будет сопоставляться с другим «случайным» портом хоста. Обычно это очень большой номер порта, больше 60000. Я вижу три варианта использования, в которых такое поведение может быть полезным:

  • Это гарантирует отсутствие конфликтов портов с другими службами, уже запущенными на хосте. Допустим, на порту 80 работает служба Apache, запуск контейнера nginx с синтаксисом одного порта «80» не приведет к ошибке. Это может упростить тестирование. Вы можете быстро протестировать службу, не останавливая другую, которая занимает порт.
  • Он также может быть использован в качестве некоторой функции безопасности. Когда открытые порты хоста периодически меняются случайным образом, проникнуть в систему будет сложнее.
  • Я полагаю, что варианты использования, для которых он на самом деле предназначен, — это развертывание стека нескольких
    экземпляров, использующих одни и те же внутренние контейнерные порты. Чтобы узнать фактические порты после развертывания, вы можете запустить сценарий, который проверяет каждый экземпляр с помощью «docker inspect» и передает эту информацию другим зависимым службам.

Кто-нибудь знает еще одного? Не стесняйтесь добавлять/редактировать.