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