Modern Architecture
& Coding Solutions

跨平台(Win/Linux/Mac)下用 Docker 部署 Spring Boot 的 3 种方式(附代码与图解)

💡 对于现代 Java 开发者而言,Docker 已经成为打包、分发和运行 Spring Boot 应用的标配工具。无论是在 Windows、Linux 还是 macOS 环境下,Docker 都提供了近乎一致的体验,让跨平台开发和部署变得轻松起来。本文将介绍三种最实用的部署方式:Dockerfile 手动构建Docker Compose 编排多服务、以及 Spring Boot Buildpacks 自动生成镜像。每种方式都会给出完整代码示例,并辅以原创图解,帮助你在生产或开发中做出合适选择。

⚠️ 前置条件: 请确保你的系统已安装并运行 Docker(Windows 建议使用 WSL2 后端,macOS 使用 Docker Desktop,Linux 使用 Docker Engine),并准备一个可运行的 Spring Boot 项目(本文以 Maven 项目为例,JDK 17+)。


一、方式一:基于 Dockerfile 手动构建镜像

这是最经典、最透明的方式。开发者编写一个 Dockerfile,定义基础镜像、复制 JAR 包、暴露端口和启动命令,然后通过 docker build 生成镜像并运行容器。

1.1 操作步骤

① 打包 Spring Boot 应用

在项目根目录执行:

“`bash
./mvnw clean package

成功后会在 target/ 目录下生成 *.jar 文件(如 demo-0.0.1-SNAPSHOT.jar)。

② 编写 Dockerfile
在项目根目录创建 Dockerfile,内容如下:

dockerfile

# 使用轻量级 JDK 基础镜像
FROM openjdk:17-jdk-slim

# 设置工作目录
WORKDIR /app

# 复制本地 JAR 到镜像内
COPY target/*.jar app.jar

# 暴露应用端口(与 application.properties 中一致)
EXPOSE 8080

# 容器启动时运行 Spring Boot 应用
ENTRYPOINT ["java", "-jar", "app.jar"]

③ 构建 Docker 镜像

bash

docker build -t my-spring-app:v1 .

④ 运行容器

bash

docker run -d -p 8080:8080 --name my-app my-spring-app:v1
  • -d:后台运行
  • -p 8080:8080:将宿主机 8080 端口映射到容器 8080 端口

⑤ 验证
访问 http://localhost:8080,看到 Spring Boot 默认页面或自定义接口返回内容即成功。

1.2 图解思路

图1:Dockerfile 部署流程图

1.3 优缺点分析

优点缺点
完全可控,镜像内容透明需要手动管理构建、运行、清理流程
可任意定制基础镜像和启动参数每次代码变更都要重复打包+构建镜像
适合简单应用或学习 Docker 原理多服务依赖时需额外脚本管理网络

二、方式二:Docker Compose 编排多服务

实际开发中,Spring Boot 应用往往依赖数据库(MySQL、PostgreSQL)、缓存(Redis)或消息队列。Docker Compose 允许你用一个 YAML 文件定义所有服务(app + db + cache),然后一条命令启动整个环境。

2.1 典型场景示例

假设我们的 Spring Boot 需要连接 MySQL 8.0,并在启动时通过环境变量注入数据库连接信息。

① 准备 Spring Boot 的 Dockerfile(与方式一相同,可复用)

② 编写 docker-compose.yml

yaml

version: '3.8'

services:
  # Spring Boot 应用服务
  app:
    build: .                     # 使用当前目录的 Dockerfile 构建
    ports:
      - "8080:8080"
    depends_on:
      - mysql
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/mydb?useSSL=false&allowPublicKeyRetrieval=true
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: secret
    restart: on-failure

  # MySQL 数据库服务
  mysql:
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: mydb
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      - mysql-data:/var/lib/mysql   # 持久化数据卷

volumes:
  mysql-data:

③ 一键启动所有服务

bash

docker-compose up -d

Docker Compose 会自动创建网络,让 app 容器通过服务名 mysql 访问数据库容器。Spring Boot 应用无需修改代码,只需通过环境变量覆盖数据库地址即可。

④ 查看日志与停止

bash

docker-compose logs -f app   # 跟踪应用日志
docker-compose down -v       # 停止并删除容器(包括数据卷)

2.2 结构示意图

图2:Docker Compose 多服务架构

这种模式非常接近生产环境的容器编排(Kubernetes 也使用类似的 Service 发现机制)。

2.3 何时选择 Docker Compose?

  • 项目需要数据库、Redis 等依赖服务
  • 多人协作时希望统一环境配置
  • 希望在 CI 中一键启动集成测试环境

三、方式三:Spring Boot Buildpacks(无需 Dockerfile)

Spring Boot 2.3 以上版本内置了对 Cloud Native Buildpacks 的支持。你不需要编写任何 Dockerfile,只需一条 Maven/Gradle 命令,就能自动生成一个优化过的 OCI 镜像。这种方式由 Paketo 团队维护,会智能分析应用依赖,分层打包(例如将 Spring Boot 的依赖库、应用类、资源文件分别放在不同层),显著减小镜像体积并加快启动速度。

3.1 一行命令生成镜像

使用 Maven

bash

./mvnw spring-boot:build-image -Dspring-boot.build-image.imageName=my-spring-bootpacks

使用 Gradle

bash

./gradlew bootBuildImage --imageName=my-spring-bootpacks

执行上述命令时,你会看到 Buildpacks 自动检测 JDK 版本、下载基础镜像、创建层并最终输出镜像名称。整个过程不需要本地安装 Dockerfile,但 Docker 守护进程必须运行(Buildpacks 会通过 Docker API 构建镜像)。

3.2 运行镜像

与普通 Docker 镜像一样:

bash

docker run -d -p 8080:8080 my-spring-bootpacks

3.3 镜像特色(与手动 Dockerfile 对比)

特性手动 DockerfileBuildpacks
基础镜像通常用 openjdk:xx-jdk-slimPaketo 优化的 Ubuntu Bionic 基础镜像,包含 CA 证书、时区等
层缓存需要手动分层(如先复制依赖再复制类)自动分层:依赖层、资源层、应用层
非 root 用户需要手动创建 cnb 用户默认以 cnb 非 root 用户运行,更安全
启动命令java -jar app.jar自动配置 JVM 内存、使用 -cp 方式启动,提升性能
构建速度每次全量复制 JAR利用层缓存,修改代码后只需重建应用层

3.4 图解 Buildpacks 工作流

图3:Buildpacks 自动分层机制

这种分层使得后续构建只上传变化的层,大幅提高 CI/CD 效率。

四、三种方式对比与选型建议

为了帮助你快速决策,下表总结了三种方式的适用场景:

维度DockerfileDocker ComposeBuildpacks
学习曲线低(需学指令)中(需理解编排)极低(一行命令)
定制程度极高高(可扩展多服务)低(需配置环境变量或 buildpack 配置)
多服务依赖需手动组网或脚本原生支持不直接支持,需结合 Compose
镜像优化依赖开发者经验同左自动最优分层 + 安全基线
典型用况生成环境基础镜像、教学演示本地开发测试、集成环境CI 流水线、快速原型

推荐组合拳

  • 开发阶段:使用 Buildpacks 快速迭代,改动代码后执行 mvn spring-boot:build-image 即可重建镜像。
  • 集成测试:使用 Docker Compose 拉起 DB + App,一次性验证前后端协作。
  • 生产发布:基于 Dockerfile 构建精简化镜像(如使用 alpine 或 distroless 基础镜像),并推送到私有镜像仓库。

五、跨平台环境特殊注意事项

虽然 Docker 在三大平台上表现高度一致,但由于底层机制差异,仍有以下细节需要留意:

5.1 Windows(Docker Desktop + WSL2)

  • 路径映射:Windows 使用 \ 作为路径分隔符,Docker 挂载卷时建议采用 /mnt/c/ 前缀访问 C 盘文件,或通过 docker volume 创建专用数据卷,避免路径兼容性问题。
  • 防火墙与端口:部分 Windows 防火墙策略可能干扰端口映射,若遇到容器启动后本地无法访问 localhost:8080,可检查 Docker Desktop 的网络设置或调整防火墙规则。
  • 小贴士:建议将项目代码放在 WSL2 文件系统内(如 /home/user/project),而不是 Windows 盘符下,以获得更好的文件监听和构建性能。

5.2 macOS(Intel 与 Apple Silicon 通用)

  • 资源限制:Docker Desktop 默认分配 2GB 内存,建议在 Preferences → Resources 中调整为 4GB 以上,避免 Spring Boot + MySQL 同时运行导致 OOM
  • 文件挂载性能:macOS 的 osxfs 文件共享机制较慢,建议将 JAR 包或代码目录使用 :delegated 选项提升性能,例如 -v "$PWD/target:/app:delegated"
  • 端口冲突:macOS 上常见的 8080 端口可能被 AirPlay 等应用占用,可通过 lsof -i :8080 查看,或更换映射端口如 -p 8081:8080
  • Apple Silicon 架构:M1/M2/M3 芯片使用 arm64 架构,若依赖的镜像仅提供 amd64 版本,Docker Desktop 会通过 Rosetta 2 模拟运行,性能有所损耗。建议优先拉取支持 arm64 的官方或第三方镜像。

5.3 Linux(原生 Docker 环境)

  • 用户权限:Linux 下 Docker 守护进程默认需要 sudo 权限,建议将当前用户加入 docker 组,避免每次执行命令都输入密码:bashsudo usermod -aG docker $USER newgrp docker
  • 存储驱动:Linux 原生支持多种存储驱动(overlay2 是当前推荐),无需额外配置。但如果使用 devicemapper,需留意默认 10GB 的存储池限制,必要时可调整。
  • systemd 与开机自启:生产环境建议启用 Docker 开机自启:bashsudo systemctl enable docker sudo systemctl start docker

5.4 通用建议

  • 镜像架构:如果你需要在混合架构环境(如 amd64 开发机 + arm64 服务器)中部署,推荐使用 docker buildx 构建多架构镜像。通过一个命令即可同时构建 linux/amd64 和 linux/arm64 两个版本,并推送到镜像仓库。
  • 行尾符差异:在 Windows 上编写 Dockerfile 或 Shell 脚本时,务必确保行尾符为 LF(Unix 格式),否则容器内运行可能报错 $'\r': command not found。VSCode 右下角点击 CRLF 可快速切换为 LF
  • 敏感信息:无论是哪个平台,都不要在 Dockerfile 或 docker-compose.yml 中硬编码密码或 API Key。推荐使用 .env 文件(Compose 自动读取)或 Docker Secret(Swarm 模式)来传递敏感环境变量。

总结

本文详细讲解了在 Windows、Linux 和 macOS 三个主流操作系统下,使用 Docker 部署 Spring Boot 的三种主流方式:

  • Dockerfile:最根本、最灵活,适合深度定制。
  • Docker Compose:管理多服务依赖,开发测试的利器。
  • Spring Boot Buildpacks:自动化、标准化,践行“约定优于配置”的理念。

无论你选择哪一种,核心目标都是让应用具备环境一致性、快速部署和可移植性。建议从 Dockerfile 开始理解底层原理,再逐步进阶到 Compose 和 Buildpacks,最终形成适合自己的跨平台工作流。

赞(1) 打赏
未经允许不得转载:MACS Dev Hub » 跨平台(Win/Linux/Mac)下用 Docker 部署 Spring Boot 的 3 种方式(附代码与图解)

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册