【问题标题】:spring boot cloud eurka windows 10 eurkea returns host.docker.internal for client host name after latest docker upgradespring boot cloud eureka windows 10 eureka在最新的docker升级后返回host.docker.internal作为客户端主机名
【发布时间】:2019-12-10 16:19:26
【问题描述】:

Spring Boot Cloud Disovery 问题,在 windows 10 上升级 docker 后 Eureka 主机名出现问题。(注意:docker 不托管 spring 服务,只是 mariadb、rabbitmq 和 zipkin)

总结

  • 我正在 windows 10 企业版上开发,最新补丁
  • Java 8
  • sts 4
  • docker 托管 mariadb、rabbitmq 和 zipkin(没有服务运行 码头工人)
  • 使用基于Eureka的spring boot云发现 服务发现

在 docker 升级之后,直到今天 docker 更新之前一切正常

Eureka 返回“host.docker.internal”作为我的开发箱(托管 Spring Boot 云服务的机器)的主机名

在今天 Windows 10 上的 docker 升级之前,这一直运行良好。

有这方面的指导吗?

------------------ 详细信息---------------- ------------

"

---------------- spring 版本 ----------

buildscript {
    ext {
        springCloudVersion = "Greenwich.SR1"
        springBootVersion = "2.1.5.RELEASE"
        springRetryVersion = "1.2.4.RELEASE"
        lombokVersion = "3.6.4"
        mySqlConnectorVersion = "8.0.15"
        springBootAdminVersion = "2.1.5"

    }

我正在使用 windows 10 企业版进行 java 开发。

我使用 docker-compose 在我的 Windows 10 机器上的开发环境中托管 mariadb、zipkin 和 rabbitmq

我有一个带有 8 个 Spring Boot 云服务的多项目 gradle 构建

其中一项服务是托管 Eureke 的 Spring Cloud Discovery 服务

其他spring cloud服务都是eureka客户端。

直到今天,一切正常 1)先启动Eureka Spring Boot云服务 2)其他spring boot cloud services为eclipse启动的客户端,注册并查询spring cloud discovery客户端代码获取其他服务的url

今天,windows 10 最新的 docker 发布了,我安装了它(我一直在通过其他几个 docker 更新来开发这个应用程序)。

我更新了 docker,重启了。

重启后,Eureka 服务器返回“host.docker.internal”作为 URL 中的主机名,而不是 http:/mymachinename:8080

升级前没有网络数据,现在有

U:\>ipconfig

Windows IP Configuration


Ethernet adapter vEthernet (DockerNAT):

   Connection-specific DNS Suffix  . :
   IPv4 Address. . . . . . . . . . . : 10.0.75.1
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . :

Ethernet adapter Ethernet:

   Connection-specific DNS Suffix  . : net.FOO.BAR.com
   IPv4 Address. . . . . . . . . . . : 146.122.145.71
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 146.122.145.1

Ethernet adapter vEthernet (Default Switch):

   Connection-specific DNS Suffix  . :
   IPv4 Address. . . . . . . . . . . : 172.28.74.49
   Subnet Mask . . . . . . . . . . . : 255.255.255.240
   Default Gateway . . . . . . . . . :

我的客户端 application.properties 文件是:

eureka.client.serviceUrl.defaultZone= http://${ci2.srvhost}:8761/eureka/
eureka.instance.hostname=${ci2.srvhost}
spring.cloud.client.hostname=${ci2.srvhost}

服务器应用程序.property 文件

server.port=8761


eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

logging.level.com.netflix.eureka=OFF
logging.level.com.netflix.discovery=OFF


Standard reboot after docker updated



The expected URL from discovery is

http://mymachine:8091

returned value after docker upgrade

http://host.docker.internal:8091

【问题讨论】:

  • 嘿,有点跑题了,但我正在使用 eureka 客户端和服务器开发相同类型的架构。我有一个问题:我想在虚拟主机上实时上传应用程序,但不熟悉应该从哪里开始。任何建议都会有所帮助。

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


【解决方案1】:

我遇到了类似的问题,即 eureka 服务器在 host.docker.internal 而不是 localhost 注册服务。

在我的情况下,问题是位置 C:\Windows\System32\Drivers\etc\hosts 的主机文件已更改。我删除了主机文件中的所有行,并使用具有管理员权限的 npp 将其保存。重新启动服务器发布此更改。

看起来“Docker Desktop”正在更改主机文件。

