🍃 予枫:个人主页
📚 个人专栏: 《Java 从入门到起飞》《读研码农的干货日常》
💻 Debug 这个世界,Return 更好的自己!
做Spring Boot+Redis+Docker Compose开发时,你是不是也踩过“IP变更导致Redis连接失败”的坑?手动指定容器IP繁琐又易出错,其实Compse自带网络机制,只需简单配置,就能让Spring Boot通过“服务名”直接访问Redis,无需关注IP变化。本文从原理到实操,手把手教你搞定容器间服务发现与通信,新手也能快速上手,建议点赞收藏备用~
文章目录
- 一、COMPOSE网络核心原理(极简科普)
- 二、SPRING BOOT连接REDIS的痛点分析
- 三、实战:COMPOSE中通过服务名连接REDIS(完整步骤)
-
- 3.1 环境准备(必看)
- 3.2 编写docker-compose.yml(核心配置)
-
- 关键配置说明(重点划重点!)
- 3.3 编写Spring Boot配置文件(application.yml)
- 3.4 编写Spring Boot测试接口(验证连接)
- 3.5 构建并启动服务(实操步骤)
- 四、常见问题排查(避坑指南)
-
- 4.1 连接超时(Could not connect to Redis)
- 4.2 密码错误(Authentication failed)
- 4.3 Spring Boot启动成功,但无法访问接口
- 五、总结
一、COMPOSE网络核心原理(极简科普)
Docker Compose在启动容器时,会自动创建一个默认网络(默认名称为“项目名_default”),同一个网络下的所有容器,无需额外配置,就能实现互联互通。
核心亮点就是「服务名映射」:Compose会将docker-compose.yml中定义的每个service名称,自动映射为对应容器的“主机名”,容器间可以直接通过“服务名”相互访问,底层会由Compose自动解析为对应容器的IP地址。
✨ 关键提醒:这也是为什么我们不用记IP的核心原因——Compose帮我们做了“IP→服务名”的自动解析,哪怕容器重启后IP变化,服务名映射也会自动更新,彻底告别IP变更的烦恼。
二、SPRING BOOT连接REDIS的痛点分析
在没有使用Compose网络时,Spring Boot连接Redis通常有两个麻烦:
而借助Compose的服务名通信机制,就能一次性解决这两个痛点,配置简单且一劳永逸。
三、实战:COMPOSE中通过服务名连接REDIS(完整步骤)
下面我们用最简洁的实操,实现Spring Boot通过服务名连接Redis,全程可复制,建议跟着动手操作一遍,印象更深刻(记得点赞收藏,避免后续找不到)。
3.1 环境准备(必看)
- 已安装Docker和Docker Compose(无需额外安装Redis,Compose会自动拉取镜像);
- 已创建Spring Boot项目(需引入Redis依赖);
- 基础开发工具(IDEA、Maven/Gradle)。
3.2 编写docker-compose.yml(核心配置)
在Spring Boot项目根目录下,创建docker-compose.yml文件,核心是定义Spring Boot和Redis两个服务,确保它们在同一个网络下(默认网络即可,无需额外创建)。
# docker-compose.yml 完整配置(可直接复制)
version: '3.8' # 兼容大多数Docker版本
services:
# Redis服务:服务名定为redis(关键!Spring Boot将通过这个名称连接)
redis:
image: redis:7.0 # 指定Redis镜像版本,稳定不易错
container_name: redis–container # 容器名称(可选,方便查看)
ports:
– "6379:6379" # 端口映射,本地可通过6379访问Redis(可选)
environment:
– REDIS_PASSWORD=123456 # Redis密码(建议设置,更安全)
restart: always # 容器重启策略,意外停止后自动重启
networks:
– default # 加入默认网络(可省略,默认就是加入default网络)
# Spring Boot服务:服务名可自定义,这里定为springboot-redis-demo
springboot-redis-demo:
build: . # 构建当前目录下的Spring Boot项目(需确保根目录有Dockerfile)
container_name: springboot–container
ports:
– "8080:8080" # 端口映射,本地可通过8080访问Spring Boot项目
depends_on:
– redis # 关键配置:指定依赖redis服务,确保Redis先启动
environment:
– SPRING_REDIS_HOST=redis # 核心!Redis主机名=Redis服务名(必须和上面的redis服务名一致)
– SPRING_REDIS_PASSWORD=123456 # 与Redis的密码一致
– SPRING_REDIS_PORT=6379 # Redis端口,默认6379
restart: always
networks:
– default # 加入默认网络,与Redis在同一个网络下
# 网络配置(可省略,Compose会自动创建default网络)
networks:
default:
driver: bridge
关键配置说明(重点划重点!)
- services.redis:Redis服务的服务名是redis,这是Spring Boot连接Redis的“关键标识”,后续Spring Boot配置文件中,Redis的主机名必须和这个服务名一致;
- depends_on: – redis:确保Compose启动时,先启动Redis服务,再启动Spring Boot服务,避免Spring Boot启动时Redis还未就绪,导致连接失败;
- SPRING_REDIS_HOST=redis:核心中的核心!这里的redis不是IP,而是上面定义的Redis服务名,Compose会自动将这个服务名解析为Redis容器的IP地址。
3.3 编写Spring Boot配置文件(application.yml)
无需填写Redis的IP,只需指定服务名、密码和端口,配置如下(可直接复制):
# application.yml
server:
port: 8080 # 与docker-compose.yml中Spring Boot的端口一致
spring:
redis:
host: redis # 必须和docker-compose.yml中Redis的服务名一致(重中之重)
port: 6379
password: 123456 # 与docker-compose.yml中Redis的密码一致
timeout: 3000ms # 连接超时时间(可选)
lettuce:
pool:
max-active: 8 # 连接池最大连接数(可选)
max-idle: 8 # 连接池最大空闲连接数(可选)
min-idle: 0 # 连接池最小空闲连接数(可选)
3.4 编写Spring Boot测试接口(验证连接)
为了验证Spring Boot是否能成功通过服务名连接Redis,我们编写一个简单的测试接口,实现“存入数据+读取数据”的功能。
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class RedisTestController {
// 注入StringRedisTemplate,操作Redis
@Resource
private StringRedisTemplate stringRedisTemplate;
// 存入数据:http://localhost:8080/set/key/value
@GetMapping("/set/{key}/{value}")
public String setKey(@PathVariable String key, @PathVariable String value) {
stringRedisTemplate.opsForValue().set(key, value);
return "success:已存入数据【" + key + "=" + value + "】";
}
// 读取数据:http://localhost:8080/get/key
@GetMapping("/get/{key}")
public String getKey(@PathVariable String key) {
String value = stringRedisTemplate.opsForValue().get(key);
return "读取成功:【" + key + "=" + value + "】";
}
}
3.5 构建并启动服务(实操步骤)
WORKDIR /app
COPY target/*.jar app.jar # 复制打包后的jar包(需先执行mvn package打包)
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
- 访问http://localhost:8080/set/test/helloRedis,返回“success:已存入数据【test=helloRedis】”,说明存入成功;
- 访问http://localhost:8080/get/test,返回“读取成功:【test=helloRedis】”,说明Spring Boot成功通过服务名连接到Redis!
🎉 恭喜!到这里,你就已经搞定了Compose网络下Spring Boot与Redis的服务名通信,再也不用记繁琐的IP地址了。
四、常见问题排查(避坑指南)
实操过程中,可能会遇到连接失败的情况,这里整理了3个最常见的问题,帮你快速排查(建议收藏,踩坑时直接对照):
4.1 连接超时(Could not connect to Redis)
- 排查1:检查docker-compose.yml中Spring Boot的SPRING_REDIS_HOST是否与Redis的服务名一致(必须完全一致,区分大小写);
- 排查2:检查两个服务是否在同一个网络下(默认都是default网络,若自定义网络,需确保两个服务都加入同一个网络);
- 排查3:检查depends_on: – redis配置是否存在,避免Spring Boot先于Redis启动。
4.2 密码错误(Authentication failed)
- 排查:确保Spring Boot配置文件中的spring.redis.password,与docker-compose.yml中Redis的REDIS_PASSWORD一致,不要多空格、少字符。
4.3 Spring Boot启动成功,但无法访问接口
- 排查1:检查docker-compose.yml中Spring Boot的端口映射是否正确(8080:8080,本地端口未被占用);
- 排查2:检查容器是否启动成功,执行docker-compose ps,查看两个容器的状态是否为“Up”;
- 排查3:检查Spring Boot日志,执行docker logs -f springboot-container,查看是否有报错信息。
五、总结
本文核心讲解了Docker Compose网络中,Spring Boot通过“服务名”连接Redis的原理与实操,核心要点总结3点:
通过这种方式,我们可以彻底告别手动指定IP的繁琐,解决IP变更导致的连接问题,提升开发和部署效率。无论是开发环境还是测试环境,这种方案都非常实用。
我是予枫,专注分享后端实操干货,关注我,下期带你解锁更多Docker Compose实战技巧~ 如果本文对你有帮助,记得点赞+收藏,有疑问可以在评论区留言,我会一一回复!




