CLOVER🍀

That was when it all began.

OpenJDKのDockerイメージって、なにがあるんでしたっけ?

これは、なにをしたくて書いたもの?

  • なにげなく、OpenJDKのDockerイメージを使ったりしていたのですが、1度、どんなイメージがあるのか調べてみようと
$ docker search openjdk

とか実行すると、わらわらと現れますしね。

ベースのイメージがどうなっているかとか、そのあたりとか見てみようかなと。

やらないこと

各種ディストリビューションのOpenJDK自体としての比較とか、なにを選んだらいいのか?みたいなことはやりません。

そのあたりの情報は、以下とかを見るとよいのではないでしょうか。

Introduction to Java 11: Support and JVM Features #jjug

最適な Java の Docker イメージを選びたい - k11i.biz

最適なOpenJDKディストリビューションの選び方 -How to choose the best OpenJDK distribution-

どのイメージを対象に?

ざっと並べてみましょう。

OpenJDK

OpenJDK / winamd64

AdoptOpenJDK

Amazon Corretto

Zulu OpenJDK

このあたりは、参考的に。

IBM Java

Oracle OpenJDK (※ These images will require you to download any required Oracle commercial software before installation.)

JBoss Base JDK

網羅感はない気がしますけど、いいかぁ…。

なにを見る?

各イメージについて、このあたりを見ていこうと思います。

  • 提供されているバージョン(8、11を中心に)
  • ベースのOSイメージやバリエーション
  • 現時点のバージョンでのサイズ
  • その他、なにか気になることがあれば

確認環境は、こちらです。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.2 LTS
Release:    18.04
Codename:   bionic


$ docker -v
Docker version 18.09.2, build 6247962

OpenJDK

まずは、こちらから。

OpenJDK

OpenJDK / winamd64

Windows系統が2つあるように見えるのですが、出処は同じようです。

GitHub - docker-library/openjdk: Docker Official Image packaging for Java (openJDK)

OpenJDK 7〜13 EA(Windowsは8以降、Oracle Linuxは12以降、Alpine Linuxは7〜8、13EA)があります。

JDKとJREのイメージがあり、OSはDebian、Alpine Linux、Oracle Linux、Windows(Server Core、Nano Server)があります。
JREには、javacやjcmdなどのツールは付属していません。

また、Debianのイメージで「-slim」が付いているものは「openjdk-*-headless」でグラフィックなどに関するライブラリが
除外されたものです。「jessie」とか「stretch」は、Debianのコードネームですね。省略した場合は、Debianのイメージが
使われるようです。

ざっくり、以下のように読めそうです。

[バージョン] - [JDK or JRE] (Debianのみ -slim) - [ベースOSイメージ]

ちょっと、試してみましょう。

Java 8(JDK) Debian。

$ docker container run -it --rm openjdk:8-jdk-stretch java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-2~deb9u1-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)


$ docker container run -it --rm openjdk:8-jdk-stretch javac -version
javac 1.8.0_181


## Debianのコードネームを省略
$ docker container run -it --rm openjdk:8-jdk java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-2~deb9u1-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)

JREだと、たとえばjavacは入っていません。

$ docker container run -it --rm openjdk:8-jre-stretch javac -version
docker: Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused "exec: \"javac\": executable file not found in $PATH": unknown.

Java 8 Alpine Linux。

$ docker container run -it --rm openjdk:8-jdk-alpine java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (IcedTea 3.10.0) (Alpine 8.191.12-r0)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)


$ docker container run -it --rm openjdk:8-jdk-alpine javac -version
javac 1.8.0_191

IcedTea!

Java 11(JDK) Debian。

$ docker container run -it --rm openjdk:11-jdk-stretch java -version
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment (build 11.0.2+9-Debian-3bpo91)
OpenJDK 64-Bit Server VM (build 11.0.2+9-Debian-3bpo91, mixed mode, sharing)

飽きてきました…。

最後に、代表的なイメージのサイズを並べておきましょう。
※もっと細かくバージョン指定できるので、DockerHubを確認してください
※表示順は、コマンドの結果をちょっと整形しています

