天天看點

docker容器使用--net=host擷取容器IP,報錯VM-XX:Name or Service not known1. 背景和問題2.解決思路和方案

目錄标題

  • 1. 背景和問題
    • 背景
    • 問題
    • 問題查找
  • 2.解決思路和方案

1. 背景和問題

背景

項目使用了Nacos微服務架構,由于項目運作需要啟動注冊中心、網關、認證中心、分布式事務中心等多個微服務,非常占用實體機記憶體和CPU,是以部署了一個開發伺服器,把這些服務運作在伺服器上,我隻需要運作自己正在開發的的服務子產品就可以,這樣開發用的實體機一下就釋放了很多記憶體,開發起來更順暢。

問題

但是問題來了,docker容器自動配置設定的ip為172.17.0.0/24網段的ip,開發用的實體機和這個容器不在一個網段,根本沒法通路到,這時候網上查到docker有一種網絡模式是–net=host,就是讓容器直接使用宿主伺服器的ip,這樣開發用的實體機就能夠通路這個容器的接口了。但是這時候所有服務啟動後,出現了一個問題,一直列印一個錯誤資訊:

Caused by: java.net.UnknownHostException: VM-**-centos: Name or service not known
           

問題截圖如下

docker容器使用--net=host擷取容器IP,報錯VM-XX:Name or Service not known1. 背景和問題2.解決思路和方案
Caused by: java.net.UnknownHostException: VM-**-**-centos: Name or service not known
        at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
        at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928)
        at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323)
        at java.net.InetAddress.getLocalHost(InetAddress.java:1500)
           

問題查找

首先我們找到這個報錯的代碼,分布式事務為了把自己注冊到

事務中心,擷取了自己伺服器的IP,首先擷取主機名稱hostname,然後通過hostname轉換成IP,就是這轉換成IP時報錯,unknown hostname

docker容器使用--net=host擷取容器IP,報錯VM-XX:Name or Service not known1. 背景和問題2.解決思路和方案
docker容器使用--net=host擷取容器IP,報錯VM-XX:Name or Service not known1. 背景和問題2.解決思路和方案
docker容器使用--net=host擷取容器IP,報錯VM-XX:Name or Service not known1. 背景和問題2.解決思路和方案
docker容器使用--net=host擷取容器IP,報錯VM-XX:Name or Service not known1. 背景和問題2.解決思路和方案

我們再看下報錯資訊,提示VM-**-centos這個域名找不到,但是我們發現,其中這個VM-**-centos就是主控端的hostname(計算機名),試了下主控端中可以ping通VM-**-centos,但是容器中ping不通,雖然docker容器繼承了主控端的hostname,但是卻不識别。

docker容器使用--net=host擷取容器IP,報錯VM-XX:Name or Service not known1. 背景和問題2.解決思路和方案
docker容器使用--net=host擷取容器IP,報錯VM-XX:Name or Service not known1. 背景和問題2.解決思路和方案

2.解決思路和方案

這裡代碼中是先找到伺服器的hostname,然後再擷取IP,從這裡入手,我們能不能給容器設定一個代碼能識别的hostname ,這樣代碼就能夠識别并擷取到這個IP了,網上查詢資料後找到下面的運作參數

docker  run  --net=host  --hostname=自定義主機名   image名
           

這裡使用了–hostname=localhost 和–hostname=192.168.54.13 都是可以的,最終問題解決,啟動後沒在報錯