【讨论】:

    【解决方案2】:

    我添加/更改了每个 eureka 客户端的 application.properties 文件

    ----------------- 客户

    ......
    
    ci2.srvhost = my hostname
    
    #to find this list,run ipconfig in command prompt
    spring.cloud.inetutils.preferredNetworks=146.122,10.0
    
    eureka.client.serviceUrl.defaultZone= http://${ci2.srvhost}:8761/eureka/
    eureka.instance.hostname=${ci2.srvhost}
    spring.cloud.client.hostname=${ci2.srvhost}
    

    -------------------- eureka server application.property--------------------

    # host to set of ci2 services
    ci2.srvhost = ${COMPUTERNAME}
    
    
    # on windows 10 boxes, running docker, we have to include preferred networks, 
    # this is not needed on linux, or windows boxes not running docker
    spring.cloud.inetutils.preferredNetworks=146.122,10.0
    

    -------------------- 标准配置,下面不需要更改 ------------------ -

    server.port=8761
    
    
    eureka.client.register-with-eureka=false
    eureka.client.fetch-registry=false
    
    eureka.instance.hostname=${ci2.srvhost}
    eureka.instance.prefer-ip-address=true
    
    logging.level.com.netflix.eureka=OFF
    logging.level.com.netflix.discovery=OFF
    
    serviceUrl.defaultZone= http://${eureka.instance.hostname}:${server.port}/eureka/
    

    【讨论】:

    • 我想我只是在为我设置 spring.cloud.client.hostname。
    【解决方案3】:

    Window 10 的解决方案: 您不必从主机文件中删除所有行。 如果存在就评论这个(#192.168.1.4 host.docker.internal)(因为我们在玩 docker 时使用它) 并粘贴这个(127.0.0.1 host.docker.internal) 它对我有用。

    【讨论】:

      【解决方案4】:

      感谢有关 windows 主机文件的提示

      我发现docker在host.docker.internal和gateway.docker.internal的host文件中添加了别名。

      我猜 Eureka 从 IP 进行主机查找并返回 host.docker.internal。

      我不是主机文件方面的专家,但我为我的 IP 的实际主机名添加了一个别名(注意:我们使用静态 ip)。完成此操作后,docker 在重新启动时没有更改我的主机文件,并且 ip->host 的反向查找现在返回我的机器名称而不是 host.docker.internal

      ------------------ modified hosts file for windows
      
      #I added an alias from my machine name to the IP before the docker added aliases
      #
      146.122.145.71 mymachine.net.foo.com
      # Added by Docker Desktop
      146.122.145.71 host.docker.internal
      146.122.145.71 gateway.docker.internal
      

      【讨论】:

        【解决方案5】:

        “消息”:“连接被拒绝:没有更多信息:host.docker.internal in eureka gateway error

        分辨率:

        检查 ping host.docker.internal 响应是与本地主机不同的一些 IP 地址,即 127.0.0.1 删除 C:\Windows\System32\Drivers\etc\hosts.file 条目,使其为空

        然后重启 eureka 和你的微服务实例。

        还会在日志中找到如下消息,以确保您已在 eureka 中注册

        DiscoveryClient_BEER-SERVICE/DESKTOP-G2AIGG1:beer-service: 拆分表示发现客户端的上述日志消息 BEER-SERVICE 是我的服务和 DESKTOP-G2AIGG1 是我的电脑名称 beer-service 是注册的服务。

        【讨论】:

        • 感谢关于hosts文件的提示,我发现了一件事,docker在windows上重建了host文件。
        【解决方案6】:

        当我对我的 restTemplate 进行负载平衡时,我也遇到了同样的问题。像这样的

        @Bean
        @LoadBalanced
        RestTemplate restTemplate() {
        return new RestTemplate();}
        

        这是因为功能区客户端。 因此,在没有对主机文件进行任何更改的情况下,当我删除此代码并使用RestTemplateBuilder 获取restTemplate 时,一切正常。代码示例:

        @Autowired
        private RestTemplateBuilder restTemplateBuilder;
        
        RestTemplate restTemplate = restTemplateBuilder.build();
        

        您也可以尝试这种方法。

        【讨论】:

        • 感谢您采用这种方法
        猜你喜欢
        • 2020-07-20
        • 1970-01-01
        • 2015-04-11
        • 2017-01-02
        • 2018-02-10
        • 2018-11-29
        • 2017-11-23
        • 2022-12-05
        • 1970-01-01
        相关资源
        最近更新 更多