🐳 Docker 与 Kubernetes 云原生实践
本章节提供 Spring Boot 应用从 Docker 镜像构建到 Kubernetes 集群部署的完整指南。
📦 Docker 最佳实践
高效 Dockerfile 示例
使用 多阶段构建 (Multi-stage Build) 减小镜像体积,复用层缓存。
dockerfile
# 第一阶段:构建
FROM maven:3.9-eclipse-temurin-17 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline # 预下载依赖
COPY src ./src
RUN mvn package -DskipTests
# 第二阶段:运行
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
# 修正时区
RUN apk add --no-cache tzdata && \
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
# 从 builder 阶段复制构建产物
COPY --from=builder /app/target/*.jar app.jar
# 使用 exec 模式启动,接收 OS 信号
ENTRYPOINT ["java", "-jar", "app.jar"]Docker Compose 开发环境
一键拉起应用及其依赖(MySQL, Redis)。
yaml
version: '3.8'
services:
app:
build: .
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/mydb
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:☸️ Kubernetes (K8s) 部署要点
探针配置 (Liveness/Readiness)
K8s 依赖探针判断 Pod 健康状态。利用 Actuator 端点:
yaml
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 15
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080资源限制 (Resource Limits)
必须设置 Request 和 Limit,防止 Java 应用 OOM 或饿死其他进程。
yaml
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "1000m"注意:需配合 JVM 参数 -XX:MaxRAMPercentage=75.0 让 JVM 感知容器内存限制。
ConfigMap 外部化配置
将 application.yml 挂载为 ConfigMap,解耦配置与镜像。
yaml
volumeMounts:
- name: config-volume
mountPath: /app/config
readOnly: true