
1. 为什么需要Docker部署Spring Boot应用在传统部署方式中开发团队经常面临在我机器上能跑的环境配置问题。Docker通过容器化技术将应用及其依赖打包成标准化单元从根本上解决了环境一致性问题。对于Spring Boot这类Java应用而言Docker部署能带来三个显著优势环境隔离每个容器拥有独立的文件系统、网络和进程空间避免端口冲突和依赖版本问题快速部署镜像一次构建即可在任何支持Docker的平台上运行CI/CD流程更加顺畅资源高效相比传统虚拟机容器共享主机OS内核内存占用更少启动速度更快实测Spring Boot应用容器启动仅需2-3秒2. 环境准备与工具选型2.1 基础环境配置推荐使用以下环境组合# 验证Docker环境 docker --version # 建议20.10 java -version # JDK11或17对于Windows/macOS用户Docker Desktop是最简单的选择。Linux用户可通过以下命令安装# Ubuntu示例 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io注意所有操作系统都需要在BIOS中开启虚拟化支持VT-x/AMD-V否则会遇到virtualisation support not detected错误。2.2 镜像构建工具选择对于Spring Boot项目推荐两种镜像构建方案方案优点适用场景Dockerfile JAR包构建简单分层明确单体应用快速部署Jib Maven插件无需Docker守护进程无docker环境CI/CD本教程将重点讲解第一种方案这是目前生产环境使用最广泛的方式。3. 项目改造与Dockerfile编写3.1 Spring Boot项目调整首先确保项目已正确配置spring-boot-maven-pluginbuild plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build执行打包命令生成可执行JARmvn clean package -DskipTests3.2 编写高效Dockerfile创建src/main/docker/Dockerfile文件# 第一阶段构建环境 FROM eclipse-temurin:17-jdk-jammy as builder WORKDIR /app COPY target/*.jar app.jar RUN java -Djarmodelayertools -jar app.jar extract # 第二阶段运行环境 FROM eclipse-temurin:17-jre-jammy WORKDIR /app COPY --frombuilder /app/dependencies/ ./ COPY --frombuilder /app/spring-boot-loader/ ./ COPY --frombuilder /app/application/ ./ ENTRYPOINT [java, org.springframework.boot.loader.JarLauncher]这个多阶段构建方案有三大优势最终镜像只包含JRE而非完整JDK体积缩小40%利用Spring Boot 2.3的分层特性构建缓存利用率提升各层依赖分离安全性更高4. 镜像构建与优化技巧4.1 基础构建命令docker build -t myapp:1.0 -f src/main/docker/Dockerfile .4.2 镜像优化实践通过以下方法优化镜像# 查看镜像分层 docker history myapp:1.0 # 常用优化手段 1. 使用.dockerignore文件排除无关文件 2. 合并RUN指令减少层数 3. 选择alpine基础镜像但需注意glibc兼容性典型优化前后的对比指标优化前优化后镜像大小487MB217MB构建时间2分18秒1分45秒安全漏洞12个3个5. 容器运行与生产部署5.1 基础运行命令docker run -d -p 8080:8080 \ -e SPRING_PROFILES_ACTIVEprod \ --name myapp \ myapp:1.05.2 生产级部署方案对于关键业务系统建议添加以下参数docker run -d \ --restartunless-stopped \ --memory1g \ --cpus2 \ --health-cmdcurl -f http://localhost:8080/actuator/health || exit 1 \ --health-interval30s \ myapp:1.05.3 日志管理方案推荐两种日志处理方式挂载卷方式docker run -v /path/to/logs:/app/logs ...日志驱动方式docker run --log-driverjson-file --log-opt max-size10m ...6. 常见问题排查指南6.1 启动失败排查# 查看容器日志 docker logs -f myapp # 进入容器调试 docker exec -it myapp bash6.2 典型问题解决方案问题现象可能原因解决方案端口已被占用主机端口冲突更改映射端口或停止占用程序内存不足OOMJVM内存参数未配置添加-e JAVA_OPTS-Xmx512m启动慢超过1分钟熵池不足安装haveged服务健康检查失败应用未配置actuator添加spring-boot-starter-actuator依赖7. 进阶部署方案7.1 使用Docker Compose创建docker-compose.ymlversion: 3.8 services: app: image: myapp:1.0 ports: - 8080:8080 environment: - SPRING_PROFILES_ACTIVEprod depends_on: redis: condition: service_healthy redis: image: redis:6 healthcheck: test: [CMD, redis-cli, ping]7.2 集群化部署建议对于微服务架构建议使用Docker Swarm或Kubernetes配置Spring Cloud Kubernetes实现配置中心外部化添加Prometheus监控我在实际项目中发现通过合理配置Docker的--memory-swap参数可以有效预防Java应用的OOM问题。另外Spring Boot 2.4对Docker支持有显著改进建议优先使用新版本。