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

Docker Compose部署Redis+Socket.IO时get返回undefined求助

Docker Compose下Redis get返回undefined的排查与解决

问题背景

本地执行docker run -p 6379:6379 -it redis/redis-stack-server:latest启动Redis时,Socket.IO相关代码运行完全正常;但通过Docker Compose启动环境后,Redis的set命令无报错,执行get命令却返回undefined。对应的docker-compose.yml配置如下:

version: '3'
services:
  nginx:
    image: 127.0.0.1:5000/socketmw_nginx
    build: ./nginx
    links:
      - socketio-1
      - socketio-2
      - socketio-3
      - socketio-4
    ports:
      - '88:88'
    restart: always
  socketio-1:
    image: 127.0.0.1:5000/socketmw_s1
    build: ./service
    links:
      - redis-adapter
      - redis-cache-db
    environment:
      - NAME=socketio-1
    restart: always
    depends_on:
      - redis-adapter
      - redis-cache-db
  socketio-2:
    image: 127.0.0.1:5000/socketmw_s2
    build: ./service
    links:
      - redis-adapter
      - redis-cache-db
    environment:
      - NAME=socketio-2
    restart: always
    depends_on:
      - redis-adapter
      - redis-cache-db
  socketio-3:
    image: 127.0.0.1:5000/socketmw_s3
    build: ./service
    links:
      - redis-adapter
      - redis-cache-db
    environment:
      - NAME=socketio-3
    restart: always
    depends_on:
      - redis-adapter
      - redis-cache-db
  socketio-4:
    image: 127.0.0.1:5000/socketmw_s4
    build: ./service
    links:
      - redis-adapter
      - redis-cache-db
    environment:
      - NAME=socketio-4
    restart: always
    depends_on:
      - redis-adapter
      - redis-cache-db
  redis-adapter:
    image: redis:alpine
    restart: always
  redis-cache-db:
    image: 'redis:7.2.3'
    ports:
      - '6380:6380'
    command: redis-server --save 10 1 --appendonly yes --port 6380

排查与解决步骤

1. 优先检查Redis连接地址/端口

本地环境用localhost:6379连接Redis,但Docker容器网络中,容器间通信不能用localhost,必须用容器名+容器内部端口:

  • 你的redis-cache-db容器内部端口是6380(不是宿主机映射的6380),容器名是redis-cache-db,所以代码中缓存操作的Redis连接地址应该是redis-cache-db:6380,而非localhost:6379或localhost:6380。
  • 若代码仍用本地连接配置,SocketIO容器内的localhost指向容器自身,根本没连到目标Redis实例。

2. 确认是否混淆了两个Redis实例

你的Compose配置中有两个独立Redis服务:

  • redis-adapter:用于Socket.IO集群适配器,默认用6379端口
  • redis-cache-db:用于业务缓存,用6380端口
    如果代码把缓存的set操作发到了redis-adapter,却去redis-cache-db执行get,或者反过来,必然返回undefined。务必明确代码中的连接配置:
  • Socket.IO适配器连接redis-adapter:6379
  • 业务缓存的set/get操作连接redis-cache-db:6380

3. 手动验证Redis实例可用性

直接进入redis-cache-db容器,用Redis CLI测试基础功能,确认Redis服务本身无问题:

# 获取容器ID
docker ps | grep redis-cache-db
# 进入容器执行Redis CLI
docker exec -it <容器ID> redis-cli -p 6380
# 执行测试命令
set test "hello world"
get test

如果能正常返回"hello world",说明Redis本身没问题,问题出在代码连接配置;如果不能,检查Redis启动命令和容器日志。

4. 完善Compose配置,确保Redis就绪后启动服务

depends_on仅保证启动顺序,不保证Redis服务完全就绪。给Redis添加健康检查,让SocketIO服务等Redis真正可用后再启动:
修改docker-compose.yml中的Redis服务:

redis-adapter:
  image: redis:alpine
  restart: always
  healthcheck:
    test: ["CMD", "redis-cli", "ping"]
    interval: 5s
    timeout: 3s
    retries: 5
redis-cache-db:
  image: 'redis:7.2.3'
  ports:
    - '6380:6380'
  command: redis-server --save 10 1 --appendonly yes --port 6380
  healthcheck:
    test: ["CMD", "redis-cli", "-p", "6380", "ping"]
    interval: 5s
    timeout: 3s
    retries: 5

再修改每个SocketIO服务的depends_on:

socketio-1:
  # 保留原有配置
  depends_on:
    redis-adapter:
      condition: service_healthy
    redis-cache-db:
      condition: service_healthy
# socketio-2/3/4同理修改

内容的提问来源于stack exchange,提问作者D Galaa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:32:34