Intereting Posts
Связывание SQL Server с экземпляром liferay, запущенным в контейнере докеров Связывание портов при запуске изображений Docker в Singularity Секреты с контейнерными одноузловыми кланами кубернетов docker-compose up to docker-compose up –build vs docker-compose build –no-cache docker составляют внутри докер-машины, не могут монтировать громкость Докер. Запуск программного обеспечения с лицензией на основе идентификатора хоста Как обмениваться локальным хостом между двумя различными контейнерами Docker? AWS codebuild не передает переменные среды? Как изменить значение «Registry», которое отображается из «docker info», Соединение отказалось от времени выполнения MySQL в Eclipse Che Создание образа Docker для агента регистрации aws – ОШИБКА Выход в дискуссионный форум Получить статус продолжения изображения докеров Монгольский докер с ошибкой объема Докетирование нескольких экземпляров узла с различными аргументами

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

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

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

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

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

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

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

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

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

Таким образом, eureka вернет неправильный URL-адрес для служб.

ОБНОВЛЕНИЕ Я обновил свой ответ ниже, так что смотрите там.

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

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

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

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

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

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

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

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

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

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

Вы можете настроить каталог для каждого экземпляра докера и поделиться им между хостом и экземпляром, а затем записать порт и 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.