【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实战技巧~

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

相关推荐
岳来2 小时前
网络小白对容器参数endpoint 和gateway 对比
网络·docker·容器·gateway·endpoint
❀͜͡傀儡师2 小时前
Vue+SpringBoot 集成 PageOffice实现在线编辑 Word、Excel 文档
vue.js·spring boot·word
小锋学长生活大爆炸2 小时前
【教程】极简部署OpenClaw并接入飞书等各大平台
docker·飞书·openclaw
市安2 小时前
基于Centos构建Nginx镜像(Dokerfile)
linux·运维·nginx·docker·容器·centos·镜像
invicinble2 小时前
梳理docker的提供机制
运维·docker·容器
Re.不晚2 小时前
Redis——缓存【缓存穿透、缓存雪崩、缓存击穿】
数据库·redis·缓存
wsfk12342 小时前
总结:Spring Boot 之spring.factories
java·spring boot·spring
LSL666_2 小时前
6 持久化
redis·mybatis·持久化·aof·rdb
予枫的编程笔记3 小时前
【Docker进阶篇】Docker Compose 实战:一键启动Web+数据库+缓存,微服务环境部署不再绕弯
人工智能·docker·开发效率工具·容器编排·docker compose·后端开发·微服务部署