天天看点

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 都是可以的,最终问题解决,启动后没在报错