我对OpenJDK容器镜像进行了调查

这篇文章是NTT Comware Advent Calendar 2023的第11天的文章。

首先

我是NTT Comware的坂本翔平。平时从事OpenJDK技术支援和技术研究工作。

随着容器技术的普及,我们有更多机会在容器环境中运行Java应用程序。
然而,每次在容器中手动安装OpenJDK以运行Java应用程序是相当麻烦的事情。

最近,许多OpenJDK发行商开始提供打包了OpenJDK的容器镜像。本文将简要介绍这些OpenJDK容器镜像的种类和内容。

本文章是基于2023年11月左右确认的信息撰写的。
请预先了解,随着信息的更新,本文所提及的内容可能会有所变动。

OpenJDK的容器映像

可以从Docker Hub获取的映像

以下是关于在Docker Hub上存在的OpenJDK容器镜像的一些介绍。
同时展示了每个镜像的使用示例,包括java -version的输出结果。

由於不同的OpenJDK發行者,java -version的輸出結果可能略有不同,可能可以通過輸出結果來確定正在使用的OpenJDK發行者。
我们只提供 Java LTS(长期支持)版本的记录。

日食-泰穆琳

項目内容Docker Hub の URLhttps://hub.docker.com/_/eclipse-temurin提供ベースOSAlpine, CentOS, ubi9-minimal(RHEL), Ubuntu, Windows提供形態JDK および JRE提供 Java バージョン8, 11, 17, 21

Eclipse Temurin(AdoptOpenJDK 的旧版)是由 Adoptium 社区提供的 OpenJDK 发行版。
Eclipse Temurin 受到 RedHat 公司的支持,并且其提供的容器映像的基本操作系统是 UBI(Universal Base Image),这是其特点之一。

$ docker run -it --rm eclipse-temurin:17-jdk java -version
openjdk version "17.0.9" 2023-10-17
OpenJDK Runtime Environment Temurin-17.0.9+9 (build 17.0.9+9)
OpenJDK 64-Bit Server VM Temurin-17.0.9+9 (build 17.0.9+9, mixed mode, sharing)

sapmachine – 树液机器

項目内容Docker Hub の URLhttps://hub.docker.com/_/sapmachine提供ベースOSUbuntu提供形態JDK および JRE提供 Java バージョン11, 17, 21

SapMachine是由SAP公司提供的OpenJDK发行版。
仅可使用基于Ubuntu操作系统的容器镜像。

$ docker run -it --rm sapmachine:17-jdk-ubuntu java -version
openjdk version "17.0.9" 2023-10-17 LTS
OpenJDK Runtime Environment SapMachine (build 17.0.9+0-LTS)
OpenJDK 64-Bit Server VM SapMachine (build 17.0.9+0-LTS, mixed mode, sharing)

亚马逊 Corretto

