我在Docker数据中心运行了几个微服务。我在服务/应用程序中使用相同的Eureka配置。但是有些应用程序使用eth0
IP地址而不是容器ID进行注册。
我已尝试将preferIpAddress
设置为false
但不会一直强制执行。
没有模式。在先前部署期间向容器ID注册的相同服务在另一时间用IP注册。我希望我的服务始终注册其容器ID。有没有办法强制执行它或者我错过了什么?
注意:我还清除了注册表,部署节点中的所有旧docker镜像,并从头开始尝试。
Eureka Server配置:
eureka:
instance:
hostname: discovery
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:8761/eureka/
微服务客户端配置(在所有微服务中都相同)
eureka:
client:
healthcheck:
enabled: true
serviceUrl:
defaultZone: http://discovery:8761/eureka/
instance:
preferIpAddress: false
metadataMap:
instanceId: ${vcap.application.instance_id:${spring.application.name}:${spring.application.instance_id:${random.value}}}
答案 0 :(得分:4)
在docker中,默认情况下,container-id将被设置为容器的主机名。容器可以使用container-id(或此处为hostname)
相互通信所以这个问题可以通过首选主机而不是ip来解决。
但确保通过主机名进行注册的唯一方法是设置eureka.instance.hostname
reference
在docker中,您可以使用入口点作为shell脚本(例如start.sh)从主机名设置运行时的container-id,脚本应该类似于
#!/bin/sh
export HOST_NAME=`hostname`
java -Djava.security.egd=file:/dev/./urandom -Xmx1024m -jar /app.jar
并确保在application.yml
中添加eureka.instance.hostname=${HOST_NAME}
或者您可以重用Docker中默认设置的HOSTNAME
变量,配置变为eureka.instance.hostname=${HOSTNAME}
更新:看起来这样也可以通过在撰写文件中使用endpoint_mode: dnsrr
来修复(必须确认)。 Refer this
答案 1 :(得分:2)
尝试在客户端配置中设置{{1}}。
答案 2 :(得分:2)
我知道这是一个老问题,但是此答案可能对某人有所帮助。在尝试了多种解决方案之后,我注意到Ubuntu中已经存在一个主机名环境变量(HOSTNAME)。我的Docker容器使用openjdk:8-jdk-alpine
基。如果您使用的是Ubuntu平台,则只需在所有eureka客户端的属性文件中添加以下参数即可解决此问题:
eureka.instance.hostname=${HOSTNAME}
spring.cloud.client.hostname=${HOSTNAME}
应用程序将提取容器的主机名(即容器ID),并将其传递给eureka服务器。