问题描述
在nacos服务注册时,发现注册的服务全是容器虚拟IP,并不是可以通讯的内网IP。
问题原因
开启了user namespace,将系统用户映射到docker容器里,使其不再使用root权限。由于开启了user namespace,所以docker容器不能再共享net namespace即docker网络不能再使用host模式,只能用bridge模式。此时服务容器便有了一个虚拟ip,一般该ip在docker0的网段(默认为172)之下。所以服务注册时便使用这个ip进行注册。
解决方案
第一种(不推荐)
为服务设置IP,在服务的配置文件bootstrap.yml中,配置:
spring:
cloud:
nacos:
discovery:
ip: 10.1.1.1
这样服务注册时就会使用设置好的ip注册,这种方式不灵活。
第二种(推荐)
在nacos中,项目主配置文件中加入:
spring:
cloud:
inetutils:
ignored-interfaces: eth.*。## 只取eth*地址,eth0,eth1...
preferred-networks: 10.24.66 ## 限制网段
这样设置是限制就限制了在服务注册时只取指定网卡的ip地址,同时还限制了网段,保证服务使用正确的ip注册。 当然这种方式也可以写到某个模块的bootstrap.yml中