項目内容Docker Hub の URLhttps://hub.docker.com/_/amazoncorretto提供ベースOSAmazon Linux, Alpine, Debian提供形態JDK および JRE提供 Java バージョン8, 11, 17, 21
$ docker run -it --rm amazoncorretto:17 java -version
openjdk version "17.0.9" 2023-10-17 LTS
OpenJDK Runtime Environment Corretto-17.0.9.8.1 (build 17.0.9+8-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.9.8.1 (build 17.0.9+8-LTS, mixed mode, sharing)

Amazon Corretto是由亚马逊提供的OpenJDK发行版。它提供了以AWS Linux发行版Amazon Linux为基础操作系统的OpenJDK容器映像,这是它的一个特点。


Microsoft构建的OpenJDK

項目内容Docker Hub の URLhttps://hub.docker.com/_/microsoft-openjdk-jdk提供ベースOSUbuntu, CBL Mariner(1.0 / 2.0 / 2.0 Distroless)提供形態JDK のみ提供 Java バージョン11, 17, 21 (CBL Mariner 2.0 系のみ 8 も提供)

Microsoft Build of OpenJDK 是由Microsoft提供的OpenJDK分发版本。
其中一个特点是它提供了基于Microsoft开发的免费开源Linux分发版本CBL Mariner为基础操作系统的OpenJDK容器镜像。

$ docker run -it --rm mcr.microsoft.com/openjdk/jdk:17-ubuntu java -version
openjdk version "17.0.9" 2023-10-17 LTS
OpenJDK Runtime Environment Microsoft-8552009 (build 17.0.9+8-LTS)
OpenJDK 64-Bit Server VM Microsoft-8552009 (build 17.0.9+8-LTS, mixed mode, sharing)

祖鲁开放JDK

項目内容Docker Hub の URLhttps://hub.docker.com/r/azul/zulu-openjdk (Ubuntu)提供ベースOSUbuntu, Alpine, CentOS, Debian, Distroless提供形態JDK および JRE提供 Java バージョン8, 11, 17, 21

Zulu OpenJDK 是由Azul Systems提供的OpenJDK发行版。最近,他们发布了支持Java启动加速技术CRaC(Coordinated Restore at Checkpoint)的版本(不只是容器镜像)。他们提供了各种类型的基于不同操作系统的OpenJDK镜像。

$ docker run -it --rm azul/zulu-openjdk:17 java -version
openjdk version "17.0.9" 2023-10-17 LTS
OpenJDK Runtime Environment Zulu17.46+19-CA (build 17.0.9+8-LTS)
OpenJDK 64-Bit Server VM Zulu17.46+19-CA (build 17.0.9+8-LTS, mixed mode, sharing)

露琪卡JDK

項目内容Docker Hub の URLhttps://hub.docker.com/r/bellsoft/liberica-openjdk-debian (Debian)提供ベースOSDebian, Alpine, CentOS, Alpaquita Linux(container), Windows Server提供形態JDK のみ提供 Java バージョン8, 11, 17, 21

Liberica JDK 是由BellSoft公司提供的OpenJDK发行版本。它提供了适用于各种操作系统的OpenJDK镜像。

$ docker run -it --rm bellsoft/liberica-openjdk-debian:17 java -version
openjdk version "17.0.9" 2023-10-17 LTS
OpenJDK Runtime Environment (build 17.0.9+17-LTS)
OpenJDK 64-Bit Server VM (build 17.0.9+17-LTS, mixed mode)

其他(附言)

我对是否存在名为java或openjdk的容器镜像感到好奇,所以我进行了一番调查。

Java是一种广泛使用的编程语言。

执行命令docker pull java时遇到以下错误,无法获取镜像。

$ docker pull java
Using default tag: latest
Error response from daemon: manifest for java:latest not found: manifest unknown: manifest unknown

为了确认一下,我试着在 Docker search 中查找,发现有很多获得了很多 STARS 的名为 “java” 的镜像。

$ docker search java
NAME                               DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
node                               Node.js is a JavaScript-based platform for s…   13086     [OK]
tomcat                             Apache Tomcat is an open source implementati…   3610      [OK]
java                               DEPRECATED; use "openjdk" (or other JDK impl…   1998      [OK]
...

由于在说明中标有“已弃用”,所以似乎目前不再使用。
在Docker Hub的java镜像页面上进行确认后,发现如下所示确实存在。

    https://hub.docker.com/_/java

根据这个页面,Java镜像已经被标记为弃用,从2016年12月31日开始将不再更新。这似乎是相当陈旧的镜像。
另外,作为替代Java的镜像,我将进一步查看openjdk镜像。
因此,openjdk镜像也存在…

如果在https://hub.docker.com/_/java 无法找到页面,则可能会重定向到后面提到的 openjdk 页面。在这种情况下,在Docker Hub中使用关键字“java”进行搜索,可以找到相关页面并进行确认。

开放JDK

我已经确认了之前提到的存在,现在我要确认一下。
当我执行 docker pull openjdk 命令时,成功获取到了以下的镜像。

$ docker pull openjdk
Using default tag: latest
latest: Pulling from library/openjdk
197c1adcd755: Pull complete
57b698b7af4b: Pull complete
95a27dbe0150: Pull complete
Digest: sha256:9b448de897d211c9e0ec635a485650aed6e28d4eca1efbc34940560a480b3f1f
Status: Downloaded newer image for openjdk:latest
docker.io/library/openjdk:latest

我将尝试利用已获取的图像。

$ docker run -it --rm openjdk java -version
openjdk version "18.0.2.1" 2022-08-18
OpenJDK Runtime Environment (build 18.0.2.1+1-1)
OpenJDK 64-Bit Server VM (build 18.0.2.1+1-1, mixed mode, sharing)

我已经执行了,但是Java 18 不是LTS版本,也不是最新版本。
因为之前使用docker pull命令获取的是openjdk:latest版本,所以Java 18 是最新版本这一点让人感到不协调。

于是我查看了OpenJDK镜像的Docker Hub页面。

    https://hub.docker.com/_/openjdk

总结该页内容如下。

openjdk イメージはセキュリティ上の問題から非推奨となった
2022年7月以降は jdk.java.net の早期アクセスビルドのみ提供されるようになった
上記に伴い Java 18 の EOL と同時に latest タグ等の更新も終了した

需要注意的是,作为Java图像的替代选择,OpenJDK图像也已被视为不推荐使用。这意味着我们应该使用各供应商提供的OpenJDK容器图像。

最后

本文简要介绍了OpenJDK容器镜像。
由于来自各种发行商的镜像都可用,因此在使用时请根据需求选择相符的容器镜像。
此外,Java和OpenJDK镜像已不推荐使用,请注意。

所载公司名称、产品名称、服务名称均为各公司的商标或注册商标。

bannerAds