Nacos微服务注册地址为Docker内网IP的解决办法
Nacos微服务注册中心无法调用Docker容器中的服务前言:Nacos(注册中心)是通过 【 IP+PORT】 的形式调用其他服务。问题:Docker容器使用虚拟IP, 当Docker中的服务A,向Nacos注册的时候,Nacos获取到了Docker的内部IP, 导致另外一个服务B,想通过注册中心调用服务A, 但由于服务B从nacos注册中心获取到的是服务A的内部IP,这样导致了...
Nacos微服务注册中心无法调用Docker容器中的服务
前言:
Nacos(注册中心)是通过 【 IP+PORT】 的形式调用其他服务。
问题:
Docker容器使用虚拟IP, 当Docker中的服务A,向Nacos注册的时候,Nacos获取到了Docker的内部IP, 导致另外一个服务B,想通过注册中心调用服务A, 但由于服务B从nacos注册中心获取到的是服务A的内部IP,这样导致了两个处于公网的微服务之间,无法互相访问!
解决办法:
将Docker中的服务网络配置与宿主机共用同一个IP, 此时服务向nacos注册的时候,nacos将会获取到宿主机的公网IP, 所以问题迎刃而解。
我的docker是使用docker-compose来启动的,具体配置如下:
version: "3"
services:
base:
build: base
container_name: base_1
network_mode: "host" # 与宿主机共有一个IP
ports:
- 8233:8233
volumes:
- ./logs:/logs
当然,配置了上述网络类型后, nacos是可以拿到宿主机的IP, 但是此时拿到的是宿主机的内网IP, 解决办法如下:
spring:
cloud:
inetutils:
ignored-interfaces: eth.* # 忽略网卡,eth.*,正则表达式
preferred-networks: ${discovery.server-ip} # 选择符合前缀的IP作为服务注册IP, discovery.server-ip就是你的公网IP
解释:
启动 Docker的时候,用 --network 参数,可以指定网络类型
--network host
host: 主机网络使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。 例如,在容器中运行一个Web服务,监听8080端口,则主机的8080端口就会自动映射到容器中。
结果:
Nacos注册中心获取到宿主机IP, 微服务之间调用成功!
如有帮助,请点赞鼓励!
广告时间
我总结的个人面经以及面试资料,非常非常实用,欢迎点赞和Fork!
https://github.com/doinb08/bat_offer
更多推荐
所有评论(0)