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


相关推荐
丑八怪大丑11 小时前
Java范型
java·开发语言
加藤不太惠11 小时前
Nacos简单实用集群创建
java·开发语言·nacos
空中海11 小时前
第一篇:入门篇 — 认识 Spring Boot 与基础开发
java·spring boot·后端
RainCity11 小时前
Java Swing 自定义组件库分享(三)
java·笔记
凤凰院凶涛QAQ11 小时前
《C++转java快速入手系列》类与对象篇
java·开发语言·c++
Devin~Y11 小时前
大厂Java面试实录:Spring Boot/Cloud + Redis/Kafka + JWT + RAG/Agent(小Y翻车版)
java·spring boot·redis·spring cloud·kafka·spring security·jwt
Bat U11 小时前
JavaEE|多线程(六)
java·java-ee
胡利光11 小时前
Context Engineering 实战 02|System Prompt 是架构决策,不是写说明书
java·架构·prompt
sinat_2554878111 小时前
数组·学习笔记
java·javascript·笔记