当前位置: 代码网 > 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 built 和 successfully 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