下面用Java 后端项目场景来对比:JAR 包部署 vs Docker 部署。
区别
JAR 包部署 是把 xxx.jar 上传到服务器,然后用服务器上的 Java 环境运行。
bash
java -jar app.jar
Docker 部署是把项目、运行环境、启动方式一起打成镜像,然后用 Docker 容器运行。
bash
docker run app-image
1. JAR 包部署流程
你的 deploy.sh 就属于这种。
流程大概是:
本地 Maven 打包
↓
生成 target/xxx.jar
↓
上传 jar 到服务器
↓
服务器执行 run.sh
↓
java -jar xxx.jar 启动项目
典型命令:
bash
mvn clean package -DskipTests
scp target/app.jar root@server:/projects/service/
ssh root@server
java -jar /projects/service/app.jar
服务器上必须提前装好:
Java
Maven 可选
Nginx 可选
MySQL/Redis 连接配置
2. Docker 部署流程
Docker 部署一般是:
写 Dockerfile
↓
构建镜像
↓
上传镜像或服务器拉取代码
↓
docker run / docker compose up
↓
容器内运行 Java 项目
典型 Dockerfile:
docker
FROM eclipse-temurin:17-jre
WORKDIR /app
COPY target/app.jar app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]
启动:
bash
docker build -t aio-life-server .
docker run -d -p 8080:8080 --name aio-life-server aio-life-server
或者用 docker-compose.yml:
yaml
services:
app:
image: aio-life-server
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
3. 核心对比
| 对比项 | JAR 包部署 | Docker 部署 |
|---|---|---|
| 部署对象 | .jar 文件 |
Docker 镜像 / 容器 |
| 运行环境 | 依赖服务器本机 Java | 环境封装在镜像中 |
| 启动方式 | java -jar app.jar |
docker run / docker compose up |
| 服务器要求 | 必须装 Java | 必须装 Docker |
| 环境一致性 | 一般 | 很强 |
| 部署复杂度 | 初期简单 | 初期稍复杂 |
| 后期维护 | 容易混乱 | 更规范 |
| 回滚版本 | 需要手动换 jar | 切换镜像 tag 即可 |
| 多服务编排 | 麻烦 | 很适合 |
| 日志管理 | 自己处理 log 文件 | docker logs 或日志系统 |
| 端口管理 | 应用直接占用宿主机端口 | 容器端口映射 |
| 配置管理 | 环境变量 / 配置文件 | 环境变量 / compose / secrets |
| 适合阶段 | 简单项目、早期项目 | 正式部署、多服务项目 |
4. JAR 包部署的优缺点
优点
简单直接。
你只要有:
Java
jar 包
启动脚本
就能跑。
适合你现在这种独立开发、小型后端服务。
缺点
服务器环境容易变乱。
比如:
本地 Java 17
服务器 Java 8
本地能跑
服务器报错
或者:
多个项目共用一台服务器
端口冲突
日志到处放
进程不好管理
还有一个常见问题:
旧进程没杀掉,新 jar 启不起来
5. Docker 部署的优缺点
优点
最大优势是:
环境一致。
你的 Java 版本、启动命令、依赖都写在镜像里。
本地、测试服务器、生产服务器运行方式都一样:
bash
docker compose up -d
更适合多个服务:
后端
前端
MySQL
Redis
Nginx
统一用一个 docker-compose.yml 管起来。
缺点
前期需要理解:
Dockerfile
image
container
volume
network
docker compose
如果只部署一个很小的 Java 服务,刚开始可能会觉得麻烦。