OpenJDK のコンテナイメージについて調べてみた

この記事は [NTTコムウェア AdventCalendar 2023](https://qiita.com/advent-calendar/2023/nttcomware) 11日目の記事です。

# はじめに
NTT コムウェアの坂本翔平です。普段は OpenJDK に関する技術支援や技術調査に従事しています。

コンテナ技術の普及に伴い、コンテナ環境で Java アプリケーションを動作させる機会も増えてきました。
しかし Java アプリケーションをコンテナ環境で動かすために都度 OpenJDK をコンテナ内で手動インストールするのは手間でした。

最近では OpenJDK の多くのディストリビューションベンダが、ビルドした OpenJDK をバンドルしたコンテナイメージを提供するようになりました。
そこで本記事ではそれらの OpenJDK のコンテナイメージについて、どういったものがあるのか簡単に調べた内容を紹介します。

:::note warn
本記事は 2023年11月頃 に確認した情報をベースに記載しています。
今後情報が更新され本記事に記載の内容と異なる点がでてくる可能性については予めご了承ください。
:::

# OpenJDK のコンテナイメージ
## Docker Hub から取得可能なイメージ
[Docker Hub](https://hub.docker.com/) にページが存在している OpenJDK のコンテナイメージについていくつか紹介します。
また各イメージの利用例として `java -version` の出力結果を示します。

:::note info
`java -version` の出力結果は利用している OpenJDK のディストリビューションベンダ毎に少し異なるので、出力結果から使用している OpenJDK ディストリビューションベンダを特定できる場合もあります。
:::

:::note info
提供 Java バージョンについては LTS （Long Term Support） バージョンのみ記載しています。
:::

---
### eclipse-temurin

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

Eclipse Temurin （旧 AdoptOpenJDK）は Adoptium コミュニティが提供している OpenJDK ディストリビューションです。
Eclipse Temurin については RedHat 社がサポートしており、提供するコンテナイメージのベース OS として UBI （Universal Base Image）があることが特徴の１つです。

```bash:イメージ利用例
$ 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 の URL | https://hub.docker.com/_/sapmachine |
| 提供ベースOS | Ubuntu |
| 提供形態 | JDK および JRE |
| 提供 Java バージョン| 11, 17, 21 |

SapMachine は SAP 社が提供している OpenJDK ディストリビューションです。
コンテナイメージはベース OS が Ubuntu であるイメージのみ利用できます。

```bash:イメージ利用例
$ 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)
```

---
### amazoncorretto

| 項目 | 内容 |
|:-:|:-|
| Docker Hub の URL | https://hub.docker.com/_/amazoncorretto |
| 提供ベースOS | Amazon Linux, Alpine, Debian |
| 提供形態 | JDK および JRE |
| 提供 Java バージョン| 8, 11, 17, 21 |

```bash:イメージ利用例
$ 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 は Amazon 社が提供している OpenJDK ディストリビューションです。
AWS の Linux ディストリビューションである Amazon Linux をベース OS とした OpenJDK コンテナイメージを提供していることが特徴の１つです。

---
### Microsoft Build of OpenJDK

| 項目 | 内容 |
|:-:|:-|
| Docker Hub の URL | https://hub.docker.com/_/microsoft-openjdk-jdk |
| 提供ベースOS | Ubuntu, 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 をベース OS とした OpenJDK コンテナイメージを提供していることが特徴の１つです。

```bash:イメージ利用例
$ 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)
```

---
### Zulu OpenJDK

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

Zulu OpenJDK は Azul Systems 社が提供している OpenJDK ディストリビューションです。
（コンテナイメージではないですが）最近では Java の起動高速化技術である CRaC（Coordinated Restore at Checkpoint） をサポートしたビルドをリリースしました。
様々な種類のベース OS の OpenJDK イメージを提供しています。

```bash:イメージ利用例
$ 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)
```

---
### Liberica JDK

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

Liberica JDK は BellSoft 社が提供している OpenJDK ディストリビューションです。
様々な種類のベース OS の OpenJDK イメージを提供しています。

```bash:イメージ利用例
$ 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` は下記の通りエラーでイメージは取得できませんでした。

```bash:docker pull 実行結果
$ 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` なるイメージが出てきました。  

```bash:docker search 実行結果
$ 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]
...
```

DESCRIPTION の最初に DEPRECATED （非推奨）とあるので現在では使われていなさそうです。
`java` イメージの Docker Hub のページがあるか確認してみると、以下の通り存在しました。
- https://hub.docker.com/_/java

このページによると、`java` イメージは非推奨となり 2016年12月31日以降は更新されなくなったようです。かなり古いイメージのようですね。
さらに、`java` の代わりのイメージとして次に確認しようとしていた `openjdk` イメージが案内されていました。
ということで `openjdk` イメージも存在するようです…

:::note
https://hub.docker.com/_/java は後述の `openjdk` のページへリダイレクトされる場合があります。その場合は [Docker Hub](https://hub.docker.com/) でキーワード `java` で検索すると該当ページがヒットするのでそちらから確認してください。
:::

### openjdk

前述の通り存在は確かになりましたが、確認してみます。
`docker pull openjdk` を実行すると、以下の通りイメージが取得できました。 

```bash:docker pull 実行結果
$ 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
```

取得したイメージを利用してみます。

```bash: イメージ利用例
$ 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](https://jdk.java.net/) の早期アクセスビルドのみ提供されるようになった
- 上記に伴い Java 18 の EOL と同時に `latest` タグ等の更新も終了した

`java` イメージの代替として案内されていた `openjdk` イメージも非推奨となっている点に注意が必要です。
OpenJDK のコンテナイメージは各ベンダから提供されているイメージを使いましょうということですね。

# おわりに
本記事では OpenJDK のコンテナイメージについて簡単に紹介しました。
様々なディストリビューションベンダからイメージが提供されているため、
利用する場合は要件に沿ったコンテナイメージを選択するようにしましょう。
また `java` や `openjdk` イメージは非推奨となっているので気をつけましょう。


記載されている会社名、製品名、サービス名は、各社の商標または登録商標です。