Docker Compose中Node.js连接Redis报EHOSTUNREACH错误如何解决
Docker环境Node.js连接Redis报EHOSTUNREACH错误修复(Arch Linux环境)
错误根因
该问题是Arch Linux环境下Docker 20.10.x版本的网络兼容问题:Arch默认使用nftables作为系统防火墙框架,而20.10分支的Docker默认依赖iptables规则做容器间网络转发,规则没有正确同步到nftables时,就会出现同一Compose项目下容器可以单独正常运行、宿主机也能正常访问容器,但容器之间互相访问报主机不可达的问题,这也是同样配置在Ubuntu(默认使用iptables)上正常运行的原因。
修复步骤
第一步:修复Docker防火墙兼容问题
执行以下命令安装iptables的nftables兼容层,让Docker生成的网络规则可以正常生效:sudo pacman -S iptables-nft sudo systemctl restart docker操作完成后清理旧的Compose网络和容器,重新拉起服务:
docker compose down docker compose up -d如果不想安装兼容包,也可以直接将Docker升级到23.0及以上版本,该版本后Docker已原生支持nftables框架。
第二步:验证容器间网络连通性
进入app容器内部,直接测试到Redis服务的连通性,排除代码配置问题:# 进入app容器命令行 docker compose exec app sh # 容器内执行端口连通性测试 nc -zv redis 6379如果返回
succeeded字样说明网络层已经正常。第三步:补全配置避免偶发问题
- 在
docker-compose.yml的app服务下添加启动依赖,避免Redis未完全启动时app先发起连接:
services: app: # 原有image、command、ports等配置保持不变 depends_on: - redis # redis服务原有配置保持不变- 补全node-redis 4.x版本的必要配置:该版本默认不会自动发起连接,初始化客户端后需要手动调用connect方法,同时可以加重连规则提升稳定性:
const socket = { host: "redis", port: 6379, reconnectStrategy: (retries) => Math.min(retries * 50, 2000) } export const redisClient = createClient({ socket, database: 0, legacyMode: true }) redisClient.on("error", (err) => { console.log("Redis Client Error", err) }); // 必须显式调用连接方法 await redisClient.connect()- 在
内容的提问来源于stack exchange,提问作者ino
相关产品推荐
相关产品推荐

