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 构建,是目前最受欢迎的选择:
# 使用 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 发行版:
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)
专为微服务优化的轻量级发行版:
FROM bellsoft/liberica-openjdk-alpine:17
优点:
- 极小的镜像尺寸
- 针对微服务优化
- Spring 团队推荐
镜像尺寸对比
以下是一些常见 Java 17 镜像的压缩后尺寸参考:
eclipse-temurin:17-jre-alpine
:约 50MBamazoncorretto:17-alpine
:约 65MBbellsoft/liberica-openjdk-alpine
:约 55MB
完整 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"]
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 镜像:
docker build -t my-java17-app .
运行容器:
docker run -p 8080:8080 my-java17-app
停止容器:
# 查看运行中的容器
docker ps
# 停止特定容器
docker stop <container_id>
选择建议
- 追求最小尺寸:选择
eclipse-temurin:17-jre-alpine
或bellsoft/liberica-openjdk-alpine
- 企业环境:选择
amazoncorretto:17-alpine
或eclipse-temurin:17-jre-focal
- 需要额外库支持:避免 Alpine 版本,选择 Ubuntu 或 CentOS 基础镜像
注意事项
安全提醒
始终使用特定版本标签而非 latest
标签,以确保镜像版本的一致性和安全性:
# 推荐
FROM eclipse-temurin:17.0.7_7-jre-alpine
# 不推荐
FROM eclipse-temurin:17-jre-alpine
定期更新基础镜像以获取安全补丁,并定期扫描镜像中的漏洞。
通过选择合适的 Java 17 Docker 镜像,您可以在保持安全性的同时获得优化的容器性能和最小的资源占用。