![](/img/trans.png)
[英]Developing a spring boot application with docker on windows but run the docker container on a Ubuntu VM (as Docker Host)
[英]spring boot cloud eurka windows 10 eurkea returns host.docker.internal for client host name after latest docker upgrade
Spring 引導雲發現問題,在 windows 10 上升級 docker 后 Eureka 主機名出現問題。(注意:docker 不托管 spring 服務,僅托管 mariadb、88580zip6 和 8838kin)
概括
一切正常,直到今天 docker 更新,在 docker 升級之后
Eureka 返回“host.docker.internal”作為我的開發箱的主機名(托管 spring 啟動雲服務的機器)
這在今天 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
我有一個多項目 gradle 構建 8 spring 啟動雲服務
其中一項服務是托管 Eureke 的 spring 雲發現服務
其他spring個雲服務是eureka客戶端。
直到今天,一切正常 1)Eureka spring啟動雲服務先啟動 2)其他spring啟動雲服務是eclipse啟動的客戶端,注冊查詢spring雲發現客戶端代碼,獲取其他服務的URL
今天,最新的 docker for windows 10 推出了,我安裝了它(我一直在通過其他幾個 docker 更新開發這個應用程序)。
我更新了 docker,重新啟動。
重啟后,Eureka 服務器返回“host.docker.internal”作為 URL 中的主機名,而不是 http:/mymachinename:8080
升級前沒有.network數據,現在有了
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}
服務器 application.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
我遇到了類似的問題,尤里卡服務器在 host.docker.internal 而不是 localhost 上注冊服務。
我的問題是在 C:\\Windows\\System32\\Drivers\\etc\\hosts 位置更改了主機文件。 我刪除了主機文件中的所有行,並使用具有管理員權限的 npp 保存它。 重新啟動服務器發布此更改。
看起來“Docker Desktop”正在更改主機文件。
它是每個尤里卡客戶端的 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}
--------------------尤里卡服務器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/
感謝有關 Windows 主機文件的提示
我發現 docker 在主機文件中為 host.docker.internal 和 gateway.docker.internal 添加了別名。
我猜 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
Window 10 的解決方案:您不必從主機文件中刪除所有行。 如果存在就評論這個(#192.168.1.4 host.docker.internal)(因為我們在玩docker時使用這個)並粘貼這個(127.0.0.1 host.docker.internal)它對我有用。
“消息”:“連接被拒絕:沒有更多信息:尤里卡網關錯誤中的host.docker.internal
解析度:
檢查 ping host.docker.internal 響應是除本地主機之外的一些 ip 地址,即 127.0.0.1 刪除 C:\\Windows\\System32\\Drivers\\etc\\hosts.file 條目,使其為空
然后重新啟動 eureka 和您的微服務實例。
還會在日志中找到如下消息,這確保您已在尤里卡注冊
DiscoveryClient_BEER-SERVICE/DESKTOP-G2AIGG1:beer-service:拆分上面的日志消息,表示發現客戶端 BEER-SERVICE 是我的服務,DESKTOP-G2AIGG1 是我的電腦名稱 beer-service 是注冊的服務。
當我對 restTemplate 進行負載平衡時,我也面臨着同樣的問題。 像這樣的東西
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();}
這是因為功能區客戶端。 因此,在沒有對主機文件進行任何更改的情況下,當我刪除此代碼並使用RestTemplateBuilder
獲取 restTemplate 時,一切正常。 代碼示例:
@Autowired
private RestTemplateBuilder restTemplateBuilder;
RestTemplate restTemplate = restTemplateBuilder.build();
您也可以嘗試這種方法。
也面臨着類似的問題。 問題出在Avast Premium Security中。 嘗試禁用 Avast防火牆服務。
在禁用防火牆的情況下,Eureka 可以在主機文件中使用host.docker.internal正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.