SpringBoot 系列 20:Jar 打包 + Docker 容器化 + Compose 一键部署|服务器上线 & 零停机平滑升级全教程

文章目录

📌 专栏:SpringBoot进阶实战系列

文章评级:零基础上手+本地打包+Docker容器化+服务器部署+开机自启+生产避坑+运维全流程

🔥 适用人群:后端初学者、SpringBoot项目上线、个人项目部署、企业生产交付、运维开发

💡 前置基础:SpringBoot基础项目、Linux服务器基础操作、Maven基础

🏷️ 文章标签:#SpringBoot #项目部署 #Jar打包 #Docker部署 #服务器上线 #开机自启 #生产运维


🎯 本文独家核心收获

  • 两套部署方案全覆盖:传统Jar包服务器部署 + Docker容器化标准化部署,满足测试/生产不同场景

  • 零报错打包流程:解决Maven打包失败、依赖缺失、配置环境切换、资源导出异常等常见问题

  • 生产级Docker规范:手把手编写最优Dockerfile、构建镜像、启动容器、端口映射、日志挂载

  • 服务器完整上线流程:文件上传、环境准备、启动命令、后台运行、开机自启、防火墙配置

  • 高频线上故障解决:端口占用、启动闪退、日志乱码、容器重启失效、配置不生效、跨域访问失败

  • 企业运维规范:版本更新、平滑重启、日志查看、服务监控、下线流程全套标准操作

  • 面试高频考点:容器化优势、Docker与传统部署区别、生产部署规范、上线风险规避


一、前言:为什么必须掌握标准化部署流程?

很多开发者只会写代码,不会项目上线部署:本地运行正常,传到服务器就启动失败、端口冲突、配置失效、环境不一致。

传统开发部署存在致命痛点:本地环境与服务器环境不一致、部署步骤混乱、无法快速迁移、无开机自启、更新项目繁琐

Docker容器化部署是目前企业生产唯一标准:一次打包、随处运行、环境隔离、版本可控、迁移便捷、运维成本极低。

本文带你从零完成:Maven打包Jar → 服务器环境准备 → 传统Jar部署 → Docker容器化部署 → 开机自启 → 运维监控 → 故障排查 全闭环流程,可直接用于企业项目上线。


二、SpringBoot项目标准Jar打包(Maven零报错)

2.1 打包前置配置(必须配置,否则启动报错)

SpringBoot项目打包必须在pom.xml中指定打包插件,否则无法生成可执行Jar包。

xml 复制代码
<build>
    <plugins>
        <!-- SpringBoot打包核心插件 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.7.15</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

2.2 多环境配置隔离(生产必备)

开发、测试、生产环境配置分离,打包时动态切换,避免改配置上线出错。

项目资源目录新建配置文件:

  • application.yml(公共配置)

  • application-dev.yml(本地开发)

  • application-prod.yml(生产环境)

pom.xml添加打包环境激活配置:

xml 复制代码
<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <active.profile>dev</active.profile>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <active.profile>prod</active.profile>
        </properties>
    </profile>
</profiles>

2.3 IDEA可视化打包(新手推荐)

  1. 打开IDEA右侧 Maven 面板

  2. 选择对应项目 → Lifecycle

  3. 先执行 clean 清空旧包

  4. 切换 prod 生产环境

  5. 执行 package 打包

打包成功后,Jar包位置:项目根目录/target/xxx.jar

2.4 Maven命令行打包(服务端通用)

bash 复制代码
# 清空旧文件 + 生产环境打包
mvn clean package -P prod -Dmaven.test.skip=true

参数说明:

  • -P prod:激活生产环境配置

  • -Dmaven.test.skip=true:跳过单元测试,加速打包

2.5 打包常见报错与解决方案

  • 打包后无法启动:未配置spring-boot-maven-plugin插件

  • 依赖缺失报错:网络问题导致依赖下载失败,重新clean打包

  • 配置文件不生效:未激活生产环境、配置文件名不规范

  • 中文日志乱码:IDEA编码统一设置为UTF-8


三、传统服务器Jar部署方案(适合小型项目、测试环境)

3.1 服务器环境准备

Linux服务器必须提前安装JDK8+环境:

bash 复制代码
# 查看JDK版本
java -version

3.2 上传Jar包至服务器

在服务器新建项目目录,统一存放Jar包和日志:

bash 复制代码
# 创建项目目录
mkdir -p /home/springboot/project
# 创建日志目录
mkdir -p /home/springboot/logs

通过Xshell、FinalShell、宝塔等工具,将本地打好的Jar包上传至 /home/springboot/project 目录。

3.3 后台启动Jar包(生产基础命令)

