核心在于构建可复用镜像、非root安全运行、环境可配置:先mvn clean package生成fat-jar,再用多阶段dockerfile(builder阶段编译,runtime阶段仅含jre并创建appuser用户),最后docker build加标签、run时暴露端口并挂载配置与日志。

Java Spring Boot 项目通过 Dockerfile 容器化部署微服务,核心在于“构建可复用镜像 + 非 root 安全运行 + 环境可配置”。不需要重写代码,关键在三步:打好 JAR 包、写对 Dockerfile、跑起来再调优。
确保项目已打包为可执行 JAR
Spring Boot 默认支持 fat-jar 打包,Maven 项目执行以下命令生成目标文件:
- mvn clean package -DskipTests(跳过测试加速构建)
- 确认输出路径为 target/your-app-name.jar(如 yudao-server/target/yudao-server.jar)
- 本地验证:直接
java -jar target/*.jar能正常启动并访问/actuator/health即可
编写生产级 Dockerfile(推荐多阶段)
避免把 JDK 和源码全塞进运行镜像,用两阶段分离编译与运行,显著减小体积和攻击面:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 第一阶段用
maven:3.9-eclipse-temurin-17编译,利用--mount=type=cache加速依赖下载 - 第二阶段用
eclipse-temurin:17-jre-alpine或-slim镜像,仅含 JRE - 务必创建非 root 用户(如
adduser -S appuser),并通过USER appuser切换运行身份 - COPY 构建产物时用通配符:
COPY --from=builder /build/target/*.jar ./app.jar - 设置必要环境变量:
ENV TZ=Asia/Shanghai、ENV JAVA_OPTS="-Xms256m -Xmx512m"
构建与运行时的关键操作
镜像不是写完就完事,构建和启动环节有几处必须检查:
- 构建时加标签便于追踪:
docker build -t user-service:1.0.0 --label "commit=$(git rev-parse HEAD)" . - 启动时暴露端口并传参:
docker run -d -p 8080:8080 --name user-svc -e SPRING_PROFILE=prod user-service:1.0.0 - 挂载配置更灵活:
-v $(pwd)/config:/app/config,让application-prod.yml外部可更新 - 加健康检查提升可观测性:
HEALTHCHECK --interval=30s CMD curl -f http://localhost:8080/actuator/health || exit 1
微服务场景下的实用补充
单个服务容器化只是起点,微服务集群需注意协同细节:
- 所有服务统一基础镜像版本(如都用 Temurin 17),避免 JVM 行为差异
- Dubbo 或 Nacos 注册中心地址用
spring.cloud.nacos.discovery.server-addr,通过docker network或宿主机 IP(host.docker.internal)打通 - 日志不落容器内:挂载
-v /var/log/user-svc:/app/logs,配合 Logback 的<file></file>输出路径 - 敏感配置(数据库密码等)绝不硬编码,用
-e DB_PASSWORD=xxx或 Docker secrets(Swarm/K8s 场景)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










