Skip to content

Java 17 Docker 镜像选择指南

问题背景

随着 Java 17 成为最新的 LTS(长期支持)版本,许多开发团队正在将微服务从 Java 11 迁移到 Java 17。在 Docker 环境中,之前常用的 openjdk:11-jre-slim 镜像(约 75MB)在 Java 17 中没有直接的对应版本,这给开发者带来了选择困难。

Java 17 Docker 镜像现状

重要提醒

切勿使用 openjdk:17- 系列镜像,因为这些镜像包含的是早期 JDK 17 构建版本,存在安全漏洞且已不再维护。官方已在 Docker Hub OpenJDK 页面发布了弃用通知。

推荐的 Java 17 镜像方案

1. Eclipse Temurin (推荐)

Eclipse Temurin 是 Adoptium 项目提供的开源 JDK 构建,是目前最受欢迎的选择:

dockerfile
# 使用 Alpine Linux 基础镜像 (约 50MB)
FROM eclipse-temurin:17-jre-alpine

# 或者使用 Ubuntu Jammy 基础镜像
FROM eclipse-temurin:17-jdk-jammy

优点

  • 官方推荐的标准实现
  • 提供 JRE 和 JDK 版本
  • 多种 Linux 发行版支持(Alpine、Ubuntu、CentOS)
  • 持续维护和安全性更新

2. Amazon Corretto

Amazon 提供的免费、多平台 OpenJDK 发行版:

dockerfile
FROM amazoncorretto:17.0.7-alpine

# 添加应用用户
ARG APPLICATION_USER=appuser
RUN adduser --no-create-home -u 1000 -D $APPLICATION_USER

# 配置工作目录
RUN mkdir /app && \
    chown -R $APPLICATION_USER /app

USER 1000

COPY --chown=1000:1000 ./myapp-0.0.1-SNAPSHOT.jar /app/app.jar
WORKDIR /app

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

3. Liberica JDK (BellSoft)

专为微服务优化的轻量级发行版:

dockerfile
FROM bellsoft/liberica-openjdk-alpine:17

优点

  • 极小的镜像尺寸
  • 针对微服务优化
  • Spring 团队推荐

镜像尺寸对比

以下是一些常见 Java 17 镜像的压缩后尺寸参考:

  • eclipse-temurin:17-jre-alpine:约 50MB
  • amazoncorretto:17-alpine:约 65MB
  • bellsoft/liberica-openjdk-alpine:约 55MB

完整 Dockerfile 示例

dockerfile
FROM eclipse-temurin:17-jre-alpine

# 设置工作目录
WORKDIR /app

# 复制 JAR 文件
COPY target/myapp.jar app.jar

# 设置非 root 用户
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring

# 暴露端口
EXPOSE 8080

# 启动应用
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
dockerfile
FROM amazoncorretto:17-alpine

WORKDIR /app
COPY target/myapp.jar app.jar

# 创建应用用户
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

构建和运行命令

构建 Docker 镜像:

bash
docker build -t my-java17-app .

运行容器:

bash
docker run -p 8080:8080 my-java17-app

停止容器:

bash
# 查看运行中的容器
docker ps

# 停止特定容器
docker stop <container_id>

选择建议

  1. 追求最小尺寸:选择 eclipse-temurin:17-jre-alpinebellsoft/liberica-openjdk-alpine
  2. 企业环境:选择 amazoncorretto:17-alpineeclipse-temurin:17-jre-focal
  3. 需要额外库支持:避免 Alpine 版本,选择 Ubuntu 或 CentOS 基础镜像

注意事项

安全提醒

始终使用特定版本标签而非 latest 标签,以确保镜像版本的一致性和安全性:

dockerfile
# 推荐
FROM eclipse-temurin:17.0.7_7-jre-alpine

# 不推荐
FROM eclipse-temurin:17-jre-alpine

定期更新基础镜像以获取安全补丁,并定期扫描镜像中的漏洞。

通过选择合适的 Java 17 Docker 镜像,您可以在保持安全性的同时获得优化的容器性能和最小的资源占用。