【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的痛点分析](#二、SPRING BOOT连接REDIS的痛点分析)
  • 三、实战:COMPOSE中通过服务名连接REDIS(完整步骤)
    • [3.1 环境准备(必看)](#3.1 环境准备(必看))
    • [3.2 编写docker-compose.yml(核心配置)](#3.2 编写docker-compose.yml(核心配置))
    • [3.3 编写Spring Boot配置文件(application.yml)](#3.3 编写Spring Boot配置文件(application.yml))
    • [3.4 编写Spring Boot测试接口(验证连接)](#3.4 编写Spring Boot测试接口(验证连接))
    • [3.5 构建并启动服务(实操步骤)](#3.5 构建并启动服务(实操步骤))
  • 四、常见问题排查(避坑指南)
    • [4.1 连接超时(Could not connect to Redis)](#4.1 连接超时(Could not connect to Redis))
    • [4.2 密码错误(Authentication failed)](#4.2 密码错误(Authentication failed))
    • [4.3 Spring Boot启动成功,但无法访问接口](#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通常有两个麻烦:

  1. 手动指定Redis容器IP:需要先查看Redis容器的IP(docker inspect 容器ID),再在Spring Boot配置文件中填写,步骤繁琐;
  2. 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两个服务,确保它们在同一个网络下(默认网络即可,无需额外创建)。

yaml 复制代码
# 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,只需指定服务名、密码和端口,配置如下(可直接复制):

yaml 复制代码
# 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,我们编写一个简单的测试接口,实现"存入数据+读取数据"的功能。

java 复制代码
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 构建并启动服务(实操步骤)

  1. 编写Spring Boot的Dockerfile(放在项目根目录,与docker-compose.yml同级):

    dockerfile 复制代码
    FROM openjdk:17-jdk-slim  # 基础镜像,根据自己的JDK版本调整
    WORKDIR /app
    COPY target/*.jar app.jar  # 复制打包后的jar包(需先执行mvn package打包)
    EXPOSE 8080
    ENTRYPOINT ["java", "-jar", "app.jar"]
  2. 打包Spring Boot项目:执行mvn clean package,确保target目录下生成jar包;

  3. 启动Compose服务:在项目根目录执行命令docker-compose up -d,Compose会自动拉取Redis镜像、构建Spring Boot镜像,并启动两个容器;

  4. 验证连接:

    • 访问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点:

  1. Compose会自动创建默认网络,同一网络下的容器可通过服务名互联互通;
  2. 核心配置是"Spring Boot的Redis主机名=Redis服务名",这是实现服务发现的关键;
  3. 配合depends_on配置,确保Redis先于Spring Boot启动,避免连接失败。

通过这种方式,我们可以彻底告别手动指定IP的繁琐,解决IP变更导致的连接问题,提升开发和部署效率。无论是开发环境还是测试环境,这种方案都非常实用。


我是予枫,专注分享后端实操干货,关注我,下期带你解锁更多Docker Compose实战技巧~

如果本文对你有帮助,记得点赞+收藏,有疑问可以在评论区留言,我会一一回复!

相关推荐
lichenyang45338 分钟前
Docker 学习笔记(五):Docker Compose,用一个 YAML 启动前端、后端和 MongoDB
docker
lichenyang45341 分钟前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang4531 小时前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang4531 小时前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
杨运交1 小时前
[041][公共模块]分布式唯一ID生成器设计与实现:一款灵活可扩展的雪花算法框架
spring boot
用户30745969820717 小时前
Redis 延时队列详解
redis
烤代码的吐司君19 小时前
Redis 数据结构 ZSet, BIT, HyperLogLog,Geo 空间数据
redis·后端
Flittly1 天前
【AgentScope Java新手村系列】(14)人机交互
java·spring boot·spring
Flynt2 天前
从Spring Boot 4.0升到4.1,我在Maven和gRPC上栽了跟头
java·spring boot·后端
掉鱼的猫3 天前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·spring boot