当前位置: 代码网 > it编程>编程语言>Java > springboot项目jar部署到docker的完整指南

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

2026年03月15日 Java 我要评论
一、基础 dockerfile 方式1. 准备 spring boot 项目确保 pom.xml中打包方式为 jar:<packaging>jar</packaging>2.

一、基础 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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com