Java 11 リリース後のオススメ Docker イメージを考える
Java 11 がリリースされてはや 1 ヶ月が経ち、また Java 8 のサポート終了を数カ月後に控えたいま、Java 11 以降の Docker イメージとしてどれを選ぶべきなのかを考えてみます。
はじめに
周知の事実のとおり、Java 11 のリリースに伴って JDK のリリースモデルが新しいものに完全移行 となり、Oracle から提供される LTS の JDK (いわゆる Oracle JDK) は有償サポートとなりました。
Java 11 以降もこれまで通り Oracle JDK を使い続けたいということであればその費用さえ支払えば事は済むわけですが、業務利用ならいざ知らず、個人で提供しているサービスなどで Java を利用する場合だとその費用の支払いに躊躇してしまうことかと思われます。そういうわけで、Java 11 以降の JDK の選択はちょっとばかり悩ましい状況になっているわけですが、これは Java の Docker イメージを選択するのも同じことが言えます。
このエントリでは、現時点で Java 11 以降の Docker イメージにどのようなものが存在するのか、そしてそれらのうち、どれを選ぶのがよいのかについて考えていきます。
関連エントリ: 最適な Java の Docker イメージを選びたい
Docker イメージの選択肢
Java 11 以降の JDK そのものについては先人達がすでに良質なまとめをしてくださっているので、そちらをぜひご覧ください。
以降、Docker Hub のリポジトリごとに見ていきます。
Docker 公式レポジトリの OpenJDK
Docker 公式レポジトリの OpenJDK には、Java 11 だけで多様な Docker イメージが登録されています。そのベースイメージは Debian, Oracle Linux, Windows と、相変わらず豊富に取り揃えられています。それぞれのベースイメージと JDK/JRE の組み合わせごとに、代表的なタグを以下に列挙しておきます。
ベースイメージ | JDK | JDK (slim) | JRE | JRE (slim) |
---|---|---|---|---|
Debian | 11 |
11-slim |
11-jre |
11-jre-slim |
Oracle Linux | 11-oracle |
- | - | - |
Windows (2016 LTSC) | 11-windowsservercore-ltsc2016 |
- | - | - |
Windows (1709) | 11-windowsservercore-1709 |
- | - | - |
Windows (1803) | 11-windowsservercore-1803 |
- | - | - |
Debian をベースイメージとする Docker イメージは JDK に留まらず、JRE のみのイメージや slim パッケージのイメージも提供されています。いずれにおいても、Debian がビルドした JDK/JRE を利用しています。
Oracle Linux をベースイメージとする Docker イメージには、Oracle がビルドした OpenJDK が含まれています。当然のことながら、この OpenJDK のビルドは LTS ではありません。また、JRE のみの Docker イメージは用意されていません。
Windows はよくわからないのと興味がないのでパス、です。
なお early access の Java 12 以降になるのですが、Alpine Linux をベースイメージとする Docker イメージ が提供されるようです。この Docker イメージには Oracle ビルドの OpenJDK が使われています。
AdoptOpenJDK
AdoptOpenJDK は Java のバージョンごとに Docker Hub のリポジトリが分離されており、Java 11 以降だと以下の 2 つのリポジトリが存在しています。
前者は HotSpot の JVM 実装、後者は Eclipse OpenJ9 の JVM 実装に基づく OpenJDK の Docker イメージになります。Eclipse OpenJ9 は 現時点では jmap
や jstack
などの診断ツールをサポートしていない ため、Oracle の JDK に慣れ親しんでいる場合は、前者の (HotSpot の) イメージを利用するのが望ましいように思います。
ベースイメージはいずれも Ubuntu と Alpine Linux の両方が用意されています。また、どちらのベースイメージでも、イメージサイズを削減した slim イメージが提供されています。
- ベースイメージ: Ubuntu
- JDK:
latest
- JDK (slim):
slim
- JDK:
- ベースイメージ: Alpine Linux
- JDK:
alpine
- JDK (slim):
alpine-slim
- JDK:
なお現時点 (10/29) では、slim ではない方の JDK の Ubuntu のベースイメージが 18.04 ではなく古いバージョンの 16.04 のままとなっていることに注意が必要です。とは言えども、GitHub の issue を見る限りでは 18.04 への移行の準備が進んでいるので、じきに 18.04 のベースイメージに切り替わるものと考えられます。
イメージサイズを比較する
さて、Docker 公式の OpenJDK 各種イメージと AdoptOpenJDK の各種イメージについて、そのイメージサイズを以下の Ruby スクリプトで確認してみましょう (Eclipse OpenJ9 の JDK は除いています)。
IMAGES = %w(
openjdk:11
openjdk:11-slim
openjdk:11-jre
openjdk:11-jre-slim
openjdk:11-oracle
adoptopenjdk/openjdk11:latest
adoptopenjdk/openjdk11:slim
adoptopenjdk/openjdk11:alpine
adoptopenjdk/openjdk11:alpine-slim
)
IMAGES.each do |image|
%x{docker pull #{image}}
result = %x{docker image inspect #{image} | jq -r '.[0].Size'}.to_i
puts "#{image} #{result / 1000 / 1000} MB"
end
結果はご覧の通りです (10/29 時点の結果です)。
Docker Hub | ベースイメージ | JDK/JRE | タグ | サイズ |
---|---|---|---|---|
openjdk | Debian (debian:sid ) |
JDK | openjdk:11 |
961 MB |
openjdk | Debian (debian:sid-slim ) |
JDK | openjdk:11-slim |
509 MB |
openjdk | Debian (debian:sid ) |
JRE | openjdk:11-jre |
592 MB |
openjdk | Debian (debian:sid-slim ) |
JRE | openjdk:11-jre-slim |
281 MB |
openjdk | Oracle Linux (oraclelinux:7-slim ) |
JDK | openjdk:11-oracle |
458 MB |
adoptopenjdk/openjdk11 | Ubuntu (ubuntu:16.04 ) |
JDK | adoptopenjdk/openjdk11:latest |
477 MB |
adoptopenjdk/openjdk11 | Ubuntu (ubuntu:18.04 ) |
JDK | adoptopenjdk/openjdk11:slim |
358 MB |
adoptopenjdk/openjdk11 | Alpine Linux (alpine:3.8 ) |
JDK | adoptopenjdk/openjdk11:alpine |
338 MB |
adoptopenjdk/openjdk11 | Alpine Linux (alpine:3.8 ) |
JDK | adoptopenjdk/openjdk11:alpine-slim |
247 MB |
まとめ
Oracle JDK からの乗り換え先かつ LTS があることを条件とするならば、まず JDK は HotSpot VM の AdoptOpenJDK に絞られることでしょう。そのうち、特にイメージサイズを気にするのであれば adoptopenjdk/openjdk11:alpine-slim
が最良の選択肢となるかと思われます。
一方で、LTS であることを気にしないような用途で Java の Docker イメージを使いたい場合、特に新しいバージョンを試したい場合などは Oracle がビルドした OpenJDK の Docker イメージ (今で言えば openjdk:12-oracle
) を使うのがよいでしょう。