对比JAR 包部署 vs Docker 部署方式

下面用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 服务,刚开始可能会觉得麻烦。


相关推荐
步行cgn19 小时前
Spring 通过 factory-method 实例化 Bean 详解与常见错误排查
java·后端
lv__pf19 小时前
seata【实战 msb】
java·开发语言·后端
cxoptics19 小时前
偏振片(起偏器/检偏器)怎么区分?
java
StevenLdh19 小时前
第四期 · 云端同步与冲突仲裁:离线可写、多端一致的工程解法
java·微信小程序
事已至此先睡覺吧19 小时前
第三篇:Java 流程控制详解:条件判断、循环与跳转语句
java·开发语言
毕业设计70319 小时前
(免费领源码) SpringBoot 游戏交易平台17600-java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
java·spring boot·mysql·决策树·mybatis·idea·推荐算法
一 乐20 小时前
自习室座位预约管理系统|基于springboot + vue自习室座位预约管理系统(源码+数据库+文档)
java·vue.js·spring boot
溪语流沙20 小时前
Django + Vue电商项目第001讲:开篇|注册登录加增删改查,那不是电商
redis·python·mysql·docker·typescript·django·vue
此时不提桶,更待何时20 小时前
02-02-B-AQS与JUC锁面试与生产事故实战
java
音符犹如代码20 小时前
Kafka 接入 AI 的三条路线:MCP 提案、会话记忆与实时上下文
java·大数据·ai·kafka