springboot项目jar部署到docker的完整指南

 更新时间:2026年03月15日 09:08:21   作者:每日技术  
这篇文章主要为大家详细介绍了springboot项目jar部署到docker的完整指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

一、基础 Dockerfile 方式

1. 准备 Spring Boot 项目

确保 pom.xml中打包方式为 jar:

<packaging>jar</packaging>

2. 创建 Dockerfile

在项目根目录创建 Dockerfile(无后缀):

# 第一阶段:构建应用
FROM maven:3.8.6-openjdk-11 AS builder

WORKDIR /app

# 复制 pom.xml 并下载依赖(利用缓存)
COPY pom.xml .
RUN mvn dependency:go-offline

# 复制源代码并打包
COPY src ./src
RUN mvn package -DskipTests

# 第二阶段:运行环境
FROM openjdk:11-jre-slim

WORKDIR /app

# 从构建阶段复制 jar 文件
COPY --from=builder /app/target/*.jar app.jar

# 暴露端口(Spring Boot 默认 8080)
EXPOSE 8080

# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]

3. 构建和运行

# 构建镜像
docker build -t my-spring-app .

# 运行容器
docker run -d -p 8080:8080 --name spring-app my-spring-app

# 查看日志
docker logs -f spring-app

二、优化版 Dockerfile(生产推荐)

# 使用更小的基础镜像
FROM eclipse-temurin:17-jre-alpine AS runtime

# 设置环境变量
ENV SPRING_PROFILES_ACTIVE=prod \
    JAVA_OPTS="-Xms512m -Xmx1024m"

# 创建非 root 用户(安全最佳实践)
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring

# 设置工作目录
WORKDIR /app

# 只复制 jar 文件(减少层大小)
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
    CMD wget --no-verbose --tries=1 --spider http://localhost:8080/actuator/health || exit 1

EXPOSE 8080

ENTRYPOINT exec java $JAVA_OPTS -jar app.jar

三、使用 Docker Compose 部署

docker-compose.yml

version: '3.8'
services:
  spring-app:
    build: .
    container_name: spring-boot-app
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - JAVA_OPTS=-Xms512m -Xmx1024m
    volumes:
      # 日志持久化
      - ./logs:/app/logs
    healthcheck:
      test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/actuator/health"]
      interval: 30s
      timeout: 10s
      retries: 3
    restart: unless-stopped
  # 可选:添加数据库
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root123
      MYSQL_DATABASE: mydb
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    restart: unless-stopped
volumes:
  mysql-data:

常用命令

# 构建并启动
docker-compose up -d --build

# 查看状态
docker-compose ps

# 查看日志
docker-compose logs -f spring-app

# 停止服务
docker-compose down

# 停止并删除数据卷
docker-compose down -v

四、使用 Jib 插件(无需 Dockerfile)

Maven 配置 (pom.xml)

<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>jib-maven-plugin</artifactId>
    <version>3.3.2</version>
    <configuration>
        <from>
            <image>eclipse-temurin:17-jre-alpine</image>
        </from>
        <to>
            <image>my-registry/my-spring-app:${project.version}</image>
        </to>
        <container>
            <mainClass>com.example.demo.DemoApplication</mainClass>
            <ports>
                <port>8080</port>
            </ports>
            <environment>
                <SPRING_PROFILES_ACTIVE>prod</SPRING_PROFILES_ACTIVE>
            </environment>
        </container>
    </configuration>
</plugin>

构建命令

# 构建并推送到远程仓库
mvn compile jib:build

# 构建本地 Docker 镜像
mvn compile jib:dockerBuild

五、Kubernetes 部署示例

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: spring-app
  template:
    metadata:
      labels:
        app: spring-app
    spec:
      containers:
      - name: spring-app
        image: my-registry/my-spring-app:latest
        ports:
        - containerPort: 8080
        env:
        - name: SPRING_PROFILES_ACTIVE
          value: "k8s"
        resources:
          requests:
            memory: "512Mi"
            cpu: "500m"
          limits:
            memory: "1Gi"
            cpu: "1000m"
        livenessProbe:
          httpGet:
            path: /actuator/health/liveness
            port: 8080
          initialDelaySeconds: 60
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /actuator/health/readiness
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: spring-app-service
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: spring-app

六、常见问题解决

问题解决方案
时区不正确在 Dockerfile 中添加 ENV TZ=Asia/Shanghai并安装 tzdata
中文乱码添加 JVM 参数 -Dfile.encoding=UTF-8
配置文件不生效使用 docker cp复制配置文件或挂载 volume
内存占用过高调整 JAVA_OPTS,使用 -XX:+UseContainerSupport

到此这篇关于springboot项目jar部署到docker的完整指南的文章就介绍到这了,更多相关springboot jar部署docker内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IDEA版最新MyBatis程序配置教程详解

    IDEA版最新MyBatis程序配置教程详解

    这篇文章主要介绍了IDEA版最新MyBatis程序配置教程详解,需要的朋友可以参考下
    2020-07-07
  • java xml转为json的n种方法

    java xml转为json的n种方法

    本文给大家分享java xml转为json的两种方法,每种方法通过实例代码给大家介绍的非常详细,小编感觉第一种方法要比第二种方法好些,具体实现代码跟随小编一起看看吧
    2021-08-08
  • SpringMVC ajax请求的处理方法介绍

    SpringMVC ajax请求的处理方法介绍

    Ajax即异步的 JavaScript和XML,是一种无需重新加载整个网页的情况下,能够更新部分模块的网页技术,下面这篇文章主要给大家介绍了关于SpringMVC Ajax请求的处理,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • Idea 编译并运行 Spark 3.1.1 源码的方法

    Idea 编译并运行 Spark 3.1.1 源码的方法

    这篇文章主要介绍了Idea 编译并运行 Spark 3.1.1源码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-11-11
  • IDEA2022性能优化的一些设置技巧

    IDEA2022性能优化的一些设置技巧

    这篇文章主要介绍了IDEA2022性能优化的一些设置,需要的朋友可以参考下
    2022-08-08
  • java string的一些细节剖析

    java string的一些细节剖析

    首先说明这里指的是Java中String的一些细节部分,需要的朋友可以参考
    2012-11-11
  • Java循环嵌套详解及经典列题

    Java循环嵌套详解及经典列题

    这篇文章主要给大家介绍了关于Java循环嵌套详解及经典列题,包括循环嵌套的结构、变量作用域、不同类型循环的嵌套等,通过示例和经典练习题,展示了如何使用循环嵌套解决实际问题,需要的朋友可以参考下
    2024-12-12
  • Java实现批量修改txt文件名称的方法示例

    Java实现批量修改txt文件名称的方法示例

    这篇文章主要介绍了Java实现批量修改txt文件名称的方法,结合实例形式分析了Java针对目录文件遍历及文件读写、属性操作等相关实现技巧,需要的朋友可以参考下
    2019-03-03
  • IntelliJ IDEA进行远程调试(Remote Debugging)的操作教程

    IntelliJ IDEA进行远程调试(Remote Debugging)的操作教程

    远程调试(Remote Debugging)是指在本地开发环境(如 IntelliJ IDEA)中,连接并调试运行在远程机器(如测试服务器、预发环境、生产服务器、Docker 容器、Kubernetes Pod 等)上的 Java 应用程序,本文给大家介绍了IntelliJ IDEA进行远程调试的操作教程
    2025-11-11
  • VsCode搭建Java开发环境的方法

    VsCode搭建Java开发环境的方法

    这篇文章主要介绍了VsCode搭建Java开发环境的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11

最新评论