欢迎光临
我们一直在努力

【Docker进阶篇】Docker Compose实战:Spring Boot与Redis服务名通信全解析

在这里插入图片描述

🍃 予枫:个人主页

📚 个人专栏: 《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通常有两个麻烦:

  • 手动指定Redis容器IP:需要先查看Redis容器的IP(docker inspect 容器ID),再在Spring Boot配置文件中填写,步骤繁琐;
  • IP易变导致连接失败:容器重启、重新部署后,IP可能会发生变化,一旦变化,Spring Boot就会报“连接超时”错误,需要重新修改配置,非常影响开发效率。
  • 而借助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: rediscontainer # 容器名称(可选,方便查看)
    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: springbootcontainer
    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 构建并启动服务(实操步骤)

  • 编写Spring Boot的Dockerfile(放在项目根目录,与docker-compose.yml同级):FROM openjdk:17-jdk-slim # 基础镜像,根据自己的JDK版本调整
    WORKDIR /app
    COPY target/*.jar app.jar # 复制打包后的jar包(需先执行mvn package打包)
    EXPOSE 8080
    ENTRYPOINT ["java", "-jar", "app.jar"]
  • 打包Spring Boot项目:执行mvn clean package,确保target目录下生成jar包;
  • 启动Compose服务:在项目根目录执行命令docker-compose up -d,Compose会自动拉取Redis镜像、构建Spring Boot镜像,并启动两个容器;
  • 验证连接:
    • 访问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点:

  • Compose会自动创建默认网络,同一网络下的容器可通过服务名互联互通;
  • 核心配置是“Spring Boot的Redis主机名=Redis服务名”,这是实现服务发现的关键;
  • 配合depends_on配置,确保Redis先于Spring Boot启动,避免连接失败。
  • 通过这种方式,我们可以彻底告别手动指定IP的繁琐,解决IP变更导致的连接问题,提升开发和部署效率。无论是开发环境还是测试环境,这种方案都非常实用。


    我是予枫,专注分享后端实操干货,关注我,下期带你解锁更多Docker Compose实战技巧~ 如果本文对你有帮助,记得点赞+收藏,有疑问可以在评论区留言,我会一一回复!

    赞(0)
    未经允许不得转载:171主机测评 » 【Docker进阶篇】Docker Compose实战:Spring Boot与Redis服务名通信全解析
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址