Docker生产部署
目录
一、准备工作:理解 Docker 与 Spring Boot 的关系
1. Docker 是什么?
2. Spring Boot 为什么适合 Docker?
二、编写Dockerfile
三、配置管理
挂载外部配置文件
四、用 docker-compose 编排多服务
一、准备工作:理解 Docker 与 Spring Boot 的关系
1. Docker 是什么?
Docker 是一个容器化平台,可以把你的应用 + 依赖 + 运行环境打包成一个镜像,在任何支持 Docker 的机器上运行。
2. Spring Boot 为什么适合 Docker?
- 内嵌 Tomcat/Jetty,无需外部容器
- 打包成 fat jar,依赖自包含
- 配置灵活
- 启动快、资源轻,适合微服务架构
二、编写Dockerfile
在 Spring Boot 项目的根目录下,创建 Dockerfile
:
# 第一阶段:构建阶段(使用 Maven 镜像)
FROM maven:3.8.6-openjdk-17 AS builder
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests# 第二阶段:运行阶段(使用轻量 JRE 镜像)
FROM openjdk:17-jre-slim
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar# 创建非 root 用户(安全最佳实践)
RUN addgroup --system spring && adduser --system --ingroup spring spring
USER springEXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
构建镜像:
docker build -t campus-app:1.0 .
运行容器:
docker run -d -p 8080:8080 --name campus-app campus-app:1.0
三、配置管理
Spring Boot 支持多 profile,Docker 可通过环境变量或挂载配置文件实现灵活切换。
挂载外部配置文件
docker run -d \-p 8080:8080 \-v /path/to/application-prod.yml:/app/config/application.yml \--name campus-app \campus-app:1.0
Spring Boot 默认会加载 config/
目录下的配置文件,优先级高于 jar 包内配置。
四、用 docker-compose 编排多服务
真实项目往往不止一个服务 —— 还有 MySQL、Redis、Nginx 等。
创建 docker-compose.yml
:
version: '3.8'services:# Spring Boot 应用app:build: .ports:- "8080:8080"environment:- SPRING_PROFILES_ACTIVE=docker- DB_HOST=mysql- REDIS_HOST=redisdepends_on:- mysql- redisvolumes:- ./logs:/app/logsrestart: unless-stopped# MySQL 数据库mysql:image: mysql:8.0environment:MYSQL_ROOT_PASSWORD: root123MYSQL_DATABASE: campusports:- "3306:3306"volumes:- mysql_data:/var/lib/mysqlrestart: unless-stopped# Redis 缓存redis:image: redis:7-alpineports:- "6379:6379"restart: unless-stoppedvolumes:mysql_data:
启动整个环境:
docker-compose up -d
查看日志:
docker-compose logs -f app
一键启动完整开发/测试环境。
五、性能与安全优化
1. JVM 参数调优
在 Dockerfile 或启动命令中指定:
ENTRYPOINT ["java", "-XX:+UseZGC", "-Xmx512m", "-jar", "app.jar"]
2. 健康检查(Health Check)
在 docker-compose.yml 中添加:
healthcheck:test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]interval: 30stimeout: 10sretries: 3
3 日志与监控
挂载日志目录:volumes: - ./logs:/app/logs
使用 ELK 或 Loki + Grafana 收集日志
暴露 Prometheus 指标端点(/actuator/prometheus
),配合 Grafana 监控 JVM、HTTP 请求
启动流程与健康检查时序图