加油
努力

云平台上部署Spring Boot应用该选什么镜像?

在云平台上部署 Spring Boot 应用时,选择合适的镜像是非常关键的。以下是常见的几种选择和推荐策略,帮助你做出最佳决策:


✅ 1. 官方 OpenJDK 镜像(基础推荐)

  • 镜像名称eclipse-temurin:17-jreeclipse-temurin:11-jre
  • 推荐理由
    • Eclipse Temurin 是 AdoptOpenJDK 的继任者,被广泛认可为生产环境的标准。
    • 提供 JRE(更小)或 JDK(适合调试)版本。
    • 被多数云平台(如 AWS、GCP、Azure)支持。
FROM eclipse-temurin:17-jre

COPY target/myapp.jar /app.jar

ENTRYPOINT ["java", "-jar", "/app.jar"]

⚠️ 注意:避免使用 openjdk:8-jre 等已停止维护的镜像。


✅ 2. Distroless 镜像(安全 & 轻量推荐)

  • 镜像名称gcr.io/distroless/java17-debian11
  • 特点
    • 极简操作系统层,仅包含运行 Java 所需的库。
    • 安全性高(无 shell、无包管理器),减少攻击面。
    • 更适合生产环境。
FROM gcr.io/distroless/java17-debian11

COPY target/myapp.jar /app.jar

# 使用非 root 用户(可选增强安全)
USER nonroot:nonroot

ENTRYPOINT ["java", "-jar", "/app.jar"]

🌐 注意:由于没有 shell,调试困难,建议用于成熟项目。


✅ 3. Amazon Corretto / Microsoft Build of OpenJDK(特定云厂商优化)

  • 如果你使用 AWS:amazoncorretto:17-alpine
  • 如果你使用 Azure:mcr.microsoft.com/openjdk/jdk:17-alpine

这些镜像经过云厂商优化,性能更好,且有长期支持(LTS)。


✅ 4. Alpine Linux 基础镜像(轻量化)

  • 镜像名称eclipse-temurin:17-jre-alpine
  • 优点
    • 镜像体积小(~60MB vs ~300MB)。
  • 注意
    • Alpine 使用 musl libc,某些 JNI 依赖可能不兼容。
    • 推荐用于简单应用。
FROM eclipse-temurin:17-jre-alpine

RUN apk add --no-cache tzdata  # 如需时区支持

COPY target/myapp.jar /app.jar

ENTRYPOINT ["java", "-jar", "/app.jar"]

❌ 不推荐使用的镜像

  • openjdk:8-jre:已过时,缺乏更新。
  • java:8:已被弃用,不应再使用。
  • tomcat + WAR 部署方式(除非必须):Spring Boot 推荐使用内嵌 Tomcat 的 JAR 方式。

✅ 最佳实践建议

场景 推荐镜像
生产环境,注重安全 gcr.io/distroless/java17-debian11
通用生产/开发 eclipse-temurin:17-jre
节省空间,简单应用 eclipse-temurin:17-jre-alpine
AWS 环境 amazoncorretto:17
Azure 环境 mcr.microsoft.com/openjdk/jdk:17

🔧 额外建议

  1. 使用多阶段构建 减少最终镜像大小:

    FROM eclipse-temurin:17-jdk AS builder
    COPY . .
    RUN ./mvnw clean package -DskipTests
    
    FROM eclipse-temurin:17-jre
    COPY --from=builder target/myapp.jar /app.jar
    ENTRYPOINT ["java", "-jar", "/app.jar"]
  2. 设置非 root 用户 提升安全性。

  3. 添加健康检查(适用于 Kubernetes):

    HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 
      CMD curl -f http://localhost:8080/actuator/health || exit 1

总结

推荐首选
👉 eclipse-temurin:17-jre(平衡性最好)
👉 gcr.io/distroless/java17-debian11(追求极致安全与轻量)

根据你的云平台、合规要求和运维能力选择最合适的镜像即可。

云服务器