Spring Boot连不上Docker Redis主因是网络与监听配置错配:宿主机运行时需正确映射端口(0.0.0.0:6379→6379)、Redis容器内设bind 0.0.0.0且protected-mode no、宿主机防火墙放行6379;容器内运行时则必须用服务名(如redis)作host,加入同一自定义网络,并确保DNS解析与连通性。

Spring Boot 应用连不上 Docker 中的 Redis,99% 不是代码问题,而是网络拓扑或 Redis 自身监听配置没对齐。关键看 Spring Boot 是运行在宿主机,还是也跑在 Docker 容器里——这两者连接方式完全不同。
Spring Boot 运行在宿主机时,别用 localhost 当 host
宿主机上的 Spring Boot 通过 localhost:6379 访问 Redis,前提是 Docker 已正确映射端口。但很多人漏掉这一步:
- 运行
docker ps,确认输出里有类似0.0.0.0:6379->6379/tcp的行;如果只看到6379/tcp,说明没暴露端口,得补上-p 6379:6379或在docker-compose.yml的ports下加- "6379:6379" - 即使端口映射了,Redis 容器内部默认只绑
127.0.0.1,对外拒绝连接。必须确保容器内 Redis 启动时带--bind 0.0.0.0,或挂载的redis.conf包含bind 0.0.0.0和protected-mode no - Linux 宿主机防火墙(如
firewalld或ufw)可能拦截 6379 入向流量,需手动放行:sudo firewall-cmd --add-port=6379/tcp --permanent && sudo firewall-cmd --reload
Spring Boot 也运行在 Docker 容器里,host 必须用服务名
一旦 Spring Boot 打包进镜像并用 docker run 或 docker-compose 启动,localhost 就指向它自己,而不是宿主机。此时不能靠端口映射,必须走 Docker 内部网络:
- 所有服务(Spring Boot、Redis、MySQL 等)要加入同一个自定义网络,例如
app_net;docker network create app_net - 在
docker-compose.yml中,Redis 服务名为redis,那么 Spring Boot 的配置就得写spring.redis.host=redis,端口仍是6379(不是映射后的端口,比如16379) - 验证是否通:进入 Spring Boot 容器执行
nslookup redis或ping redis,能解析且通,再试redis-cli -h redis ping
连接报 Connection refused 而不是 timeout,优先查 Redis 是否真在监听
Connection refused 意味着 TCP 连接被目标端口明确拒绝,不是网络不通,而是 Redis 根本没在那个地址+端口上 listen。常见原因:
- Redis 容器启动失败,
docker ps -a看状态是不是Exited;日志用docker logs redis查,常见错误是配置文件路径错、requirepass与protected-mode no冲突 - 用了自定义
redis.conf,但忘了把bind改成0.0.0.0,或仍保留bind 127.0.0.1 ::1多值写法(Docker 内不生效) - Spring Boot 配置里写了
password,但 Redis 实际没设密码(requirepass未启用),会直接拒 AUTH 请求,报错类似ERR Client sent AUTH, but no password is set
Lettuce 默认懒加载,启动不报错 ≠ 连接就正常
Spring Boot 3.x 用 Lettuce,连接工厂初始化时不会主动建连,第一次调用 redisTemplate.opsForValue().get(...) 才触发。所以应用能启动成功,不代表 Redis 可用:
- 启动后立刻用
redis-cli -h [host] -p [port] ping手动验证,比等业务请求更早发现问题 - 如果用的是 Docker Compose,可在 Spring Boot 服务加
depends_on,但这只保证容器启动顺序,不保证 Redis 服务已 ready;更稳妥的做法是在应用启动脚本里加重试逻辑,或用wait-for-it.sh - 高并发下报连接失败,大概率是 Lettuce 连接池参数太小,比如
lettuce.pool.max-active=8不够用,得结合压测调优
最常被忽略的一点:Docker 网络模式和 Redis bind 配置必须匹配。宿主机访问看端口映射 + bind 0.0.0.0,容器间通信看自定义网络 + 服务名 + 默认端口 6379,两者混用必出问题。


















