数据库Redis全栈打包_数据库容器化部署_Spring Boot3容器化部署

是不是还在为,Spring Boot3应用在容器化部署方面,而感到头疼,数据库在容器化部署方面,也感觉束手无策,还有那Redis在容器化部署方面,同样也有困扰?

今天,运用一套完整的实操方案,引领你全然告别多组件部署的那种紊乱状态,所有的代码以及避坑指南都在此处,径直依照这去做便能够达成成功。

项目依赖的精准确认

在动手写代码前,先把pom.xml文件配置好是成功的一半。

选取我上周刚刚完结的一个电商项目当作例子,除了将spring-boot-starter-web以及spring-boot-starter-data-redis予以引入之外,还必然要增添spring-boot-starter-jdbc以及mysql-connector-java依赖。

不少新手于此处极易把连接池的配置给遗漏掉,实则Spring Boot3会默认去采用HikariCP ,然而你得于配置文件当中清晰地指明像是连接超时时间、最大连接数这类参数。

再者,可别忘记去查验spring - boot - maven - plugin插件是不是完整无缺的哟。

曾有一次,在2025年初的一个项目里,构建出的镜像一直无法正常启动,原因是插件版本与Spring Boot3.2.x不匹配,为此排查了两天,最终才发现是插件中的layers配置出现了问题,有此状况。

提议直接运用spring - boot - starter - parent那里所界定的版本编号,防止经手动予以指定而引致的兼容性方面的风险。

数据库与Redis的容器化配置

Spring Boot3在配置文件方面有着较为显著的改动,建议采用YAML格式来施行多环境配置。

在application.yml当中,你得如此配置MySQL连接,即spring.datasource.url=jdbc:mysql://容器内数据库服务名:3306/mydb,此处的服务名依赖于你于docker-compose里所定义的服务名称,而非单纯的localhost。

建议将数据库密码经由环境变量传入,举例来说,可采用${DB_PASSWORD}占位符。

Redis的配置同样需要留意连接工厂的设置。

在实际开展开发工作期间,我察觉到,要是直接使用Lettuce连接池的话,于高并发的状况之下,偶尔的时候会出现连接泄露这种情况,将其改换为jedis之后,相关问题就得以解决。

实施配置操作之际,要记着将spring.redis.host设定成为容积内部的服务名称,还要去配置恰当适宜的超时时间以及连接池大小,就像spring.redis.jedis.pool.max-active等于8这种情况,这些细微之处直接对生产环境的稳定性起到决定性作用。

镜像构建的多阶段实战

多阶段构建是控制镜像大小的关键。

如下是我在相关项目里所运用的Dockerfile模板,第一阶段之时,选用maven : 3.8.6 - openjdk - 17 - slim当作构建镜像来用,把本地那儿的pom.xml以及源码拷贝进去,而后执行mvn clean package。


    org.springframework.boot
    spring-boot-starter-data-redis

第二阶段,以openjdk:17-slim当作基础镜像,仅复制第一阶段生成的 jar 包,如此一来,最终镜像体积能够从800MB缩减至200MB左右。

spring:
  redis:
    host: your-redis-host
    port: 6379
    password: your-redis-password

记住,于构建命令里添加 -DskipTests 参数去跳过测试,不然的话,构建进程会因等候测试完工而变得异常迟缓。

我曾目睹有共事的人,于CI/CD流水线里,忘掉添加此参数,每一次构建,均需耗费将近10分钟。

此外,运用docker buildx能够构建出支持多平台的镜像,要是你同时有将其部署至AMD64架构服务器以及ARM64架构服务器上头的需求,那么这个技巧是格外实用的。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class RedisService {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    public void setValue(String key, String value) {
        stringRedisTemplate.opsForValue().set(key, value);
    }
    public String getValue(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }
}

启动脚本的环境变量管理

运行容器时通过-e传入环境变量是最灵活的方式。

