一、问题
使用 Docker 集群部署的 jar 包启动时,注册到 nacos 上的 ip 会使用 docker 的内网 ip 作为注册地址,导致多台服务器部署服务时,nacos 监听到的服务永远只有一个;
二、解决
参考: https://github.com/alibaba/nacos/issues/310
方法一:使用 --network=host
# 使用 --network=host 主机网络模式, 容器运行时将会使用宿主机的网络信息, 即会拿到宿主机的ip注册到nacos上, 但是win不支持host模式;
# 这个时候我们无需 -p 80:80指定服务端口运行, 因为 --network=host 模式会使用服务本身启用的端口;
docker run -d --network=host --name app app:latest
方法二:使用 nacos 指定注册 ip
# bootstrap.yml配置文件中添加如下配置即可
spring:
cloud:
nacos:
discovery:
ip: xx.xx.xx.xx
port: xxxx
方法三:java 程序运行时动态传递 ip 和端口号,原理同方法二
参数:
-Dspring.cloud.nacos.discovery.ip=xx.xx.xx.xx
-Dspring.cloud.nacos.discovery.port=xxxx
示例:
java -jar -Dspring.cloud.nacos.discovery.ip=xx.xx.xx.xx -Dspring.cloud.nacos.discovery.port=xxxx app.jar
方法四: preferred-networks 选择符合前缀的 IP 作为服务注册 IP
spring:
cloud:
inetutils:
# 选择符合前缀的IP作为服务注册IP, 支持正则表达式
preferred-networks:
- 192.168