$ docker image ls | grep -E '^(openjdk|R)' | perl -wp -e 's! {35}!!'
REPOSITORY   TAG                 IMAGE ID            CREATED             SIZE
openjdk      8-jre-slim          2cf9c5fa7ea0        2 weeks ago         204MB
openjdk      8-jre               ed287c436e66        2 weeks ago         443MB
openjdk      8-jdk-slim          f07659799003        2 weeks ago         243MB
openjdk      8-jdk               5f8e49b0a018        2 weeks ago         624MB
openjdk      8-jre-alpine        1b46cc2ba839        2 weeks ago         85MB
openjdk      8-jdk-alpine        792ff45a2a17        2 weeks ago         105MB
openjdk      11-jre-slim         948bb46c07b7        2 weeks ago         273MB
openjdk      11-jre              9df4aac22102        2 weeks ago         479MB
openjdk      11-jdk-slim         20be262dd659        2 weeks ago         474MB
openjdk      11-jdk              4b298a8f36ec        2 weeks ago         821MB

Alpine Linux、小さいですね。Java 11向けのイメージはないのですが。Debianでも、「-slim」を付けると半分くらいになることが
わかります。

AdoptOpenJDK

AdoptOpenJDK

OpenJDK 8〜11までがあり、HotSpotとEclipse OpenJ9を使ったものがあります。それぞれ、Dockerイメージ名は別々です。

OpenJ9

各イメージ。

OSはUbuntu LinuxかAlpine Linux、提供形態はJDKのみです。Alpine Linuxを含め、「-slim」が付いた軽量版も存在します。

タグの付け方は、Ubuntu LinuxとAlpine Linuxでけっこう違いますね…。すごい乱暴に見ると、雰囲気こんな感じ。

## Ubuntu Linux
(OS - )[バージョン] (-slim)

## Alpine Linux
[バージョン] - alpine (-slim)
alpine - [バージョン] (-slim)

OpenJDKのように、各バージョンに対するショートカット(8-jdkとか)はなく、イメージ名自体にバージョンが入って
いるので、今回はlatestも含めて。

## Java 8
$ docker container run -it --rm adoptopenjdk/openjdk8:latest java -version
Picked up JAVA_TOOL_OPTIONS: -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
openjdk version "1.8.0_202"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_202-b08)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.202-b08, mixed mode)


$ docker container run -it --rm adoptopenjdk/openjdk8:latest javac -version
Picked up JAVA_TOOL_OPTIONS: -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
javac 1.8.0_202


$ docker container run -it --rm adoptopenjdk/openjdk8:alpine java -version
Picked up JAVA_TOOL_OPTIONS: -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
openjdk version "1.8.0_202"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_202-b08)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.202-b08, mixed mode)


## Java 11
$ docker container run -it --rm adoptopenjdk/openjdk11:latest java -version
Picked up JAVA_TOOL_OPTIONS: -XX:+UseContainerSupport
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.2+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.2+9, mixed mode)


$ docker container run -it --rm adoptopenjdk/openjdk11:alpine java -version
Picked up JAVA_TOOL_OPTIONS: -XX:+UseContainerSupport
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.2+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.2+9, mixed mode)

JDKなので、javacなども入っています。

Eclipse OpenJ9。

## Java 8
$ docker container run -it --rm adoptopenjdk/openjdk8-openj9:latest java -version
openjdk version "1.8.0_202"
OpenJDK Runtime Environment (build 1.8.0_202-b08)
Eclipse OpenJ9 VM (build openj9-0.12.1, JRE 1.8.0 Linux amd64-64-Bit Compressed References 20190205_213 (JIT enabled, AOT enabled)
OpenJ9   - 90dd8cb40
OMR      - d2f4534b
JCL      - d002501a90 based on jdk8u202-b08)


## Java 11
$ docker container run -it --rm adoptopenjdk/openjdk11-openj9:latest java -version
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.2+9)
Eclipse OpenJ9 VM AdoptOpenJDK (build openj9-0.12.1, JRE 11 Linux amd64-64-Bit Compressed References 20190204_127 (JIT enabled, AOT enabled)
OpenJ9   - 90dd8cb40
OMR      - d2f4534b
JCL      - 289c70b6844 based on jdk-11.0.2+9)

イメージサイズ。