bash 复制代码
# 后台启动项目,输出日志到指定文件
nohup java -jar /home/springboot/project/demo.jar --spring.profiles.active=prod > /home/springboot/logs/project.log 2>&1 

参数详解:

  • nohup:后台运行,关闭终端不停止服务

  • --spring.profiles.active=prod:指定生产环境配置

  • > 日志路径:输出正常日志

  • 2>&1:输出错误日志

  • 末尾&:持续后台运行

3.4 项目启停、重启、查看日志命令

bash 复制代码
# 查看项目进程
ps -ef | grep java

# 杀死项目进程(重启必备)
kill -9 进程号

# 实时查看日志
tail -f /home/springboot/logs/project.log

# 查看最新100行日志
tail -n 100 /home/springboot/logs/project.log

3.5 配置Linux开机自启(传统部署终极方案)

配置服务器重启自动启动项目,避免服务器断电后服务失联。

编辑开机自启文件:

bash 复制代码
vim /etc/rc.local

添加启动命令到文件末尾:

bash 复制代码
nohup java -jar /home/springboot/project/demo.jar --spring.profiles.active=prod > /home/springboot/logs/project.log 2>&1 

赋予执行权限:

bash 复制代码
chmod +x /etc/rc.local

四、Docker容器化部署(企业生产标准方案)

4.1 Docker部署核心优势

  • 环境隔离:容器独立环境,不污染服务器本机环境

  • 一次打包,随处运行:解决环境不一致问题

  • 部署极速:秒级启动、版本切换简单

  • 运维简单:统一启停、日志、重启、迁移方案

  • 高可用适配:适配微服务、集群部署、CI/CD自动部署

4.2 服务器Docker环境准备

安装Docker(CentOS通用):

bash 复制代码
# 安装依赖
yum install -y yum-utils
# 设置docker源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker
yum install -y docker-ce
# 启动docker
systemctl start docker
# 设置开机自启
systemctl enable docker

4.3 编写生产级Dockerfile(核心)

在Jar包同级目录,新建文件 Dockerfile(无后缀),以下为生产最优模板:

dockerfile 复制代码
# 基础JDK8镜像
FROM openjdk:8-jre-alpine

# 作者信息
MAINTAINER SpringBoot-Docker

# 设置时区,解决容器时间错乱问题
ENV TZ=Asia/Shanghai
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 复制Jar包到容器内
COPY demo.jar /app.jar

# 暴露项目端口
EXPOSE 8080

# 启动命令,指定生产环境
ENTRYPOINT ["java","-jar","/app.jar","--spring.profiles.active=prod"]

4.4 构建Docker镜像

进入Jar包和Dockerfile所在目录,执行构建命令:

bash 复制代码
# 构建镜像,镜像名springboot-demo,版本1.0
docker build -t springboot-demo:1.0 .

注意:末尾小数点不能省略,代表当前目录

4.5 启动Docker容器(生产完整命令)

bash 复制代码
docker run -d \
--name springboot-project \
-p 8080:8080 \
--restart always \
-v /home/springboot/logs:/logs \
springboot-demo:1.0

参数逐行详解:

  • -d:后台守护进程运行

  • --name:指定容器名称,方便管理

  • -p 8080:8080:端口映射(服务器端口:容器端口)

  • --restart always:容器开机自启、异常自动重启(生产必备)

  • -v:日志目录挂载,容器日志持久化到服务器本地

4.6 Docker常用运维命令

bash 复制代码
# 查看运行中容器
docker ps

# 查看容器日志
docker logs springboot-project

# 实时查看日志
docker logs -f springboot-project

# 重启容器
docker restart springboot-project

# 停止容器
docker stop springboot-project

# 删除容器
docker rm springboot-project

# 查看本地镜像
docker images

五、服务器防火墙与端口放行(访问必备)

项目启动成功后,外网无法访问,99%是防火墙未放行端口。

bash 复制代码
# 放行8080端口
firewall-cmd --add-port=8080/tcp --permanent

# 重启防火墙生效
firewall-cmd --reload

# 查看已放行端口
firewall-cmd --list-ports

云服务器(阿里云/腾讯云)需额外在安全组放行对应端口,否则依然无法访问。


六、项目版本更新与平滑上线流程

6.1 Jar部署更新流程

  1. 停止旧项目进程(kill -9)

  2. 上传新Jar包替换旧包

  3. 重新执行启动命令

  4. 查看日志验证启动成功

6.2 Docker容器化更新流程(推荐)

  1. 停止并删除旧容器

  2. 上传新Jar包,重新构建新版本镜像

  3. 启动新容器,挂载目录不变

  4. 验证接口可用性,完成更新


