MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

docker --net=host获取容器IP,报错VM-XX:Name or Service not known

2024-12-04 11:41 huorong 精选文章 7 ℃ 0 评论

目录标题

  • 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

问题截图如下

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

我们再看下报错信息,提示VM-**-centos这个域名找不到,但是我们发现,其中这个VM-**-centos就是宿主机的hostname(计算机名),试了下宿主机中可以ping通VM-**-centos,但是容器中ping不通,虽然docker容器继承了宿主机的hostname,但是却不识别。


2.解决思路和方案

这里代码中是先找到服务器的hostname,然后再获取IP,从这里入手,我们能不能给容器设置一个代码能识别的hostname ,这样代码就能够识别并获取到这个IP了,网上查询资料后找到下面的运行参数

docker  run  --net=host  --hostname=自定义主机名   image名

这里使用了–hostname=localhost 和–hostname=192.168.54.13 都是可以的,最终问题解决,启动后没再报错

Tags:docker查看容器详细信息

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言