spring boot 微服务容器化核心是构建可执行 fat-jar 并基于其制作轻量 docker 镜像:先用 spring-boot-maven-plugin 打包含 boot-inf 的 jar,再通过多阶段 dockerfile(builder 编译 + jre 运行)构建镜像,最后以非 root 用户、环境变量、健康检查和外部配置方式安全运行容器。

Spring Boot 微服务用 Docker 容器化,核心是把应用打包成可运行的镜像,再启动为安全、可配置、可观测的容器。不需要改业务代码,重点在构建流程和运行约束上。
打包出可执行的 fat-jar
确保项目已启用 spring-boot-maven-plugin(Spring Boot 默认包含),它会把所有依赖打进一个 JAR:
- 执行
mvn clean package -DskipTests,生成文件在target/xxx.jar - 本地验证:运行
java -jar target/*.jar,能访问/actuator/health返回{"status":"UP"}即说明可执行性正常 - 检查 JAR 内部是否含
BOOT-INF/目录,这是 Spring Boot fat-jar 的标志
写生产级多阶段 Dockerfile
避免把 Maven、源码、JDK 全塞进最终镜像,用两阶段分离编译与运行:
- Builder 阶段用
maven:3.9-eclipse-temurin-17编译,加--mount=type=cache,target=/root/.m2加速依赖复用 - Runtime 阶段选轻量镜像,如
eclipse-temurin:17-jre-jammy或-alpine(注意 Alpine 的 glibc 兼容性) - 创建非 root 用户:
RUN adduser -S appuser && chown -R appuser:appuser /app,再USER appuser - COPY 构建产物:
COPY --from=builder /build/target/*.jar ./app.jar - 设环境变量:
ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms256m -Xmx512m" - 加健康检查:
HEALTHCHECK --interval=30s CMD curl -f http://localhost:8080/actuator/health || exit 1
构建与运行时的关键操作
镜像不是 build 完就结束,运行前需确认几件事:
- 构建时打标签并关联代码版本:
docker build -t user-service:1.0.0 --label "commit=$(git rev-parse HEAD)" . - 运行时暴露端口、注入 profile、挂载外部配置:
docker run -d -p 8080:8080 --name user-svc -e SPRING_PROFILES_ACTIVE=prod -v $(pwd)/config:/app/config user-service:1.0.0 - 日志建议挂载宿主机目录:
-v /var/log/user-svc:/app/logs,并在logback-spring.xml中指向logs/ - 查看启动日志:
docker logs -f user-svc,确认无Connection refused或ClassNotFoundException
后续可扩展方向
单服务跑通后,自然延伸到微服务协同:
- 用
docker-compose.yml编排多个服务(如 gateway + user + auth),统一网络和依赖顺序 - 配置中心(Config Server)或注册中心(Eureka/Nacos)也做成容器,通过
networks连通 - 接入 Kubernetes 时,镜像无需改动,只需补充 Deployment、Service、ConfigMap 等 YAML 资源定义
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











