Nacos(注册中心)是通过 【 IP+PORT】 的形式调用其他服务。
问题:
Docker 容器使用虚拟 IP,当 Docker 中的服务 A,向 Nacos 注册的时候,Nacos 获取到了 Docker 的内部 IP,导致另外一个服务 B,想通过注册中心调用服务 A,但由于服务 B从 nacos 注册中心获取到的是服务 A 的内部 IP,这样导致了两个处于公网的微服务之间无法互相访问。
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 端口就会自动映射到容器中。