核心在于构建可复用镜像、非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 和源码全塞进运行镜像,用两阶段分离编译与运行,显著减小体积和攻击面:
- 第一阶段用
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"
构建与运行时的关键操作
镜像不是写完就完事,构建和启动环节有几处必须检查:
立即学习“Java免费学习笔记(深入)”;
- 构建时加标签便于追踪:
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>输出路径 - 敏感配置(数据库密码等)绝不硬编码,用
-e DB_PASSWORD=xxx或 Docker secrets(Swarm/K8s 场景)


