$ docker image ls | grep -E '^(adoptopenjdk|R)' | perl -wp -e 's! {10}!!'
REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
adoptopenjdk/openjdk8                 alpine-slim         16a4571444f5        17 hours ago        70.8MB
adoptopenjdk/openjdk8                 alpine              044e52705f60        17 hours ago        218MB
adoptopenjdk/openjdk8                 slim                4054f3e04439        17 hours ago        195MB
adoptopenjdk/openjdk8                 latest              3a67dd1fcfed        17 hours ago        326MB
adoptopenjdk/openjdk11                alpine-slim         2e381ef5bac8        16 hours ago        243MB
adoptopenjdk/openjdk11                alpine              3a7962d3c2e7        16 hours ago        334MB
adoptopenjdk/openjdk11                slim                8e14a399031b        16 hours ago        367MB
adoptopenjdk/openjdk11                latest              6f8f9f95bd93        16 hours ago        442MB
adoptopenjdk/openjdk8-openj9          alpine-slim         cfcef3ba14b4        16 hours ago        84.8MB
adoptopenjdk/openjdk8-openj9          alpine              f6591d97b71a        16 hours ago        242MB
adoptopenjdk/openjdk8-openj9          slim                9d7d30354566        16 hours ago        209MB
adoptopenjdk/openjdk8-openj9          latest              4225a1b480be        17 hours ago        350MB
adoptopenjdk/openjdk11-openj9         alpine-slim         c28a5499517a        15 hours ago        243MB
adoptopenjdk/openjdk11-openj9         alpine              d1c0287b6c67        15 hours ago        329MB
adoptopenjdk/openjdk11-openj9         slim                67110554b61b        16 hours ago        367MB
adoptopenjdk/openjdk11-openj9         latest              f32e5806c4ce        16 hours ago        436MB

Amazon Corretto

Amazon Corretto

こちらは、現時点でJava 8のみです。OSは、Amazon Linux 2。JDKが入っています。

実行。

$ docker container run -it --rm amazoncorretto:8 java -version
openjdk version "1.8.0_202"
OpenJDK Runtime Environment Corretto-8.202.08.1 (build 1.8.0_202-b08)
OpenJDK 64-Bit Server VM Corretto-8.202.08.1 (build 25.202-b08, mixed mode)


$ docker container run -it --rm amazoncorretto:8 javac -version
javac 1.8.0_202

タグはいくつかありますが、明示的にJavaのバージョンを指定したもの(8u202とか)以外は、全部エイリアスですね。

サイズ。

$ docker image ls | grep -E '^(amazoncorretto|R)' | perl -wp -e 's! {30}!!'
REPOSITORY        TAG                 IMAGE ID            CREATED             SIZE
amazoncorretto    8                   c9e273c57f2a        11 days ago         525MB

なお、Amazon Corretto 8のDockerfileはこちらにありますが、

GitHub - corretto/corretto-8-docker: Dockerfiles for Amazon Corretto 8

そのうち11もできるのでしょう(まだリポジトリの中身は空っぽです)。

GitHub - corretto/corretto-11-docker: Dockerfiles for Corretto 11

Zulu

Zulu OpenJDK

OpenJDK 6〜11まであり、OSはUbuntu Linux、CentOS、Debian、Alpine Linuxがあり、ベースのOSごとにイメージが
分かれています。入っているのは、JDKですね。

タグには、素直にバージョンが書かれています。

いくつか実行。

## Java 8 Ubuntu Linux
$ docker container run -it --rm azul/zulu-openjdk:8 java -version
openjdk version "1.8.0_202"
OpenJDK Runtime Environment (Zulu 8.36.0.1-CA-linux64) (build 1.8.0_202-b05)
OpenJDK 64-Bit Server VM (Zulu 8.36.0.1-CA-linux64) (build 25.202-b05, mixed mode)


$ docker container run -it --rm azul/zulu-openjdk:8 javac -version
javac 1.8.0_202


## Java 11 Ubuntu Linux
$ docker container run -it --rm azul/zulu-openjdk:11 java -version
openjdk version "11.0.2" 2019-01-15 LTS
OpenJDK Runtime Environment Zulu11.29+3-CA (build 11.0.2+7-LTS)
OpenJDK 64-Bit Server VM Zulu11.29+3-CA (build 11.0.2+7-LTS, mixed mode)



