使用尤里卡,尽pipe有docker集装箱随机外部端口

我正在编写一个应用程序,该应用程序由几个基于Spring启动的微服务组成,并在前端使用基于zuul的反向代理。

它在我的计算机上启动服务时起作用,但是对于服务器部署,我想使用docker作为服务,但现在看起来这是不可能的。

通常情况下,你将有一个固定的“内部”端口和在容器外部的随机端口。 但容器中的应用程序不知道外部端口(和IP)。

Netflix的工具与我想写一个高效的微服务架构相匹配,在概念上我真的很喜欢docker工人。 据我所见,启动容器会非常麻烦,请将外部端口收集在主机上,并传递给应用程序,因为在启动应用程序后,不能简单地更改端口。

是否有任何方式使用基于docker的客户端尤里卡?

[更新]我想我解释这个问题做得不好。 所以也许这个更清楚一点:

尤里卡服务器本身可以运行在docker,因为我只有一个和外部端口无关紧要。 我可以使用链接function从客户端访问它。

问题是客户注册自己的URL。 这是例如https:// localhost:8080 /但由于dynamic端口分配,它只能通过https:// localhost:54321 /

所以eureka将返回错误的服务URL。

更新我已经更新了下面的答案,所以看看那里。

我自己find了一个解决scheme,这可能不是最好的解决scheme,但它适合我…

当你用“–net = host”(主机networking)启动docker时,你直接使用主机networking堆栈。 然后我只用0作为spring-boot的端口,spring为我随机化端口,因为它使用主机networking堆栈,所以没有翻译到不同的端口(和IP)。

虽然有一些缺点:

  • 当您使用主机networking时,您不能将这些容器的链接function用作链接源或目标。
  • 使用主机networking堆栈导致较less的实例封装,这可能是一个问题取决于您的项目。

我希望它有帮助

很多时间已经过去了 ,我想我应该进一步阐述一下:

  1. 如果你使用docker来托pipe你的spring应用程序,就不要使用随机的端口! 使用一个固定的端口,因为每个容器都有自己的IP,因此每个服务都可以使用相同的端口。 这使生活变得更容易。

  2. 如果你有一个面向公众的服务,那么你仍然会使用一个固定的端口。

  3. 对于通过maven进行本地启动,或者例如命令行有一个专门的configuration文件,使用随机端口,所以你没有冲突(但要知道,有或已经有一些围绕随机端口和服务注册的错误)

  4. 如果无论出于什么原因你想要或需要使用主机networking,你当然可以使用随机端口,但大部分时间你不应该!

您可以为每个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一起使用。