Windows 构建 SpringBoot 多模块项目 Docker 镜像 (含 MySQL5.7+Redis) + Linux 部署完整教程
前置条件说明
核心前提:Windows 必须安装 Docker Desktop (已开启),Linux 服务器必须安装 Docker + Docker Compose(缺一不可)
构建流程
1、Windows 本地开发环境 打包 SpringBoot 多模块项目;
2、编写 Docker 配置 → 构建完整 Docker 镜像
3、将镜像传输到Linux 服务器 ;
4、Linux 上一键启动 (Java+MySQL5.7+Redis 全套环境)。
一、Windows 环境前置准备(必做)
1. 安装并配置 Docker Desktop
- 下载地址:Docker Desktop 官方下载,安装后默认下一步即可
- 关键配置:安装完成后,右键 Docker 图标 → Settings → General ,勾选「Use the WSL 2 based engine」(WSL2 是 Windows 运行 Docker 的最优方式)
- 启动 Docker:双击桌面 Docker 图标,等待状态栏变成 Docker Desktop running 即启动成功
2. SpringBoot 多模块项目打包成可执行 Jar 包
重点:多模块项目打包规则
SpringBoot 多模块一般分为:父模块、公共依赖模块(common)、业务核心模块(service)、启动模块(web/admin),只有「启动模块」需要打包成可执行 jar 包,其他模块会被 maven 自动打入依赖。
打包操作(IDEA 中执行,最便捷)
-
打开 IDEA,进入你的 SpringBoot 多模块项目根目录
-
打开右侧「Maven」窗口,先点击 clean 清理历史打包文件
-
找到启动模块 (例如
xxx-web/xxx-admin),依次执行:compile→package→ 打包时跳过测试(必选,避免测试报错)-
快捷方式:在 IDEA 终端执行命令(根目录执行):
bashmvn clean package -Dmaven.test.skip=true
-
-
打包成功后,jar 包位置:
启动模块/target/xxx-0.0.1-SNAPSHOT.jar(xxx 为你的项目名,后缀是.jar) -
验证 jar 包有效性(关键):在 jar 包所在目录打开 cmd,执行
java -jar xxx-0.0.1-SNAPSHOT.jar,能正常启动 SpringBoot 项目即打包无误
二、核心文件编写(Windows 项目根目录创建,3 个文件,缺一不可)
在 SpringBoot 项目根目录(注意:不是模块目录,是最外层父目录),新建以下 3 个文件,文件名必须完全一致,内容直接复制修改即可。
文件 1:Dockerfile (构建 SpringBoot 应用镜像的核心,无后缀)
bash
# 基础镜像:指定JDK版本,推荐和你本地开发的JDK一致(例如JDK8)
FROM openjdk:8-jdk-slim
# 维护者信息(可选)
MAINTAINER your-name <your-email>
# 容器内创建工作目录
WORKDIR /app
# 复制 Windows本地打包好的jar包 到 容器的/app目录下
# 【重点修改】:左侧是你的jar包真实路径(启动模块/target/xxx.jar),右侧固定为 app.jar 即可
COPY ./xxx-web/target/xxx-0.0.1-SNAPSHOT.jar /app/app.jar
# 暴露SpringBoot项目的端口 【重点修改】:改为你的项目端口,例如8080、9090
EXPOSE 8080
# 容器启动时执行的命令:运行jar包
ENTRYPOINT ["java", "-Xms256m","-Xmx512m","-XX:+UseG1GC","-jar", "/app/app.jar"]
关键修改点:
- JDK 版本:如果你的项目是 JDK11,就改成
FROM openjdk:11-jdk-slim - jar 包路径:
COPY 本地路径 容器路径,本地路径一定要写对,是相对项目根目录的路径 - 暴露端口:必须和
application.yml/application.properties中的server.port一致
文件 2:application.yml (SpringBoot 配置文件,核心修改:数据库 + Redis 地址)
核心注意 :本地开发时, MySQL/Redis 地址是localhost/127.0.0.1,Docker 部署时必须修改为 mysql 和 redis(Docker Compose 中服务名就是域名,自动解析)
XML
server:
port: 8080 # 和Dockerfile的EXPOSE一致
spring:
# 数据库配置 - 地址改为 mysql
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql:3306/你的数据库名?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false
username: root # 自定义,和docker-compose.yml中的MYSQL_ROOT_PASSWORD一致
password: 123456 # 自定义,和docker-compose.yml中的MYSQL_ROOT_PASSWORD一致
# Redis配置 - 地址改为 redis
redis:
host: redis
port: 6379
password: 123456 # 自定义,和docker-compose.yml中的REDIS_PASSWORD一致
database: 0
timeout: 3000ms
# mybatis-plus配置(如果用了,没有则删除)
mybatis-plus:
mapper-locations: classpath:mapper/**/*.xml
type-aliases-package: com.xxx.entity
configuration:
map-underscore-to-camel-case: true
必改项:
jdbc:mysql://mysql:3306:地址必须是mysql,端口固定 3306redis.host: redis:地址必须是redis,端口固定 6379- 数据库名、用户名、密码,Redis 密码,必须和下文
docker-compose.yml中的配置一一对应
文件 3:docker-compose.yml (一键编排:SpringBoot+MySQL5.7+Redis,重中之重)
该文件是核心中的核心 ,可以实现:一条命令启动 SpringBoot 应用、MySQL5.7 容器、Redis 容器 ,并自动创建网络、挂载数据卷、配置依赖关系,3 个服务无缝通信,文件无后缀,内容如下:
XML
version: '3.8' # Docker Compose版本,兼容绝大多数Docker环境,可省略该行
services:
# 1. MySQL5.7 服务
mysql:
image: mysql:5.7 # 固定MySQL5.7镜像,无需修改
container_name: mysql-5.7
restart: always # 开机自启,容器挂了自动重启
environment:
# 核心配置,必须和application.yml中的数据库配置一致
MYSQL_ROOT_PASSWORD: 123456 # 数据库root密码
MYSQL_DATABASE: test-db # 自动创建该数据库,无需手动建库
MYSQL_INITDB_SKIP_TZINFO: '1'
ports:
- "3306:3306" # 宿主机端口:容器端口,Linux本地可以通过3306连接数据库
volumes:
# 数据持久化:将MySQL的数据目录挂载到宿主机,容器删除数据不丢失
- ./mysql-data:/var/lib/mysql
networks:
- app-network
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
# 2. Redis 服务
redis:
image: redis:latest # Redis最新稳定版
container_name: redis-server
restart: always
environment:
# 核心配置,必须和application.yml中的Redis配置一致
REDIS_PASSWORD: 123456 # Redis密码
ports:
- "6379:6379"
volumes:
# Redis数据持久化
- ./redis-data:/data
networks:
- app-network
command: redis-server --requirepass 123456 --appendonly yes
# 3. SpringBoot 应用服务
springboot-app:
build: . # 关键:在当前目录下构建Dockerfile,生成镜像
container_name: springboot-app
restart: always
ports:
- "8080:8080" # 宿主机端口:容器端口,访问项目用这个端口
depends_on:
- mysql # 依赖mysql,先启动mysql再启动项目
- redis # 依赖redis,先启动redis再启动项目
networks:
- app-network
# 自定义网络:让3个服务在同一个网络中,互相通信
networks:
app-network:
driver: bridge
必改项(全部要和 application.yml 对应):
MYSQL_ROOT_PASSWORD:数据库密码,和 yml 中的数据库密码一致MYSQL_DATABASE:自动创建的数据库名,和 yml 中的数据库名一致REDIS_PASSWORD:Redis 密码,和 yml 中的 Redis 密码一致- 端口映射:
8080:8080宿主机端口如果被占用,可以改成8090:8080
三、Windows 本地构建 Docker 镜像 + 导出镜像文件
步骤 1:Windows 下构建镜像
-
打开 Windows 的CMD 命令行 (或 IDEA 终端),进入SpringBoot 项目根目录(必须是有 Dockerfile 和 docker-compose.yml 的目录)
-
执行构建命令,构建 SpringBoot 应用镜像(自定义镜像名,例如
springboot-multi-app):docker build -t springboot-multi-app:v1 .- 命令说明:
-t指定镜像名和版本,点号:.表示 Dockerfile 在当前目录 - 执行成功标志:最后一行显示
Successfully built xxxxxxxx
- 命令说明:
步骤 2:验证镜像是否构建成功
执行命令查看本地镜像,能看到springboot-multi-app:v1即成功:
bash
docker images
或使用Docker desktop查看
注意:通常情况下,本地生成镜像,推送到Docker Hub,但由于服务器上拉取个人或公司私人private image,需登录Docker Hub,个人尝试了多次都不能登录成功,更不用说拉取镜像了,因此这里我选择将本地生成的镜像导出为tar,操作步骤:
步骤 3:将镜像导出为 tar 包(用于传输到 Linux,核心)
Docker 镜像无法直接复制,需要导出为压缩包,执行命令:
bash
docker save -o springboot-app.tar springboot-multi-app:v1
- 执行后,在项目根目录会生成一个
springboot-app.tar文件,这就是你的项目镜像包 - 补充:如果需要导出 MySQL/Redis 镜像,无需操作,Linux 上执行 docker-compose 会自动拉取
四、Linux 服务器前置准备
安装 Docker和Docker compose,如果安装的是新版Docker,会自动内置安装Docker compose,无需单独安装。可使用下面的命令进行验证:
bash
docker compose version
如果输出版本号,则表明已内置安装了docker compose
注意,独立安装和内置安装的docker compose命令会有所不同:
bash
# 独立安装需使用带横线的命令,可能存在兼容性BUG
docker-compose up -d
docker-compose ps
docker-compose down
docker-compose logs -f
# 内置插件,无横线,无BUG)
docker compose up -d
docker compose ps
docker compose down
docker compose logs -f
由于我采用的是内置安装docker compose,所以需要使用无短横线的命令,下同,不再单独说明。
五、Linux 服务器部署
步骤 1:上传文件到 Linux
在 Linux 服务器上创建一个部署目录(例如 /usr/local/springboot-app),然后上传以下 4个文件到该目录:
springboot-app.tar:Windows 构建好的 SpringBoot 镜像包docker-compose.yml:编排文件(无需修改,和 Windows 的一致)application.yml:SpringBoot 配置文件(无需修改,和 Windows 的一致)- init-mysql.sql:数据库脚本,Springboot容器启动过程中读数据库表,需提前将表结构导进去
修改docker-compose.yml,主要修改2处地方:
1、修改mysql配置:挂载初始化脚本 + 持久化MySQL数据
bash
mysql:
image: mysql:5.7
container_name: mysql57
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: test-db
MYSQL_USER: demo
MYSQL_PASSWORD: demo
TZ: Asia/Shanghai
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./docker/mysql/init:/docker-entrypoint-initdb.d/init-mysql.sql
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
主要是在volumes:添加这一行:
bash
- ./docker/mysql/init:/docker-entrypoint-initdb.d/init-mysql.sql
/docker-entrypoint-initdb.d/ 是 MySQL 容器的官方初始化目录,放在这个目录的.sql脚本会在容器第一次启动时自动执行,防止springboot容器启动报「库/表不存在」问题!
2.修改Springboot应用镜像构建:
原代码:
XML
springboot-app:
build: . # 关键:在当前目录下构建Dockerfile,生成镜像
由于我们在window下生成镜像,并把镜像tar传到服务器,这里直接使用镜像即可,不用再重新build了
bash
springboot-app:
# 去掉这一行
build: .
# 替换为这一行
image: springboot-app:v1
将镜像名称和版本换成自己的,可以在windows上查看相关信息。
步骤 2:Linux 导入 SpringBoot 镜像
进入部署目录(例如 /usr/local/springboot-app),执行导入命令:
bash
docker load -i springboot-app.tar
- 导入成功后,执行
docker images能看到springboot-multi-app:v1镜像
步骤 3:一键启动所有服务(SpringBoot+MySQL5.7+Redis)
终极命令,一行搞定,在部署目录执行:
bash
docker compose up -d
命令说明:
up:启动所有服务-d:后台运行(守护进程),不会占用终端- 首次启动会自动拉取 MySQL5.7 和 Redis 镜像,耐心等待即可(后续启动不会重复拉取)
步骤 4:验证部署结果
bash
# 1. 查看所有容器运行状态,3个容器都是 Up 状态即成功
docker compose ps
# 2. 查看SpringBoot项目日志,确认项目启动成功(无报错)
docker compose logs springboot-app
# 3. 查看Linux端口监听,8080/3306/6379端口都在监听
netstat -tulpn | grep -E "8080|3306|6379"
六、访问项目 + 常用运维命令
访问项目
在浏览器 / Postman 中访问:http://Linux服务器IP:8080/接口路径例如:http://192.168.1.100:8080/api/user/list
常用运维命令(Linux 中执行)
Go
# 1. 查看所有服务日志(排错首选)
docker compose logs -f
# 2. 单独查看SpringBoot日志
docker compose logs -f springboot-app
# 3. 停止所有服务(不删除容器和数据)
docker compose stop
# 4. 重启所有服务
docker-compose restart
# 5. 停止并删除所有容器(数据不会丢失,因为挂载了数据卷)
docker compose down
# 6. 进入MySQL容器,连接数据库
docker exec -it mysql-5.7 mysql -uroot -p123456
# 7. 进入Redis容器,连接Redis
docker exec -it redis-server redis-cli -a 123456