## Java 8 Alpine Linux
$ docker container run -it --rm azul/zulu-openjdk-alpine:8 java -version
openjdk version "1.8.0_202"
OpenJDK Runtime Environment (Zulu 8.36.0.3-CA-linux-musl-x64) (build 1.8.0_202-b05)
OpenJDK 64-Bit Server VM (Zulu 8.36.0.3-CA-linux-musl-x64) (build 25.202-b05, mixed mode)


## Java 11 Alpine Linux
$ docker container run -it --rm azul/zulu-openjdk-alpine:11 java -version
openjdk version "11.0.2" 2019-01-15 LTS
OpenJDK Runtime Environment Zulu11.29+3-CA (build 11.0.2+7-LTS)
OpenJDK 64-Bit Server VM Zulu11.29+3-CA (build 11.0.2+7-LTS, mixed mode)

サイズを見てみましょう。

$ docker image ls | grep -E '^(azul|R)' | perl -wp -e 's! {20}!!'
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
azul/zulu-openjdk           8                   70ab5302ed53        11 days ago         337MB
azul/zulu-openjdk-centos    8                   0cd6a845efaf        11 days ago         613MB
azul/zulu-openjdk-debian    8                   90974c93734c        11 days ago         360MB
azul/zulu-openjdk-alpine    8                   530473006ac7        11 days ago         213MB
azul/zulu-openjdk           11                  ec65e830060e        12 days ago         452MB
azul/zulu-openjdk-centos    11                  3aa20de9736a        12 days ago         772MB
azul/zulu-openjdk-debian    11                  7a957c8bab67        12 days ago         475MB
azul/zulu-openjdk-alpine    11                  368e3d1acc6a        11 days ago         327MB

ざっと

こんなところで。

参考に挙げたものも試してみようかと思いましたが、だんだん面倒になってきたのでここまでで。

DockerイメージをPullするのに使ったスクリプト。

オマケ的に。

OpenJDK。
pull-openjdk-images.sh

#!/bin/bash

OPENJDK_IMAGES=(
    openjdk:8-jdk
    openjdk:8-jdk-slim
    openjdk:8-jre
    openjdk:8-jre-slim
    openjdk:8-jdk-alpine
    openjdk:8-jre-alpine
    openjdk:11-jdk
    openjdk:11-jdk-slim
    openjdk:11-jre
    openjdk:11-jre-slim
)

for IMAGE in ${OPENJDK_IMAGES[@]}; do
    docker pull $IMAGE
done

AdoptOpenJDK。
pull-adoptopenjdk-images.sh

#!/bin/bash

ADOPTOPENJDK_IMAGES=(
    adoptopenjdk/openjdk8:latest
    adoptopenjdk/openjdk8:slim
    adoptopenjdk/openjdk8:alpine
    adoptopenjdk/openjdk8:alpine-slim
    adoptopenjdk/openjdk8-openj9:latest
    adoptopenjdk/openjdk8-openj9:slim
    adoptopenjdk/openjdk8-openj9:alpine
    adoptopenjdk/openjdk8-openj9:alpine-slim
    adoptopenjdk/openjdk11:latest
    adoptopenjdk/openjdk11:slim
    adoptopenjdk/openjdk11:alpine
    adoptopenjdk/openjdk11:alpine-slim
    adoptopenjdk/openjdk11-openj9:latest
    adoptopenjdk/openjdk11-openj9:slim
    adoptopenjdk/openjdk11-openj9:alpine
    adoptopenjdk/openjdk11-openj9:alpine-slim
)

for IMAGE in ${ADOPTOPENJDK_IMAGES[@]}; do
    docker pull $IMAGE
done

Zulu。
pull-zulu-images.sh

#/bin/bash

ZULU_IMAGES=(
    azul/zulu-openjdk:8
    azul/zulu-openjdk:11
    azul/zulu-openjdk-centos:8
    azul/zulu-openjdk-centos:11
    azul/zulu-openjdk-debian:8
    azul/zulu-openjdk-debian:11
    azul/zulu-openjdk-alpine:8
    azul/zulu-openjdk-alpine:11
)

for IMAGE in ${ZULU_IMAGES[@]}; do
    docker pull $IMAGE
done