要是你的应用存在连接不一样数据库的需求,那么能够如此来启动:docker run,-e SPRING_PROFILES_ACTIVE=prod,-e DB_URL=生产数据库地址,your-image-name。

主张把全部能够变化的配置一概抽象化作环境变量,于代码里运用@Value或者@ConfigurationProperties注解用来读取。

这里存在足以令人警醒的血的教训,那便是,千万别将数据库密码直接书写于启动命令当中,不然的话,如此这般便会于shell历史记录里遗留下明文形式的密码。

采取正确的做法,是运用docker secret,或者通过挂载配置文件的方式,去管理敏感信息。


    
        
            org.springframework.boot
            spring-boot-maven-plugin
            
                
                    your-image-name
                
            
        
    

在2024年接近末尾的时候,有一个金融项目,我于其中采用了这样的方式,经过了安全部门格外严谨的审计通过。

把所有环境变量写在一个文件里统一管理,对于复杂参数而言,能够使用env_file选项。

mvn -Pnative spring-boot:build-image

启动失败的自检清单

当容器启动后立刻退出,第一件事是查看日志。

查看最后100行日志,要使用docker logs 容器名 --tail 100 ,常见的发生错误的情况有端口被占用,数据库连接失败,配 置项缺失等。

docker images

像比如说出现报错提示数据库连接超时这种情况的时候,能够去进入数据库容器对连通性进行测试,对应操作是这样的:docker exec -it 数据库容器名 mysql -u root -p。

设于端口冲突的状况之下,映射端口的修改便成为可行之策,举例而言,把宿主机的8080映射至容器8080的这一情况,将其更换为8081:8080。

一回,我碰到应用启动时出现报错,提示找不到Redis集群,经排查,发觉是配置文件里spring.redis.cluster.nodes的格式有误,正确的格式应当是host1:port,host2:port这般的形式。

mvn dependency:tree

当每次开展配置修改之后,均是需要予以重新构建镜像的操作行为,于此情形下,就建议在处于开发阶段的时候,采用施加挂载卷这种方式,以便能够实施快速调试。

容器化部署的协同工作

虽然把Spring Boot3应用、MySQL以及Redis打包到同一个镜像里是挺便利的,然而在微服务架构当中它是不被建议的。

# 第一阶段:构建应用
FROM maven:3.8.6-openjdk-17 AS build
WORKDIR /app
COPY pom.xml.
COPY src.
RUN mvn clean package -DskipTests
# 第二阶段:生成最终镜像
FROM openjdk:17-jre-slim
WORKDIR /app
COPY --from=build /app/target/your-application.jar.
EXPOSE 8080
CMD ["java", "-jar", "your-application.jar"]

更佳的做法是运用docker-compose把它们界定为三个各不相同的服务,凭借服务名称彼此进行通信。

在一个中型物流项目里,我采用了这样的方式,三个容器分别独立进行升级,并且分别独立完成扩缩容,最终运维效率得到了极大的提升。

数据库的数据持久化得通过卷挂载来实现嘞,要在docker - compose.yml里头给MySQL服务加上volumes配置,把容器当中的/var/lib/mysql映射到宿主机的某一个目录那儿。

持久化配置,Redis同样是需要的,要设置appendonly为yes,并且要挂载数据目录。

这样即使容器被删除重建,数据也不会丢失。

于监控范畴而言,Spring Boot3之Actuator端点具备将容器内部运行状态予以暴露展现的能力,使之与Prometheus以及Grafana相互协作,能够达成全方位的监控报警功效。

docker run --rm -p 8080:8080 your-image-name

你于开展Spring Boot3容器化部署期间有着遭遇怎样稀奇古怪的问题呢?

期望于评论区域之中分享你那遭遇挫折的经历,对这篇文章予以点赞并收藏起来,如此一来,当往后碰到相似问题之际,便能够迅速找寻到解决办法了。