七、生产部署高频故障排查(全网最全)

问题1:项目启动成功,外网无法访问

根因:服务器防火墙未放行端口、云服务器安全组未配置、项目绑定localhost

解决方案:放行端口、配置安全组、yml中监听0.0.0.0

问题2:启动瞬间闪退,无报错日志

根因:端口占用、JDK版本不匹配、配置文件错误、数据库连接失败

解决方案:更换端口、统一JDK版本、检查数据库配置、查看详细启动日志

问题3:Docker容器启动成功但接口不通

根因:端口映射错误、容器未暴露端口、防火墙拦截

解决方案:核对EXPOSE端口与映射端口、重启防火墙

问题4:服务器重启后项目无法自动启动

根因:传统部署未配置rc.local、Docker未设置restart always

解决方案:补全开机自启配置,容器统一设置自动重启

问题5:容器日志时间相差8小时

根因:容器默认时区非东八区

解决方案:Dockerfile中添加时区配置(本文模板已内置)


八、两种部署方案优劣对比(生产选型指南)

部署方式 优点 缺点 适用场景
传统Jar部署 操作简单、无需Docker环境、上手快 环境污染、迁移麻烦、无隔离、运维繁琐 个人项目、测试环境、小型单机项目
Docker容器部署 环境隔离、统一标准、迁移便捷、高可用、适配集群 需要掌握Docker命令、初次部署稍复杂 企业生产、微服务、集群项目、正式上线项目

九、大厂面试高频问答

Q:Docker容器化部署相比传统Jar部署有什么优势?

**A:**1. 环境隔离,容器内部环境与服务器隔离,不会污染宿主机;2. 标准化交付,一次打包所有环境均可运行,解决环境不一致问题;3. 运维高效,启停、重启、迁移、版本回滚极其便捷;4. 天然支持集群、微服务、CI/CD自动化部署;5. 支持自动重启、自愈,服务稳定性更高。

Q:项目启动成功但外网访问不通,排查思路是什么?

**A:**1. 本地服务器curl自测接口是否通;2. 检查防火墙端口是否放行;3. 检查云服务器安全组策略;4. 查看项目是否绑定127.0.0.1本地回环;5. Docker部署核对端口映射是否正确。

Q:生产环境为什么要开启容器自动重启?

**A:**线上服务需要7*24小时运行,程序异常崩溃、服务器重启、意外宕机后,容器可以自动恢复服务,无需人工介入,极大提升服务高可用性,是生产上线必备配置。


十、全文总结

本文完整落地SpringBoot项目从零上线全流程 ,覆盖Maven标准打包、多环境配置隔离、传统Jar部署、Docker容器化生产部署、开机自启、端口放行、版本更新、故障排查全套核心能力:

  1. 掌握零报错Jar打包规范,解决90%打包异常、配置不生效问题;

  2. 熟练使用传统部署方案,适配小型项目快速上线;

  3. 精通企业级Docker容器化部署标准,掌握生产Dockerfile模板与运维命令;

  4. 具备项目版本迭代、平滑更新、线上故障快速排查能力;

  5. 理清两种部署方案选型逻辑,适配不同业务场景。

容器化部署是现代后端开发的必备技能,也是企业项目上线的唯一标准,本文所有脚本、命令、配置均可直接复制投产使用。


💖 点赞+收藏+关注专栏,持续更新SpringBoot底层原理、生产实战、架构优化、大厂面试硬核干货!

相关推荐
你想考研啊1 小时前
七、Docker 容器 + Docker Compose单机部署理发店系统
docker·容器·composer
invicinble1 小时前
关于微服务基本框架搭建--fegin最小使用demo
java·spring boot·微服务
码农进化录2 小时前
Java 程序员的 AI 进化论 | AI 辅助 CI/CD,让 AI 帮你做代码审查和部署决策
java·spring boot·openai
未来可期丶3 小时前
【开发环境】Windows+Docker Desktop+WSL2最佳实践
windows·docker·docker desktop·wsl2
ppandss13 小时前
Spring Boot 拦截器,我把学习踩坑过程画了张图
spring boot·后端·学习
卓怡学长11 小时前
w255基于springboot仓库管理系统
java·数据库·spring boot·spring·intellij-idea
csdn2015_14 小时前
springboot读取配置的方法
java·spring boot·spring
AOwhisky15 小时前
下一代容器来了?Docker 宣布原生支持 WebAssembly
java·运维·docker·容器·rust·wasm
Flittly17 小时前
【AgentScope Java新手村系列】(19)多模态-图像音频视频
java·spring boot·spring