Используйте Eureka, несмотря на случайный внешний порт докерных контейнеров

Я пишу приложение, состоящее из нескольких микросервисов с загрузкой на основе w760, с обратным прокси-сервером на основе zuul спереди -

Он работает, когда я запускаю службы на своей машине, но для развертывания сервера я бы хотел использовать докер для служб, но сейчас это кажется невозможным.

Обычно у вас есть фиксированный "внутренний" порт и рандомизированные порты на внешней стороне контейнера. Но приложение в контейнере не знает внешний порт (и IP).

Инструменты Netflix соответствуют тому, что я хотел бы написать эффективную архитектуру микросервиса, и концептуально мне очень нравится докер. Насколько я могу судить, было бы очень сложно запустить контейнер, собрать внешний порт на хосте и передать его в приложение, потому что вы не можете просто изменить порт после запуска приложения.

Есть ли способ использовать eureka с клиентами на докере?

[Обновление] Думаю, я плохо справился с этой проблемой. Поэтому, возможно, это еще раз поясняет это:

Сам сервер eureka может работать в докере, так как у меня только один, а внешний порт не имеет значения. Я могу использовать функцию ссылки для доступа к ней от клиентов.

Проблема заключается в URL-адресе, в котором регистрируются клиенты. Это, например, https://localhost:8080/, но из-за динамического назначения порта он доступен только через https://localhost:54321/

Итак, eureka вернет неверный URL-адрес для служб.

UPDATE Я обновил свой ответ ниже, так что смотрите там.

Ответы

Ответ 1

Я нашел решение самостоятельно, что, возможно, не лучшее решение, но оно подходит для меня...

Когда вы начинаете докер с "--net = host" (сеть хоста), вы напрямую используете сетевой стек хостов. Затем я просто использую 0 как порт для spring -boot и spring рандомизирует порт для меня, и поскольку он использует сетевой стек хостов, нет перевода на другой порт (и IP).

Есть некоторые недостатки:

  • При использовании сети хоста вы не можете использовать функцию ссылок для этих контейнеров в качестве источника ссылок или целевого объекта.
  • Использование сетевого стека узлов приводит к меньшей инкапсуляции экземпляра, что может быть проблемой в зависимости от вашего проекта.

Я надеюсь, что это поможет

Прошло много времени, и я думаю, что я должен подробнее остановиться на этом:

  • Если вы используете докер для размещения вашего приложения spring, просто не используйте случайный порт! Используйте фиксированный порт, потому что каждый контейнер получает свой собственный IP так или иначе, поэтому каждая служба может использовать один и тот же порт. Это облегчает жизнь.

  • Если у вас есть служба общего доступа, вы все равно будете использовать фиксированный порт.

  • Для локальных запусков через maven или, например, в командной строке есть выделенный профиль, который использует рандомизированные порты, поэтому у вас нет конфликтов (но имейте в виду, что есть или были некоторые ошибки, связанные с случайными портами и сервисом регистрация)

  • Если по какой-либо причине вы хотите или хотите использовать хост-сеть, вы можете использовать рандомизированные порты, конечно, но большую часть времени вы не должны!

Ответ 2

Вы можете настроить каталог для каждого экземпляра docker и поделиться им между хостом и экземпляром, а затем записать порт и IP-адрес в файл в этом каталоге.

$ instanceName=$(generate random instance name)
$ dirName=/var/lib/docker/metadata/$instanceName
$ mkdir -p $dirName
$ docker run -name $instanceName -v ${dirName}:/mnt/metadata ...
$ echo $(get port number and host IP) > ${dirName}/external-address

Затем вы просто читаете /mnt/metadata/external -address из своего приложения и используете эту информацию в Eureka.