Docker同自定义网络中Node容器无法连接Redis容器故障排查
问题根因
该连接故障和Docker网络配置无关,核心原因是Node.js Redis 客户端v4及以上版本的配置格式不兼容。
redis@4.0 版本对createClient的入参结构做了破坏性更新,不再支持在配置对象顶层直接传入host、port字段。你代码里写的顶层host、port配置会被客户端直接忽略,程序会默认回退连接本机127.0.0.1:6379地址,最终抛出ECONNREFUSED 127.0.0.1:6379的错误,和你捕获到的报错信息完全匹配。
排查佐证
现有现象已经可以排除其他故障可能:
- 两个容器在同一自定义Docker网络内,容器外测试也确认Redis服务可以正常接收连接,不存在网络不通、Redis服务异常、防火墙拦截的问题
- 改用URL方式传入连接参数后可正常连通,说明跨容器网络链路完全正常,故障点仅在客户端配置的解析环节
可用的正确配置
两种写法都可以正常连接同网络下的Redis容器:
- URL传参方式(你已经验证可行)
const redis = require("redis"); const redisClient = redis.createClient({ url: 'redis://redis-test:6379' }) redisClient.connect(); redisClient.on("connect", () => { console.log("REDIS IS CONNECTED") }) redisClient.on("error", (error) => { console.log("REDIS ERROR", error) }) - 拆分参数写法(适配v4版本的嵌套结构要求)
如果不想用URL格式,需要把host、port参数嵌套在socket字段下,不能放在配置顶层:const redis = require("redis"); const redisClient = redis.createClient({ socket: { host: 'redis-test', port: 6379 } }) // connect逻辑、事件监听代码和原有逻辑一致
额外配置优化提示
你当前docker-compose配置里的links字段是冗余配置。自定义Docker网络默认已经内置了服务名DNS解析,不需要依赖links做容器互联,该字段是Docker早期无自定义网络阶段的遗留配置,删除后不会影响容器间连通性。
内容的提问来源于stack exchange,提问作者noname
相关产品推荐
相关产品推荐

