Docker 与 Kubernetes 中的 Java 应用部署最佳实践核心概念Docker 与 Kubernetes 已经成为 Java 应用部署的标准环境它们提供了容器化、编排和管理的能力使得应用部署更加标准化、自动化和可伸缩。在 Docker 与 Kubernetes 中部署 Java 应用需要考虑容器化、资源配置、健康检查、日志管理等多个方面以确保应用的可靠性和性能。Docker 最佳实践1. Dockerfile 优化# 使用多阶段构建 FROM maven:3.9-eclipse-temurin-21 as builder WORKDIR /app COPY pom.xml . COPY src ./src RUN mvn clean package -DskipTests FROM eclipse-temurin:21-jre-alpine WORKDIR /app COPY --frombuilder /app/target/myapp.jar /app/app.jar # 设置环境变量 ENV JAVA_OPTS-XX:InitialRAMPercentage50 -XX:MaxRAMPercentage80 -XX:UseG1GC -XX:UnlockExperimentalVMOptions -XX:UseContainerSupport # 暴露端口 EXPOSE 8080 # 运行应用 CMD [sh, -c, java $JAVA_OPTS -jar /app/app.jar]2. 镜像管理使用官方基础镜像选择官方的 OpenJDK 或 Eclipse Temurin 镜像使用 Alpine 版本Alpine 镜像体积更小安全性更高指定具体版本避免使用 latest 标签确保构建的可重复性最小化镜像使用多阶段构建只包含必要的文件定期更新定期更新基础镜像修复安全漏洞3. 容器配置资源限制设置合理的 CPU 和内存限制健康检查配置容器的健康检查日志管理使用标准输出和标准错误便于日志收集环境变量使用环境变量配置应用避免硬编码Kubernetes 最佳实践1. 部署配置# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: myapp:latest ports: - containerPort: 8080 resources: requests: memory: 512Mi cpu: 500m limits: memory: 1Gi cpu: 1 livenessProbe: httpGet: path: /actuator/health/liveness port: 8080 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /actuator/health/readiness port: 8080 initialDelaySeconds: 10 periodSeconds: 5 env: - name: SPRING_PROFILES_ACTIVE value: production - name: DB_HOST value: mysql - name: DB_PORT value: 33062. 服务配置# service.yaml apiVersion: v1 kind: Service metadata: name: myapp spec: selector: app: myapp ports: - port: 80 targetPort: 8080 type: LoadBalancer3. 配置管理# configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: myapp-config data: application.yml: | spring: datasource: url: jdbc:mysql://${DB_HOST}:${DB_PORT}/myapp username: root logging: level: com.example: info # secret.yaml apiVersion: v1 kind: Secret metadata: name: myapp-secret type: Opaque data: database.password: cGFzc3dvcmQ api.key: YXBpLWtleQ4. 水平扩展# hpa.yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: myapp-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: myapp minReplicas: 3 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 80Java 应用配置1. 应用配置// 主应用类 SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } // 健康检查配置 Configuration public class HealthConfig { Bean public HealthIndicator databaseHealthIndicator(DataSource dataSource) { return new DatabaseHealthIndicator(dataSource); } Bean public HealthIndicator customHealthIndicator() { return new CustomHealthIndicator(); } } // 自定义健康检查 public class CustomHealthIndicator implements HealthIndicator { Override public Health health() { // 检查自定义健康状态 return Health.up().withDetail(status, healthy).build(); } }2. 日志配置# application.yml logging: level: root: info com.example: debug pattern: console: %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n file: name: /app/logs/myapp.log max-size: 10MB max-history: 7最佳实践容器化最佳实践使用多阶段构建最小化镜像体积资源配置根据应用需求设置合理的 CPU 和内存资源健康检查配置适当的存活和就绪探针配置管理使用 ConfigMap 和 Secret 管理配置和敏感信息水平扩展根据负载自动调整实例数量日志管理使用标准输出和标准错误集成日志收集系统监控配置应用监控及时发现和解决问题CI/CD建立持续集成和持续部署流程实际应用场景微服务部署在 Kubernetes 中部署多个微服务高可用应用通过多副本和健康检查确保应用高可用弹性伸缩根据负载自动调整资源DevOps 实践实现自动化部署和管理多环境部署在开发、测试、生产环境中统一部署流程注意事项镜像大小避免构建过大的 Docker 镜像启动时间优化 Java 应用的启动时间资源使用监控和优化资源使用情况安全考虑确保容器和应用的安全性版本管理合理管理镜像版本和标签网络配置配置适当的网络策略存储管理合理管理容器存储总结Docker 与 Kubernetes 为 Java 应用部署提供了强大的工具和平台通过遵循最佳实践可以构建更加可靠、弹性和可维护的应用系统。在实际开发中应该根据应用的特点和需求选择合适的部署策略确保应用的性能和可靠性。别叫我大神叫我 Alex 就好。这其实可以更优雅一点合理的 Docker 和 Kubernetes 配置让 Java 应用的部署变得更加标准化和自动化。