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/

Naoki Kishida

March 12, 2021
Tweet

More Decks by Naoki Kishida

Other Decks in Programming

Transcript

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

    View Slide

  2. 自己紹介
    • きしだ なおき
    • LINE Fukuoka
    • Developer Relations
    • Javaサーバサイド
    • twitter: @kis

    View Slide

  3. Java 16
    • 3/16リリース

    View Slide

  4. Alpine Linux
    • musl
    • c標準ライブラリ
    • glibc互換
    • コンパクトに整理されている
    • ヘッダが人間にも読める
    • glibcは#ifdefたくさんで読みにくい
    • busybox
    • すべてのコマンドがbusyboxにsymbolic link
    • apk
    • パッケージ管理

    View Slide

  5. Portolaプロジェクト
    • JDKをAlpine Linuxに対応する
    • メンバー
    • Mikaelさん
    • BellSoftの人
    • 他

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  14. パッチ
    • ダミー変数に割り当てる
    672c672
    < alloca(((pid ^ counter++) & 7) * 128);
    ---
    > int* dummy = (int*)alloca(((pid ^ counter++) & 7) * 128);

    View Slide

  15. 結構大きい
    • 961MB

    View Slide

  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

    View Slide

  17. 77MB
    • 77MBのイメージができた

    View Slide

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

    View Slide

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



    org.springframework.boot
    spring-boot-maven-plugin


    com.google.cloud.tools
    jib-maven-plugin
    2.7.0


    spring-jib





    View Slide

  20. Shenandoahとかいらなくない?
    • 使わない機能がたくさんある
    • Javaには6つのGCがある
    • 1つしか使わない
    • 削ってみる

    View Slide

  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

    View Slide

  22. 結果:そんな小さくない
    • 74MB

    View Slide

  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

    View Slide

  24. 60MB!
    • だいぶ小さくなった

    View Slide

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

    View Slide

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

    View Slide