Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Alpine対応のJava16で最小Docker Imageをつくる / Make minimum Docker Image with Java 16 on Alpine

Alpine対応のJava16で最小Docker Imageをつくる / Make minimum Docker Image with Java 16 on Alpine

2021年3月12日に開催されたnakanoshima.dev#14 JVM Langs Night Talkの資料です
https://nakanoshima-dev.connpass.com/event/204733/

9e840766611f942c7c0a9ad6987a5d78?s=128

Naoki Kishida

March 12, 2021
Tweet

Transcript

  1. Alpine Linux対応のJava16で 最小Docker Imageをつくる 2021/3/12 nakanoshima.dev#14 JVM Langs Night Talk

    LINE Fukuoka きしだ なおき
  2. 自己紹介 • きしだ なおき • LINE Fukuoka • Developer Relations

    • Javaサーバサイド • twitter: @kis
  3. Java 16 • 3/16リリース

  4. Alpine Linux • musl • c標準ライブラリ • glibc互換 • コンパクトに整理されている

    • ヘッダが人間にも読める • glibcは#ifdefたくさんで読みにくい • busybox • すべてのコマンドがbusyboxにsymbolic link • apk • パッケージ管理
  5. Portolaプロジェクト • JDKをAlpine Linuxに対応する • メンバー • Mikaelさん • BellSoftの人

    • 他
  6. 対応ディストリビューション • Zulu • Liberica JDK

  7. Zulu • Azul Systems https://www.azul.com/downloads/zulu-community/?version=java-15-mts&os=alpine-linux&package=jdk

  8. Liberica JDK • BellSoft https://bell-sw.com/pages/downloads/#/java-15-current

  9. Liberica JDK • docker image https://hub.docker.com/r/bellsoft/liberica-openjdk-alpine-musl

  10. 16で正式対応 • JEP 386: Alpine Linux Port https://openjdk.java.net/jeps/386

  11. 16にはまだAlpineバイナリがない・・・ • JDK 16 RC http://jdk.java.net/16/

  12. では自分でビルドだ • bash configure make • ソースはGitHub https://github.com/openjdk/jdk/tree/jdk-16+36

  13. ビルドエラー (T^T) • allocaの戻り値を使っていないという警告が

  14. パッチ • ダミー変数に割り当てる 672c672 < alloca(((pid ^ counter++) & 7)

    * 128); --- > int* dummy = (int*)alloca(((pid ^ counter++) & 7) * 128);
  15. 結構大きい • 961MB

  16. jlinkで実行環境を最適化 • 必要なモジュールだけを持つJava実行環境をつくる • jdepsで必要なモジュールを確認する • Springのようなfat-jarでは一度展開してライブラリjarを取り出して おく必要がある > jlink

    --compress 2 --strip-debug --no-header-files --no-man-pages --output /src/jre --add-modules java.base,java.desktop,java.instrument,java.management.rmi,java.naming,java.pref s,java.scripting,java.security.jgss,java.sql,jdk.httpserver,jdk.jfr,jdk.unsuppor ted
  17. 77MB • 77MBのイメージができた

  18. 参考 • UbuntuやJibを使ってみる

  19. Jib • Googleが開発したDockerイメージ作成ツール • Docker不要 • Mavenなどに組み込んで使う • mvn jib:dockerBuild

    <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>2.7.0</version> <configuration> <to> <image>spring-jib</image> </to> </configuration> </plugin> </plugins> </build>
  20. Shenandoahとかいらなくない? • 使わない機能がたくさんある • Javaには6つのGCがある • 1つしか使わない • 削ってみる

  21. --disable-jvm-feature • 使わないものを無効にしてみる bash configure --disable-jvm-feature-aot --disable-jvm-feature-graal --disable- jvm-feature-parallelgc --disable-jvm-feature-shenandoahgc

    --disable-jvm-feature- zgc --disable-jvm-feature-epsilongc --disable-jvm-feature-jvmci --disable-jvm- feature-jni-check --disable-jvm-feature-dtrace
  22. 結果:そんな小さくない • 74MB

  23. もっと削ってみる • JITいらんくない? • Serial GCでよくない? • 管理しねーし bash configure

    --disable-jvm-feature-aot --disable-jvm-feature-graal -- disable-jvm-feature-parallelgc --disable-jvm-feature-shenandoahgc -- disable-jvm-feature-zgc --disable-jvm-feature-epsilongc --disable-jvm- feature-jvmci --disable-jvm-feature-jni-check --disable-jvm-feature-dtrace --disable-jvm-feature-cds --disable-jvm-feature-compiler1 --disable-jvm- feature-compiler2 --disable-jvm-feature-jvmti --disable-jvm-feature-jfr -- disable-jvm-feature-management --disable-jvm-feature-g1gc --disable-jvm- feature-services --disable-jvm-feature-nmt --disable-jvm-feature-vm-structs --disable-jvm-feature-link-time-opt
  24. 60MB! • だいぶ小さくなった

  25. うごいた! • 動きます • でも遅い

  26. まとめ • Java16でAlpine Linuxに対応 • ちいさいDocker Imageが作れる • いろんなディストリビューションが対応するかも