“在我电脑上明明是好的啊!”
作为 Java 开发者,这句话可能已经成了我们的职业口头禅。为了终结环境配置的噩梦,Docker 化(Dockerization)早已成为标配。但你真的会写 Dockerfile 吗?
镜像动辄几百 MB,传输慢得像蜗牛?
JDK 8 想升 JDK 17,得把所有文件改一遍?
镜像里塞满了没用的源代码和构建工具?
今天分享一套 Java 项目 Docker 化的“生产级模板”,帮你实现:多阶段构建、官方 JRE 精简、版本一键切换。

01
核心思路:多阶段构建 (Multi-stage Build)
很多同学直接把整个 JDK 镜像当成运行环境,结果把源代码、Maven 缓存全打包进去了,这不仅臃肿还不安全。
我们的方案是:
构建阶段: 用完整的 JDK 镜像进行编译打包。
运行阶段: 只从构建阶段拿走
.jar文件,丢进轻量级的官方 JRE 镜像。
结果: 镜像体积直接缩减 50% 以上!
02
Dockerfile 万能模板
可以直接复制这段代码到项目根目录,命名为 Dockerfile。
# ==========================================# 阶段一:编译 (Build Stage)# ==========================================# 通过 ARG 定义 JDK 版本,默认 8,支持构建时修改ARG JDK_VERSION=8FROM maven:3.8.6-eclipse-temurin-${JDK_VERSION} AS buildWORKDIR /app# 利用 Docker 缓存:先复制 pom.xml 下载依赖COPY pom.xml .RUN mvn dependency:go-offline# 复制源码并执行打包COPY src ./srcRUN mvn clean package -DskipTests# ==========================================# 阶段二:运行 (Runtime Stage)# ==========================================# 默认使用轻量级 JRE 镜像ARG JRE_VERSION=8-jreFROM eclipse-temurin:${JRE_VERSION}WORKDIR /app# 只从第一阶段拷贝打好的 jar 包,拒绝多余垃圾COPY --from=build /app/target/*.jar app.jar# 环境变量优化ENV JAVA_OPTS="-Xmx512m -Xms256m -Djava.security.egd=file:/dev/./urandom"ENV TZ=Asia/ShanghaiEXPOSE 8080ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
03
使用 Docker Compose 优雅管理
有了 Dockerfile,我们还需要 docker-compose.yml 来快速启动和管理参数。
version: '3.8'services:my-java-service:build:context: .args:# 只要改这里,就能无缝切换 Java 8/11/17- JDK_VERSION=8- JRE_VERSION=8-jrecontainer_name: java-app-instanceports:- "8080:8080"volumes:- ./logs:/app/logsrestart: always
04
避坑指南与 Q&A
Q1:为什么用 eclipse-temurin 镜像?它是目前 Docker 官方推荐的镜像,基于 OpenJDK,比已经停止维护的 openjdk 官方镜像更稳定、更新更快。
Q2:如何切换到 Java 17?非常简单!在 docker-compose.yml 里的 args 部分,将 8 改为 17,将 8-jre 改为 17-jre,然后重新构建即可。
Q3:这样打出来的包真的有 JRE 吗?是的。通过 FROM eclipse-temurin:8-jre,我们直接拉取了官方预装好 JRE 的环境,你不需要再手动安装 Java。
一个优雅的 Dockerfile 应该像一件艺术品:职责清晰、身材苗条、适应力强。
夜雨聆风