为啥部署在 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 容器后,邮件发送失败?
在 docker 容器中重新部署 spring-boot 应用程序?
spring boot项目生成docker镜像并完成容器部署