为了最小成本复现问题,下文的各项配置都有简化,请自行脑补边角部分。
问题环境
docker-compose.yml
version: '3.8'
networks:
ruibty-bridge:
driver: bridge
services:
ruibty-nacos:
image: nacos/nacos-server:1.4.1
networks:
- ruibty-bridge
ports:
- "11020:8848"
environment:
MODE: standalone
PREFER_HOST_MODE: hostname
ruibty-gateway:
image: ruibty/gateway
networks:
- ruibty-bridge
depends_on:
- ruibty-nacos
ports:
- "11100:11100"
application.yml
spring:
cloud:
nacos:
discovery:
server-addr: ruibty-nacos:11020
如果懒得看过程,直接看答案然后离开吧
docker-compose.yml
version: '3.8'
networks:
ruibty-bridge:
driver: bridge
services:
ruibty-nacos:
image: nacos/nacos-server:1.4.1
networks:
- ruibty-bridge
ports:
- "11020:11020"
environment:
MODE: standalone
PREFER_HOST_MODE: hostname
NACOS_APPLICATION_PORT: 11020
ruibty-gateway:
image: ruibty/gateway
networks:
- ruibty-bridge
depends_on:
- ruibty-nacos
ports:
- "11100:11100"
过程
ruibty-gateway
报错
com.alibaba.nacos.api.exception.NacosException: failed to req API:/nacos/v1/ns/service/list after all servers([ruibty-nacos:11020]) tried: java.net.ConnectException: Connection refused (Connection refused)
网上搜索得到的方案基本如下
ruibty-nacos
改为host
模式。
这个没心思试,这就是“解决不了问题就修改问题问题”的套路。
- 删除
ruibty-nacos
产生的data
文件
试了,没用,然后跳过Docker
使用IDE启动的程序是可以注册的,说明问题不在这。
探索
接下来,我们进入到ruibty-gateway
中看看
docker exec -it ruibty-gateway bash
ping
一下ruibty-nacos
,结果返回ip172.19.0.3
,证明网络是通的。
然后随便试一个ruibty-nacos
的api,都不通。
curl http://ruibty-nacos:11020/nacos/v1/ns/instance
curl http://172.19.0.3:11020/nacos/v1/ns/instance
然后顺手试了一下默认,amazing! 都通!
curl http://ruibty-nacos:8848/nacos/v1/ns/instance
curl http://172.19.0.3:8848/nacos/v1/ns/instance
看来问题锁定了
是对于bridge
网络的理解不到位造成的。
网络之间的通讯依赖于程序的端口,bridge
转发之后的接口是用于这个网络之外的请求使用。
所以,我将nacos
启动的端口号和ruibty-gateway
对应上就可以了。