Nacos微服务注册地址为Docker内网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, 微服务之间调用成功!

如有帮助,请点赞鼓励!

发布了26 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/doinbb/article/details/103457021
今日推荐