これは、なにをしたくて書いたもの?
- なにげなく、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ディストリビューションの選び方 #codetokyo19B3 #ccc_l5
どのイメージを対象に?
ざっと並べてみましょう。
このあたりは、参考的に。
Oracle OpenJDK (※ These images will require you to download any required Oracle commercial software before installation.)
網羅感はない気がしますけど、いいかぁ…。
[更新] 私が今まで軽く試したOpenJDKディストリビューション
— Takahiro YAMADA (@yamadamn) January 25, 2019
- Oracle JDK
- (Oracle) OpenJDK
- (Red Hat) OpenJDK
- Azul Zulu
- AdoptOpenJDK
- SapMachine
- BellSoft Liberica JDK
- Amazon Corretto
- (Microsoft) OpenJDK
- ojdkbuild <-NEW!
そのうち、このあたりも入れられたら…。
なにを見る?
各イメージについて、このあたりを見ていこうと思います。
- 提供されているバージョン(LTSである、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
まずは、こちらから。
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イメージ]
ちょっと、試してみましょう。
$ 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.
$ 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!
$ 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
OpenJDK 8〜11までがあり、HotSpotとEclipse OpenJ9を使ったものがあります。それぞれ、Dockerイメージ名は別々です。
各イメージ。
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
こちらは、現時点で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
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