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
相关产品推荐
相关产品推荐

