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


相关推荐
Dicky-_-zhang3 小时前
消息队列Kafka/RocketMQ选型与高可用架构:从单体到100万TPS的演进
java·jvm
晨曦中的暮雨3 小时前
4.15腾讯 CSIG云服务产线 一面
java·开发语言
fake_ss1983 小时前
AI时代学习全栈项目开发的新范式
java·人工智能·学习·架构·个人开发·学习方法
茉莉玫瑰花茶3 小时前
工作流的常见模式 [ 1 ]
java·服务器·前端
未若君雅裁4 小时前
Spring AOP、日志切面与声明式事务原理
java·后端·spring
米高梅狮子4 小时前
第2章 docker容器
运维·docker·云原生·容器·架构·kubernetes·自动化
No8g攻城狮4 小时前
【人大金仓】wsl2+ubuntu22.04安装人大金仓数据库V9
java·数据库·spring boot·非关系型数据库
xiaoerbuyu12334 小时前
开源Java 邮箱 基于SpringBoot+Vue前后端分离的电子邮件
java·开发语言
C+++Python5 小时前
C++ 进阶学习完整指南
java·c++·学习