Springboot客户端无法使用Docker容器ID

时间:2017-06-22 02:34:26

标签: docker spring-boot spring-cloud netflix-eureka

我在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}}}

Eureka Dashboard Snapshot: enter image description here

3 个答案:

答案 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}

我在documentation

中添加了相同的信息

更新:看起来这样也可以通过在撰写文件中使用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服务器。