You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字样说明网络层已经正常。

  • 第三步:补全配置避免偶发问题

    1. 在docker-compose.yml的app服务下添加启动依赖,避免Redis未完全启动时app先发起连接:
    services:
      app:
        # 原有image、command、ports等配置保持不变
        depends_on:
          - redis
      # redis服务原有配置保持不变
    
    1. 补全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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 02:42:18