Skip to content

🐳 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

最后更新于: