对于现代 Java 开发者而言Docker 已经成为打包、分发和运行 Spring Boot 应用的标配工具。无论是在 Windows、Linux 还是 macOS 环境下Docker 都提供了近乎一致的体验让跨平台开发和部署变得轻松起来。本文将介绍三种最实用的部署方式Dockerfile 手动构建、Docker Compose 编排多服务、以及Spring Boot Buildpacks 自动生成镜像。每种方式都会给出完整代码示例并辅以原创图解帮助你在生产或开发中做出合适选择。⚠️前置条件请确保你的系统已安装并运行 DockerWindows 建议使用 WSL2 后端macOS 使用 Docker DesktopLinux 使用 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 镜像bashdocker build -t my-spring-app:v1 .④ 运行容器bashdocker 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 图解思路图1Dockerfile 部署流程图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.ymlyamlversion: 3.8 services:# Spring Boot 应用服务app: build: .# 使用当前目录的 Dockerfile 构建ports: - 8080:8080 depends_on: - mysql environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/mydb?useSSLfalseallowPublicKeyRetrievaltrue 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:③ 一键启动所有服务bashdocker-compose up -dDocker Compose 会自动创建网络让app容器通过服务名mysql访问数据库容器。Spring Boot 应用无需修改代码只需通过环境变量覆盖数据库地址即可。④ 查看日志与停止bashdocker-compose logs -f app# 跟踪应用日志docker-compose down -v# 停止并删除容器包括数据卷2.2 结构示意图图2Docker Compose 多服务架构这种模式非常接近生产环境的容器编排Kubernetes 也使用类似的 Service 发现机制。2.3 何时选择 Docker Compose项目需要数据库、Redis 等依赖服务多人协作时希望统一环境配置希望在 CI 中一键启动集成测试环境三、方式三Spring Boot Buildpacks无需 DockerfileSpring Boot 2.3 以上版本内置了对Cloud Native Buildpacks的支持。你不需要编写任何 Dockerfile只需一条 Maven/Gradle 命令就能自动生成一个优化过的 OCI 镜像。这种方式由 Paketo 团队维护会智能分析应用依赖分层打包例如将 Spring Boot 的依赖库、应用类、资源文件分别放在不同层显著减小镜像体积并加快启动速度。3.1 一行命令生成镜像使用 Mavenbash./mvnw spring-boot:build-image -Dspring-boot.build-image.imageNamemy-spring-bootpacks使用 Gradlebash./gradlew bootBuildImage --imageNamemy-spring-bootpacks执行上述命令时你会看到 Buildpacks 自动检测 JDK 版本、下载基础镜像、创建层并最终输出镜像名称。整个过程不需要本地安装 Dockerfile但 Docker 守护进程必须运行Buildpacks 会通过 Docker API 构建镜像。3.2 运行镜像与普通 Docker 镜像一样bashdocker run -d -p 8080:8080 my-spring-bootpacks3.3 镜像特色与手动 Dockerfile 对比特性手动 DockerfileBuildpacks基础镜像通常用 openjdk:xx-jdk-slimPaketo 优化的 Ubuntu Bionic 基础镜像包含 CA 证书、时区等层缓存需要手动分层如先复制依赖再复制类自动分层依赖层、资源层、应用层非 root 用户需要手动创建cnb用户默认以cnb非 root 用户运行更安全启动命令java -jar app.jar自动配置 JVM 内存、使用-cp方式启动提升性能构建速度每次全量复制 JAR利用层缓存修改代码后只需重建应用层3.4 图解 Buildpacks 工作流图3Buildpacks 自动分层机制这种分层使得后续构建只上传变化的层大幅提高 CI/CD 效率。四、三种方式对比与选型建议为了帮助你快速决策下表总结了三种方式的适用场景维度DockerfileDocker ComposeBuildpacks学习曲线低需学指令中需理解编排极低一行命令定制程度极高高可扩展多服务低需配置环境变量或 buildpack 配置多服务依赖需手动组网或脚本原生支持不直接支持需结合 Compose镜像优化依赖开发者经验同左自动最优分层 安全基线典型用况生成环境基础镜像、教学演示本地开发测试、集成环境CI 流水线、快速原型推荐组合拳开发阶段使用 Buildpacks 快速迭代改动代码后执行mvn spring-boot:build-image即可重建镜像。集成测试使用 Docker Compose 拉起 DB App一次性验证前后端协作。生产发布基于 Dockerfile 构建精简化镜像如使用alpine或distroless基础镜像并推送到私有镜像仓库。五、跨平台环境特殊注意事项虽然 Docker 在三大平台上表现高度一致但由于底层机制差异仍有以下细节需要留意5.1 WindowsDocker Desktop WSL2路径映射Windows 使用\作为路径分隔符Docker 挂载卷时建议采用/mnt/c/前缀访问 C 盘文件或通过docker volume创建专用数据卷避免路径兼容性问题。防火墙与端口部分 Windows 防火墙策略可能干扰端口映射若遇到容器启动后本地无法访问localhost:8080可检查 Docker Desktop 的网络设置或调整防火墙规则。小贴士建议将项目代码放在 WSL2 文件系统内如/home/user/project而不是 Windows 盘符下以获得更好的文件监听和构建性能。5.2 macOSIntel 与 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 docker5.4 通用建议镜像架构如果你需要在混合架构环境如 amd64 开发机 arm64 服务器中部署推荐使用docker buildx构建多架构镜像。通过一个命令即可同时构建linux/amd64和linux/arm64两个版本并推送到镜像仓库。行尾符差异在 Windows 上编写Dockerfile或 Shell 脚本时务必确保行尾符为LFUnix 格式否则容器内运行可能报错$\r: command not found。VSCode 右下角点击CRLF可快速切换为LF。敏感信息无论是哪个平台都不要在Dockerfile或docker-compose.yml中硬编码密码或 API Key。推荐使用.env文件Compose 自动读取或 Docker SecretSwarm 模式来传递敏感环境变量。总结本文详细讲解了在Windows、Linux 和 macOS三个主流操作系统下使用 Docker 部署 Spring Boot 的三种主流方式Dockerfile最根本、最灵活适合深度定制。Docker Compose管理多服务依赖开发测试的利器。Spring Boot Buildpacks自动化、标准化践行“约定优于配置”的理念。无论你选择哪一种核心目标都是让应用具备环境一致性、快速部署和可移植性。建议从 Dockerfile 开始理解底层原理再逐步进阶到 Compose 和 Buildpacks最终形成适合自己的跨平台工作流。来源跨平台Win/Linux/Mac下用 Docker 部署 Spring Boot 的 3 种方式附代码与图解-技术分享-MACS Dev Hub