当前位置: 代码网 > it编程>编程语言>Java > SpringBoot项目Docker部署全流程详解

SpringBoot项目Docker部署全流程详解

2026年07月28日 Java 我要评论
前言最近在部署一个基于 spring boot 的后台管理系统到 linux 服务器,采用了 docker 容器化部署的方式。虽然 docker 部署已经是主流,但在实际操作中,特别是涉及定时任务框架

前言

最近在部署一个基于 spring boot 的后台管理系统到 linux 服务器,采用了 docker 容器化部署的方式。虽然 docker 部署已经是主流,但在实际操作中,特别是涉及定时任务框架 quartz 的数据库表结构初始化时,还是遇到了一些比较隐蔽的“坑”。本文将复盘整个部署流程,从 jar 包准备、dockerfile 编写到容器启动、故障排查进行完整记录,希望能帮助大家避坑。

一、 准备工作:配置与环境

在打 jar 包之前,最重要的一步是修改配置文件以适配生产环境。很多同学习惯在本地用 localhost 开发,如果直接打包丢到服务器,容器内是找不到 localhost 的数据库的。

1. 修改数据库与中间件连接

进入 application-prod.yml(或 application.yml),重点检查以下配置:

  • 数据库 url:将 localhost 修改为服务器真实的 ip 地址或数据库服务地址。
  • redis 地址:同上,修改为真实 ip。
  • 文件上传路径:确保路径为 linux 格式(如 /app/upload),避免使用 windows 路径(c:/upload)。

2. 打包项目

在项目根目录执行 maven 命令:

mvn clean package

打包成功后,在target目录下找到myproject-admin.jar(本文以此命名)。

二、 编写 dockerfile

将 jar 包上传到服务器(如 /opt/docker/myproject/)目录下,并在同目录下创建 dockerfile 文件。

dockerfile 内容详解

# 1. 指定基础镜像
# 这里选用 eclipse temurin (jdk 17) 的 alpine 版本,体积小,安全性好
from eclipse-temurin:17-jre-alpine
# 2. 设置工作目录
workdir /app
# 3. 解决时区问题 (关键步骤)
# alpine 镜像默认时区是 utc,需要安装 tzdata 并配置为上海时区
# 利用 docker 缓存机制,将系统依赖安装放在 copy 之前
run apk add --no-cache tzdata && \
    cp /usr/share/zoneinfo/asia/shanghai /etc/localtime && \
    echo "asia/shanghai" > /etc/timezone && \
    apk del tzdata
# 4. 拷贝 jar 包
copy myproject-admin.jar .
# 5. 声明服务端口
expose 8080
# 6. 配置 jvm 参数
# -xms/xmx: 限制堆内存,防止容器 oom
# -djava.security.egd: 解决 linux 下随机数生成阻塞导致启动慢的问题
env java_opts="-xms512m -xmx1024m -djava.security.egd=file:/dev/./urandom"
# 7. 启动命令
# 使用 sh -c 启动是为了让环境变量 $java_opts 生效
entrypoint ["sh", "-c", "java $java_opts -jar myproject-admin.jar"]

三、 构建与运行

1. 构建镜像

在 jar 包所在目录执行:

docker build -t myproject-server:1.0 .

看到 successfully builtsuccessfully tagged 提示即表示构建成功。

2. 启动容器(生产推荐配置)

docker run -d \
  --name myproject-app \
  -p 8080:8080 \
  -m 1.5g \
  --cpus 1 \
  --restart=on-failure:5 \
  -v /home/myproject/logs:/app/logs \
  myproject-server:1.0

参数解释:

  • -d: 后台运行。
  • -m 1.5g: 限制容器最大内存。jvm 堆内存设置了 1g,给元空间等预留 500m,防止容器被宿主机 kill。
  • --restart=on-failure:5: 容器异常退出时自动重启,增强健壮性。
  • -v: 挂载日志目录,方便在宿主机直接查看日志。

四、 踩坑实录:quartz 表结构问题

1. 问题现象

容器启动瞬间报错,通过 docker logs -f myproject-app 查看日志,发现如下错误:

org.springframework.beans.factory.beancreationexception: error creating bean with name 'sysjobserviceimpl': ...
caused by: org.quartz.impl.jdbcjobstore.lockexception: failure obtaining db row lock: table 'db_name.qrtz_locks' doesn't exist

原因分析
项目集用了 quartz 定时任务框架,且配置了 jdbc 模式持久化。但数据库中缺少了 quartz 所需的标准表结构(qrtz_ 开头的表)。

2. 尝试解决与报错

找到项目中的 sql/quartz.sql 脚本并导入,结果执行时报错:

error 1826 (hy000): duplicate foreign key constraint name 'qrtz_triggers_ibfk_1'
error 1824 (hy000): failed to open the referenced table 'qrtz_triggers'

这是因为脚本中的表之间存在外键依赖,且数据库中可能残留了之前的元数据,导致脚本执行中断。

3. 最终解决方案

核心思路:先关闭外键检查,再手动逐表创建(或使用不含外键的建表语句)。
在 mysql 客户端执行以下 sql(已去除可能导致报错的外键约束,确保能跑通):

-- 1. 清理环境
set foreign_key_checks = 0;
drop table if exists qrtz_fired_triggers;
drop table if exists qrtz_paused_trigger_grps;
drop table if exists qrtz_scheduler_state;
drop table if exists qrtz_locks;
drop table if exists qrtz_simple_triggers;
drop table if exists qrtz_simprop_triggers;
drop table if exists qrtz_cron_triggers;
drop table if exists qrtz_blob_triggers;
drop table if exists qrtz_triggers;
drop table if exists qrtz_job_details;
drop table if exists qrtz_calendars;
-- 2. 建表语句(省略具体字段,请参考 quartz 官方 sql)
create table qrtz_job_details (...) engine=innodb;
create table qrtz_triggers (...) engine=innodb;
create table qrtz_simple_triggers (...) engine=innodb;
-- ... 其他表 ...
-- 3. 恢复检查
set foreign_key_checks = 1;

执行成功后,重启容器:

docker restart myproject-app

服务成功启动,日志显示started application。

五、 常用运维命令

部署完成后,记录几个高频使用的运维命令:

查看实时日志

docker logs -f myproject-app

进入容器内部排查(alpine 镜像用 sh):

docker exec -it myproject-app sh

复制容器内文件到宿主机

docker cp myproject-app:/app/logs/sys-info.log /home/

六、 总结

docker 部署 java 应用虽然简单,但细节决定成败:

  1. 配置文件一定要在打包前检查(数据库 ip、端口)。
  2. 数据库表结构要完整,尤其是像 quartz 这种需要持久化的框架。
  3. 遇到 mysql 外键报错时,使用 set foreign_key_checks = 0 往往能通过。

以上就是springboot项目docker部署全流程详解的详细内容,更多关于springboot docker部署全流程的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com