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


相关推荐
智购科技无人售货机工厂店6 分钟前
玻璃瓶饮料破损率突然上升,排查发现是取货口缓冲垫老化了~YH
java·开发语言·人工智能·python·eclipse
镜象科技15 分钟前
中小学AI心理健康解决方案服务商怎么选?2026年选型参考
android·java·人工智能
Pocker_Spades_A15 分钟前
Penpot自托管设计协作:Docker部署、MCP接入与Codex生成UI实操记录
ui·docker·容器
阿狗童鞋21 分钟前
高并发系统设计实战指南
java·spring boot·spring cloud
Sam_Deep_Thinking26 分钟前
CountDownLatch实现原理
java·后端·面试·程序员
小狼Solar28 分钟前
SAP MDG 功能范围说明(基于S/4HANA 2025)
java·开发语言
范中勤29 分钟前
Python 与 Java:模块、包、对象、反射核心差异总结
java·python·面试·反射·元类
ab12376831 分钟前
Spring Integration 完整笔记 + 和 spring-integration-mqtt、Paho、EMQX 的关系
java·笔记·spring
小蜗牛狂飙记36 分钟前
java环境一键配置和切换的ui工具
java
逆光的July40 分钟前
可靠消息投递与消费的工程设计:Outbox、幂等、死信兜底
java