Docker 部署spring boot
首先我们知道Java是在JVM上运行,然后就是springboot是一个Java开发框架,那么意味着springboot也是在JVM上进行
那么使用docker部署spring boot我们就很明确进行的步骤就是搭建一个运行环境(在docker中就是容器),其次就是我如何运行这个程序,显然我们需要打包我们的程序,目前行业通用做法是打包成war包和jar包
war包和jar包
特点 | JAR | WAR |
---|---|---|
目的 | Java 应用程序和库 | Web 应用程序 |
包含内容 | Java 类、资源、清单文件 | JSP、Servlet、HTML、CSS、JavaScript、配置文件、依赖项 |
目录结构 | 可以包含WEB-INF 目录,但不是必须的 | 必须包含WEB-INF 目录 |
部署 | 可执行的Java 应用程序 | 部署到Web 容器 |
命令示例 | jar cvf myapp.jar myapp | jar cvf myweb.war . |
Springboot中集成了Tomcat服务器,也就意味着在JRE运行环境中可以直接启动
通过docker-maven-plugin构建镜像
这里使用的是最为常用的maven构建,由spofity开源,具体可以看Github - docker-maven-plugin
步骤 | 操作内容 | 示例/说明 |
---|---|---|
1️⃣ | 添加插件依赖 | 在 pom.xml 的 <build> 部分添加 docker-maven-plugin 插件 |
2️⃣ | 编写 Dockerfile | 在项目根目录下创建 Dockerfile 文件 |
3️⃣ | 配置插件参数 | 设置镜像名、构建上下文、Dockerfile 路径等 |
4️⃣ | 构建项目并打包镜像 | 使用 mvn package docker:build 构建镜像 |
5️⃣ | 验证镜像是否构建成功 | 使用 docker images 查看 |
6️⃣ | 可选:推送到远程仓库 | 配置远程仓库地址,执行 docker:push |
目前我使用的是https://dmp.fabric8.io/
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.38.0</version>
<!-- 将 docker 镜像构建绑定到 package 阶段 -->
<executions>
<execution>
<id>build-image</id>
<phase>package</phase> <!-- 在 maven package 时执行 -->
<goals>
<goal>build</goal> <!-- 触发 docker 构建 -->
</goals>
</execution>
</executions>
<configuration>
<!-- 镜像名称(包含镜像名和版本) -->
<images>
<image>
<name>mall/xxx:${project.version}</name> <!-- eg: mall/xxx:1.0.0 -->
<build>
<!-- 基础镜像 -->
<from>openjdk:17</from>
<!-- 将本地编译后的 jar 包复制进镜像 -->
<assembly>
<descriptorRef>artifact</descriptorRef> <!-- 自动包含 target 目录下的主 jar -->
</assembly>
<!-- 容器启动命令入口 -->
<entryPoint>
<arg>java</arg>
<arg>-jar</arg>
<arg>-Dspring.profiles.active=prod</arg> <!-- 指定 spring 启动配置 -->
<arg>/maven/${project.build.finalName}.jar</arg> <!-- jar 包路径 -->
</entryPoint>
</build>
</image>
</images>
</configuration>
</plugin>
相关容器编排dockercompose
version: '3.8'
services:
# 应用服务(Spring Boot)
app:
image: mall/xxx:1.0.0 # 使用你通过 Maven 构建的镜像名
container_name: mall-app # 容器名称
restart: always # 当容器异常退出时自动重启
ports:
- "8080:8080" # 映射容器 8080 端口到宿主机
environment:
# JVM 启动参数(容器中生效,用于内存调优)
- JAVA_OPTS=-Xms512m -Xmx1024m -XX:+UseG1GC -XX:MaxMetaspaceSize=256m
# Spring Boot 的运行环境配置(可选)
- SPRING_PROFILES_ACTIVE=prod
# 设置容器的时区
- TZ=Asia/Shanghai
# 入口命令,使用环境变量中的 JVM 参数启动 jar 包
command: sh -c "java $JAVA_OPTS -jar /maven/xxx.jar"
depends_on:
- mysql # 依赖 mysql 服务,先启动
- redis # 依赖 redis 服务,先启动
# MySQL 数据库服务
mysql:
image: mysql:8.0
container_name: mall-mysql
restart: always
ports:
- "3306:3306" # 映射 MySQL 端口
environment:
MYSQL_ROOT_PASSWORD: root # MySQL root 密码
MYSQL_DATABASE: mall # 初始化数据库
TZ: Asia/Shanghai # 设置 MySQL 容器时区
volumes:
- mysql_data:/var/lib/mysql # 数据卷挂载,实现数据持久化
# Redis 缓存服务
redis:
image: redis:6.2
container_name: mall-redis
restart: always
ports:
- "6379:6379" # 映射 Redis 端口
volumes:
- redis_data:/data # Redis 数据持久化挂载
# 数据卷定义(用于持久化 MySQL 和 Redis 数据)
volumes:
mysql_data:
redis_data: