一尘不染

尽管有Docker容器的外部端口随机使用Eureka

spring-boot

我正在编写一个应用程序,该应用程序由一些基于Spring Boot的微服务和位于前面的基于zuul的反向代理组成,

当我在机器上启动服务时,它可以工作,但是对于服务器推出,我想使用docker来服务,但是现在似乎无法实现。

通常,您将在容器的外部具有固定的“内部”端口和随机端口。但是容器中的应用程序不知道外部端口(和IP)。

Netflix工具符合我想要编写高效的微服务架构的需求,从概念上讲,我真的很喜欢docker。据我所知,启动容器,收集主机上的外部端口并将其传递给应用程序非常麻烦,因为在应用程序启动后您不能简单地更改端口。

有什么方法可以将eureka与基于docker的客户端一起使用吗?

[更新]我猜我在解释问题上做得很差。因此,这也许可以使它更加清楚:

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

问题是客户端向其注册的URL。例如,这是https:// localhost:8080
/,
但是由于动态端口分配,它实际上只能通过https:// localhost:54321
/访问。

因此,eureka将为服务返回错误的URL。

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


阅读 573

收藏
2020-05-30

共1个答案

一尘不染

我自己找到了一个解决方案,这可能不是最好的解决方案,但是它适合我…

当使用“ –net = host”(主机网络)启动docker时,您将直接使用主机网络堆栈。然后,我仅将0用作spring-
boot的端口,并且spring会为我随机化该端口,并且由于它使用的是主机网络堆栈,因此无法转换为其他端口(和IP)。

但是有一些缺点:

  • 使用主机网络时,不能将这些容器的链接功能用作链接源或目标。
  • 使用主机网络堆栈可以减少实例的封装,这可能是一个问题,具体取决于您的项目。

希望对您有所帮助

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

  1. 如果您使用docker托管spring应用程序,请不要使用随机端口!使用固定端口,因为每个容器无论如何都会获得自己的IP,因此每个服务都可以使用相同的端口。这使生活更加轻松。

  2. 如果您有面向公众的服务,那么无论如何您都将使用固定端口。

  3. 对于通过maven进行的本地启动,例如,命令行具有专用的配置文件,该配置文件使用随机端口,因此您不会出现冲突(但请注意,随机端口和服务注册周围存在或存在一些错误)

  4. 如果您出于某种原因想要或需要使用主机网络,则当然可以使用随机端口,但是大多数时候您不应该使用随机端口!

2020-05-30