springboot多模块项目构建docker镜像

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),依次执行:compilepackage → 打包时跳过测试(必选,避免测试报错)

    • 快捷方式:在 IDEA 终端执行命令(根目录执行):

      bash 复制代码
      mvn 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"]

关键修改点:

  1. JDK 版本:如果你的项目是 JDK11,就改成 FROM openjdk:11-jdk-slim
  2. jar 包路径:COPY 本地路径 容器路径,本地路径一定要写对,是相对项目根目录的路径
  3. 暴露端口:必须和application.yml/application.properties中的server.port一致

文件 2:application.yml (SpringBoot 配置文件,核心修改:数据库 + Redis 地址)

核心注意 :本地开发时, MySQL/Redis 地址是localhost/127.0.0.1Docker 部署时必须修改为 mysqlredis(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

必改项:

  1. jdbc:mysql://mysql:3306 :地址必须是mysql,端口固定 3306
  2. redis.host: redis :地址必须是redis,端口固定 6379
  3. 数据库名、用户名、密码,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 对应):

  1. MYSQL_ROOT_PASSWORD:数据库密码,和 yml 中的数据库密码一致
  2. MYSQL_DATABASE:自动创建的数据库名,和 yml 中的数据库名一致
  3. REDIS_PASSWORD:Redis 密码,和 yml 中的 Redis 密码一致
  4. 端口映射:8080:8080 宿主机端口如果被占用,可以改成8090:8080

三、Windows 本地构建 Docker 镜像 + 导出镜像文件

步骤 1:Windows 下构建镜像

  1. 打开 Windows 的CMD 命令行 (或 IDEA 终端),进入SpringBoot 项目根目录(必须是有 Dockerfile 和 docker-compose.yml 的目录)

  2. 执行构建命令,构建 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个文件到该目录:

  1. springboot-app.tar :Windows 构建好的 SpringBoot 镜像包
  2. docker-compose.yml :编排文件(无需修改,和 Windows 的一致)
  3. application.yml :SpringBoot 配置文件(无需修改,和 Windows 的一致)
  4. 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
相关推荐
小北方城市网2 小时前
SpringBoot 集成消息队列实战(RabbitMQ/Kafka):异步通信与解耦,落地高可靠消息传递
java·spring boot·后端·python·kafka·rabbitmq·java-rabbitmq
stillaliveQEJ2 小时前
【项目实战】zookeeper+dubbo搭建分布式项目
spring boot·分布式·java-zookeeper
运维栈记2 小时前
k8s中部署rsyncd
docker·容器·kubernetes
JaguarJack2 小时前
PHP 8.5 闭包和一等可调用对象进入常量表达式
后端·php·服务端
芥子沫2 小时前
docker都没法访问了,都无法安装,镜像也不可以下载,还需要学习docker么
学习·docker
冷冷的菜哥2 小时前
go(golang)调用ffmpeg对视频进行截图、截取、增加水印
后端·golang·ffmpeg·go·音视频·水印截取截图
老友@2 小时前
Docker Nginx HTTPS 实战:Let’s Encrypt SSL 证书生成与自动续期
运维·nginx·docker·https·证书·ssl
短剑重铸之日2 小时前
《7天学会Redis》特别篇:Redis十大经典面试题2
数据库·redis·后端·缓存·架构
海南java第二人2 小时前
Quartz集群部署深度解析:多节点环境下如何避免定时任务重复执行?
spring boot·quartz·定时任务