核心在于打好jar包、写对多阶段dockerfile、构建并安全运行:先mvn clean package生成fat-jar,再用builder/runtime两阶段镜像分离编译与运行,创建非root用户appuser,最后docker build加标签、run时暴露端口、挂载配置与日志。

直接用 Docker 把 Spring Boot 应用容器化,核心就三件事:打好 JAR 包、写对 Dockerfile、构建并跑起来。不需要改业务代码,重点在打包方式和镜像设计。
先打出可执行的 fat-jar
Spring Boot 默认支持一键打包成内嵌 Tomcat 的可运行 JAR。确保 pom.xml 中有 spring-boot-maven-plugin,然后执行:
-
mvn clean package -DskipTests(跳过测试,加快构建) - 检查
target/目录下生成了类似myapp-1.0.0.jar的文件 - 本地验证:
java -jar target/myapp-1.0.0.jar能正常启动,并能访问/actuator/health
写一个生产可用的 Dockerfile
别用带 JDK 的大镜像直接运行,推荐多阶段构建——编译归编译,运行归运行:
- 第一阶段(builder):用
maven:3.9-eclipse-temurin-17编译源码,利用缓存加速依赖下载 - 第二阶段(runtime):用
eclipse-temurin:17-jre-alpine或-slim镜像,只装 JRE - 创建非 root 用户:
RUN adduser -S appuser && chown -R appuser:appuser /app,再USER appuser - COPY JAR 时用通配符:
COPY --from=builder /build/target/*.jar ./app.jar - 设环境变量:
ENV TZ=Asia/Shanghai、ENV JAVA_OPTS="-Xms256m -Xmx512m"
构建镜像并安全启动
构建不是终点,启动时的参数决定了是否真正可用:
- 构建加标签和元信息:
docker build -t user-service:1.2.0 --label "commit=$(git rev-parse HEAD)" . - 运行时暴露端口、指定 profile:
docker run -d -p 8080:8080 --name user-svc -e SPRING_PROFILES_ACTIVE=prod user-service:1.2.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 行为不一致
- Nacos 或 Eureka 地址别写死,用
spring.cloud.nacos.discovery.server-addr,通过host.docker.internal或自建docker network打通网络 - 日志别留在容器里:
-v $(pwd)/logs:/app/logs,配合 Logback 按天滚动 - 若用 Dubbo,确保序列化协议和注册中心地址在容器环境下仍可达
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











