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

时间:2015-04-30 15:32:21

标签: docker spring-boot netflix-eureka netflix-zuul

我正在编写一个应用程序,它由一些基于弹簧启动的微服务组成,前面有一个基于zuul的反向代理 -

当我在我的机器上启动服务时,它可以工作,但是对于服务器的推出,我想使用docker作为服务,但现在似乎不可能。

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

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

有没有办法将eureka与基于docker的客户端一起使用?

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

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

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

访问

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

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

2 个答案:

答案 0 :(得分:6)

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

使用“--net = host”(主机网络)启动docker时,可以直接使用hosts网络堆栈。然后我只使用0作为spring-boot的端口,spring为我随机化了端口,因为它使用的是主机网络堆栈,所以没有转换到不同的端口(和IP)。

但是有一些缺点:

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

我希望它有所帮助

很多时间过去了,我想我应该再详细说明一下:

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

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

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

  4. 如果出于任何原因您想要或需要使用主机网络,您当然可以使用随机端口,但大部分时间您都不应该使用!

答案 1 :(得分:4)

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