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

Docker Swarm中Node.js后端无法连接Redis的问题求助

问题解决:Docker Swarm中Node.js后端无法连接Redis,但网络可达

问题核心分析

  1. 环境变量引号导致主机名错误
    后端docker-compose.yml里REDIS_HOST='redis-dev.localhost'的单引号会被Docker当成环境变量值的一部分传递给容器,最终Node.js代码尝试连接的是带单引号的'redis-dev.localhost',而非正确的主机名,这是连接失败的直接原因。

  2. curl结果的正确解读
    curl redis-dev.localhost:6379返回curl: (52) Empty reply from server是正常现象:Redis是TCP协议服务,不处理HTTP请求,curl发送HTTP报文后Redis无法返回有效HTTP响应,这恰恰证明Redis服务网络可达、端口处于监听状态。

解决方案

1. 修正后端环境变量配置

把后端docker-compose.yml中的环境变量行修改为:

environment:
  - REDIS_HOST=redis-dev.localhost
  - APP_PORT=4000

(去掉REDIS_HOST值的单引号)

2. 可选:添加服务健康检查与就绪等待

为避免后端在Redis未完全就绪时启动失败,可给Redis服务添加健康检查,同时优化后端的重启策略:

修改Redis的docker-compose.yml:

services:
  redis:
    image: redis:7.0.4-alpine3.16
    hostname: "redis-dev.localhost"
    ports:
      - 6379:6379
    deploy:
      restart_policy:
        condition: on-failure
      update_config:
        parallelism: 1
        delay: 15s
      healthcheck:
        test: ["CMD", "redis-cli", "ping"]
        interval: 5s
        timeout: 3s
        retries: 3
    networks:
      - traefik-public

优化后端重启策略:

在后端的deploy配置中更新:

deploy:
  restart_policy:
    condition: on-failure
    delay: 5s
    max_attempts: 5
  # 保留原有update_config、labels配置

同时建议在Node.js代码中添加Redis连接的重连逻辑,确保服务启动后能自动重试连接,应对Redis启动较慢的场景。

验证步骤

  1. 更新配置后重新部署服务:
docker stack deploy -c docker-compose-backend.yml backend
docker stack deploy -c docker-compose-redis.yml redis
  1. 查看后端容器日志,确认Redis连接成功:
docker service logs backend_backend

内容的提问来源于stack exchange,提问作者m-ketan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:40:33