目錄
一、準備工作:理解 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 請求
啟動流程與健康檢查時序圖