我正在编写一个应用程序,它由一些基于弹簧启动的微服务组成,前面有一个基于zuul的反向代理 -
当我在我的机器上启动服务时,它可以工作,但是对于服务器的推出,我想使用docker作为服务,但现在似乎不可能。
通常,您将在容器外部使用固定的“内部”端口和随机端口。但容器中的应用程序不知道外部端口(和IP)。
Netflix工具符合我想要编写的高效微服务架构,概念上我非常喜欢docker。 据我所知,启动容器会非常麻烦,在主机上收集外部端口并将其传递给应用程序,因为在应用程序启动后您无法简单地更改端口。
有没有办法将eureka与基于docker的客户端一起使用?
[更新] 我想我解释这个问题做得不好。所以也许这可以澄清一点:
eureka服务器本身可以在docker中运行,因为我只有一个,外部端口无关紧要。我可以使用链接功能从客户端访问它。
问题是客户注册自己的URL。 这是例如https://localhost:8080/,但由于动态端口分配,它实际上只能通过https://localhost:54321/
访问因此,eureka将返回错误的服务URL。
更新 我在下面更新了我的答案,所以看看那里。
答案 0 :(得分:6)
我自己找到了一个解决方案,这可能不是最好的解决方案,但它适合我......
使用“--net = host”(主机网络)启动docker时,可以直接使用hosts网络堆栈。然后我只使用0作为spring-boot的端口,spring为我随机化了端口,因为它使用的是主机网络堆栈,所以没有转换到不同的端口(和IP)。
但是有一些缺点:
我希望它有所帮助
很多时间过去了,我想我应该再详细说明一下:
如果您使用docker托管您的spring应用程序,请不要使用随机端口!使用固定端口,因为每个容器都会获得自己的IP,因此每个服务都可以使用相同的端口。这使生活变得更加轻松。
如果您有面向公众的服务,那么无论如何您都会使用固定端口。
对于通过maven本地启动或者例如命令行有一个使用随机端口的专用配置文件,因此您没有冲突(但请注意,随机端口和服务周围存在或存在一些错误注册)
如果出于任何原因您想要或需要使用主机网络,您当然可以使用随机端口,但大部分时间您都不应该使用!
答案 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一起使用。