为啥部署在 Docker 容器上的 Spring Cloud Netflix 应用需要显式设置 eureka.instance.hostname?

Posted

技术标签:

【中文标题】为啥部署在 Docker 容器上的 Spring Cloud Netflix 应用需要显式设置 eureka.instance.hostname?【英文标题】:Why do Spring Cloud Netflix applications deployed on Docker containers require explicitly setting eureka.instance.hostname?为什么部署在 Docker 容器上的 Spring Cloud Netflix 应用需要显式设置 eureka.instance.hostname? 【发布时间】:2017-06-09 04:24:21 【问题描述】:

一个简单的场景:

2 个尤里卡服务器 (http://archimedes1http://archimedes2) 1 个配置服务器 1 个祖尔网关 1 业务微服务

部署在本地主机上,一切都按预期工作。

我将它们 docker 化为在每个应用程序的单独容器上运行,并在 Docker over Windows 上进行了测试。

我在部署(配置服务器、zull 和 b-ms)后看到的是,如果我不为它们中的每一个指定 eureka.instance.hostname它们会在 Eureka 服务器中注册并使用无效的 URL。这使得他们无法互相调用,因为他们得到了无效的 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:port (c99cdfe9bd01:configserver:8888 -> 192.168.99.100:8888)?

【问题讨论】:

【参考方案1】:

我相信每个 Docker 容器都需要使用 Docker 主机 IP 和映射到容器端口的 Docker 主机端口进行注册。

这是我用过的:

尤里卡实例:

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 自动查找主机名。如果 docker 容器中设置的地址不正确,则需要自己设置。

以上是关于为啥部署在 Docker 容器上的 Spring Cloud Netflix 应用需要显式设置 eureka.instance.hostname?的主要内容,如果未能解决你的问题,请参考以下文章

为啥部署 django docker 容器后,邮件发送失败?

Kubernetes 上的Spring

在 docker 容器中重新部署 spring-boot 应用程序?

spring boot项目生成docker镜像并完成容器部署

如何将maven多模块spring boot部署到docker容器

将Spring-boot应用部署到Docker容器