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


相关推荐
秋天的怀念_David9 分钟前
第二十二夜 · 数字迷雾
java·程序人生·算法
Raas10022 分钟前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
niucloud-admin1 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
霸道流氓气质1 小时前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
captain3762 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
心中有你02142 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
步行cgn3 小时前
Spring MVC + Thymeleaf 模板解析失败:从 500 错误到页面正常显示
java·spring·mvc
lgcgkCQ3 小时前
【AI 转型实战 1】SpringAI 入门:搭建基础大模型对话能力
java·ai·agent·rag·spring ai·mcp·langchain4j
Wang's Blog4 小时前
Java 项目实战:交友项目 - 用户体系集成总结
java·开发语言·交友
学到老活到老4 小时前
第 24 集:配置文件写了 80,Spring Boot 为什么读到 90?
java·后端·spring