docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Springboot打包docker

Springboot打包docker的多种方法实现

作者:猩火燎猿

本文介绍了SpringBoot项目打包为Docker镜像的多种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、Spring Boot 打包 Docker 镜像的常用方法

方法一:传统 Dockerfile 构建

1. 先打包 jar

mvn clean package -DskipTests

会生成 target/demo-0.0.1-SNAPSHOT.jar

2. 编写 Dockerfile

在项目根目录新建 Dockerfile,内容如下:

# 选择基础镜像
FROM openjdk:17-jdk-alpine
# 设置工作目录
WORKDIR /app
# 复制 jar 包到容器
COPY target/demo-0.0.1-SNAPSHOT.jar app.jar
# 暴露端口
EXPOSE 8080
# 启动应用
ENTRYPOINT ["java", "-jar", "app.jar"]

3. 构建镜像

docker build -t my-springboot-app:1.0 .

4. 运行容器

docker run -d -p 8080:8080 my-springboot-app:1.0

方法二:使用 Spring Boot 2.3+ 内置的 buildpack

Spring Boot 2.3+ 内置了 Cloud Native Buildpacks 支持,无需写 Dockerfile。

1. 直接打镜像

./mvnw spring-boot:build-image -DskipTests
# 或
mvn spring-boot:build-image -DskipTests

2. 运行镜像

docker run -d -p 8080:8080 demo:0.0.1-SNAPSHOT

优点: 自动选择合适的基础镜像、JDK 版本,镜像安全、体积优化。

方法三:多阶段构建(推荐生产)

多阶段构建可极大减少镜像体积,提升安全性。

# 第一阶段:构建 jar
FROM maven:3.9.6-eclipse-temurin-17 AS build
WORKDIR /app
COPY . .
RUN mvn clean package -DskipTests

# 第二阶段:运行 jar
FROM openjdk:17-jdk-alpine
WORKDIR /app
COPY --from=build /app/target/demo-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

构建命令同上。

二、常用 Dockerfile 优化建议

三、常见问题与排查

问题解决办法
容器起不来/端口访问不到检查 Dockerfile 的 EXPOSE 和 docker run -p 配置
jar 路径不对COPY 路径与 jar 包名需对应
时区不对ENV TZ=Asia/Shanghai
配置文件未生效挂载配置目录或用 -Dspring.config.location
日志丢失用 docker logs 查看,或配置日志输出到控制台

四、最佳实践

五、Spring Boot + Dockerfile 完整示例

Dockerfile:

FROM openjdk:17-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENV JAVA_OPTS=""
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
EXPOSE 8080

构建命令:

mvn clean package -DskipTests
docker build -t my-springboot-app:1.0 .
docker run -d -p 8080:8080 my-springboot-app:1.0

六、Spring Boot Docker 镜像高级技巧

1. 环境变量与配置挂载

2. 健康检查与自恢复

3. JVM 参数优化

4. 非 root 用户运行

5. 多端口暴露

七、多环境(开发/测试/生产)镜像管理

八、与微服务、K8s 的集成建议

1. Kubernetes 部署 Spring Boot

2. 服务发现与配置中心

3. 日志与监控

九、常见容器化部署问题深度解析

问题原因与解决办法
容器内时区不对Dockerfile 设置 ENV TZ=Asia/Shanghai 或挂载宿主机时区文件
配置未生效/被覆盖优先级:命令行参数 > 环境变量 > 挂载文件 > 镜像内配置,建议用环境变量或挂载
内存溢出/OOMJVM 参数未限制,建议用 -Xmx 或 MaxRAMPercentage
日志丢失/查不到日志输出到容器内文件,建议输出到控制台或挂载日志目录
容器重启后数据丢失容器无状态,需挂载数据卷或用外部存储(如数据库、对象存储)
端口冲突/无法访问检查 Dockerfile 的 EXPOSE 与 docker run -p 参数是否一致

十、完整多阶段 Dockerfile 高级示例

# 构建阶段
FROM maven:3.9.6-eclipse-temurin-17 AS build
WORKDIR /app
COPY . .
RUN mvn clean package -DskipTests

# 运行阶段
FROM openjdk:17-jdk-alpine
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar

ENV TZ=Asia/Shanghai
ENV JAVA_OPTS="-Xms256m -Xmx512m"
EXPOSE 8080

HEALTHCHECK --interval=30s --timeout=5s --start-period=10s \
  CMD curl -f http://localhost:8080/actuator/health || exit 1

RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring

ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

十一、参考与扩展阅读

到此这篇关于Springboot打包docker的多种方法实现的文章就介绍到这了,更多相关Springboot打包docker内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文