Docker环境下Node容器无法连接Redis服务故障排查求助
故障根因说明
你遇到的连接故障是Redis 7.0 + Docker Compose部署的典型踩坑点叠加导致的,和触发内存限制后新增的配置修改直接相关:
- Docker Compose内部DNS解析的是**服务名(service name)**而非容器名(container_name),你最开始写的错误地址
redis//redis:6379属于格式错误,修正为redis:6379这一步是对的,但没有解决Redis本身的配置问题 - Redis 7.0默认开启
protected-mode保护模式,即使你配置了bind 0.0.0.0,如果没有配置访问密码、没有显式关闭保护模式,所有来自非127.0.0.1的连接(同Docker网络下其他容器的访问属于这一类)都会被静默拒绝,Redis服务日志只会显示正常启动,不会打印连接拒绝的错误信息 - 你的compose配置中
depends_on字段填的是容器名redis-service,但实际Redis服务的service名是redis,这个配置错误会导致服务启动顺序依赖失效,可能出现应用启动时Redis还没完成初始化的情况 - 自定义Redis镜像的启动脚本如果没有显式指定你修改后的redis.conf路径,所有配置修改都不会生效,Redis会以默认参数启动
修复步骤
- 修正Redis配置文件参数
找到你自定义Redis镜像中使用的redis.conf文件,确认以下两行配置未被注释,参数值正确:
*如果是生产环境部署,不建议直接关闭保护模式,替换为配置bind 0.0.0.0 protected-mode norequirepass 你的自定义密码,同时把应用的REDIS_URI改成redis://:你的密码@redis:6379即可。 - 修正Redis启动脚本
检查你./docker/redis/目录下的init.sh脚本,确认最后启动Redis服务的命令显式指定了配置文件路径,不要裸启动redis-server,参考写法:
路径替换为你redis.conf在镜像内的实际存放路径,比如常见路径是# 前面写你自己的初始化逻辑,比如目录权限修改、初始化脚本执行等 # 最后必须用exec加载配置启动Redis,避免配置不生效 exec redis-server /path/to/your/redis.conf/usr/local/etc/redis/redis.conf。 - 修正docker-compose.yml配置错误
把classified-ads服务下的depends_on配置改成正确的服务名,修正后的关键配置段参考:services: classified-ads: container_name: classified-ads depends_on: - redis # 原来写的redis-service是错误值,必须填服务名 - 重启服务验证
执行以下命令重新构建启动服务,避免旧镜像、旧容器缓存导致配置不生效:
启动后先在应用容器内测试连通性:docker compose down docker compose up --build -d# 进入应用容器 docker exec -it classified-ads sh # 测试Redis连接,返回PONG即为连通正常 redis-cli -h redis ping
补充说明
你之前在容器内ping能通redis:6379只能说明ICMP协议网络连通、Docker DNS解析正常,不代表Redis的6379端口接受了连接请求,这是很多人排查Docker网络时容易混淆的点。
内容的提问来源于stack exchange,提问作者Curcuma_
相关产品推荐
相关产品推荐

