为什么在Docker容器上部署的Spring Cloud Netflix应用程序需要明确设置eureka.instance.hostname?

4
一个简单的场景: 部署在本地主机上,一切都按预期工作。
我将它们docker化为每个应用程序运行在单独的容器中,并在Windows上测试。
部署后(配置服务器、zull和b-ms),如果我没有为它们每个指定eureka.instance.hostname,则它们将使用无效的URL注册到Eureka服务器。这使它们无法相互调用,因为它们获取到的是无效的URL。
例如:
CONFIGSERVER    n/a (1) (1) UP (1) - 287dd3ada410:configserver:8888
287dd3ada410:configserver:8888 指向 287dd3ada410:8888/info,但这个路径并不存在。
为了解决这个问题,我不得不在 configserver 的 application.yml(以及其他应用程序的等效文件中)添加以下内容:
eureka:
  instance:
    hostname: config-server

现在它在 Eureka 中显示如下:
CONFIGSERVER    n/a (1) (1) UP (1) - c99cdfe9bd01:configserver:8888

c99cdfe9bd01:configserver:8888 指向 http://config-server:8888/info,现在正确地解析了配置服务器。

为什么每个服务都需要使用eureka.instance.hostname?为什么不像在没有 Docker 的情况下运行时那样使用 IP:端口进行注册 (c99cdfe9bd01:configserver:8888 -> 192.168.99.100:8888)?

1个回答

3
我相信每个Docker容器都需要使用Docker主机IP和Docker主机端口映射到容器端口进行注册。
这是我所使用的:
Eureka实例:
docker run -idt -p 8001:8001 --net=host -e spring.profiles.active=peerAware -e appPort=8001 -e hostName=$HOSTNAME -e dataCenter=asimio-cloud-dal -e environment=staging -e peerUrls="http://$HOSTNAME:8002/eureka/" asimio/discovery-server:1.0.73

一个服务实例:

docker run -idt -p 8601:8601 --net=host -e appPort=8601 -e hostName=$HOSTNAME -e eureka.client.serviceUrl.defaultZone="http://$HOSTNAME:8001/eureka/,http://$HOSTNAME:8002/eureka/" asimio/demo-registration-api-2:1.0.21

http://tech.asimio.net/2016/11/14/Microservices-Registration-and-Discovery-using-Spring-Cloud-Eureka-Ribbon-and-Feign.html#running-the-discovery-server-and-demo-services-in-docker-containers


主机名将自动通过java.net.InetAddress进行查找。如果容器中设置的地址不正确,则需要手动进行设置。 - Ryan Baxter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接