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 は 現時点では jmapjstack などの診断ツールをサポートしていない ため、Oracle の JDK に慣れ親しんでいる場合は、前者の (HotSpot の) イメージを利用するのが望ましいように思います。

ベースイメージはいずれも Ubuntu と Alpine Linux の両方が用意されています。また、どちらのベースイメージでも、イメージサイズを削減した slim イメージが提供されています。

  • ベースイメージ: Ubuntu
    • JDK: latest
    • JDK (slim): slim
  • ベースイメージ: Alpine Linux
    • JDK: alpine
    • JDK (slim): alpine-slim

なお現時点 (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) を使うのがよいでしょう。