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

Jib入門

 Jib入門

nogamincho

May 18, 2019
Tweet

Other Decks in Technology

Transcript

  1. Jib⼊⾨
    JJUG CCC 2019 Spring Lightning Talk
    @nogamincho

    View Slide

  2. ⾃⼰紹介
    • 名前
    • 野上恭平(@nogamincho)
    • 仕事
    • 新⼈研修
    • モバイルアプリ開発(Flutter)
    • 趣味
    • バッジ収集

    View Slide

  3. ⾃⼰紹介
    ⾃宅は郡⼭
    勤務地は勝どき
    毎⽇
    往復400km

    View Slide

  4. みなさん
    Java書いてますか︖

    View Slide

  5. 私は書いていません
    (´︔ω︔`)

    View Slide

  6. 今回は
    インフラに近いところに
    アプローチしてみました

    View Slide

  7. Java × Docker
    使ってる⼈︖

    View Slide

  8. Jibとは
    • Googleが開発したDockerイメージビルド⽤ツール
    • Mavenプラグイン、Gradleプラグイン、Javaライブラリが提供
    • Dockerのベストプラクティスを意識することなしに
    ベストプラクティスに則ったDockerイメージが作成できる
    参考︓https://github.com/GoogleContainerTools/jib

    View Slide

  9. Jibのゴール
    Fast
    Reproducible
    Daemonless
    • 多層に分割し依存ライブラリをクラスから切り離す。
    • 変更を含むレイヤーのみ再ビルドする。
    • 同⼀のコンテンツを再ビルド時には同⼀のイメージを
    ⽣成する。
    • 不要なアップデートは⾏わない。
    • Dockerfileおよびdockerコマンドが不要。
    • JavaのみでDockerイメージをビルド可能。
    参考︓https://github.com/GoogleContainerTools/jib

    View Slide

  10. Dockerfileのベストプラクティス
    • .dockerignoreファイルを利⽤する。
    • コンテナをイミュータブルでエフェメラルにする。
    • コマンドを集約し、レイヤー数を最⼩化する。
    • 不要なパッケージをインストールしない。
    • 複数⾏の引数はソートする。
    • ビルドのキャッシュを活⽤する。
    • マルチステージビルドを利⽤する。
    • CMDとENTRYPOINTの違いを理解する。
    参考︓https://medium.com/@nagarwal/best-practices-for-working-with-dockerfiles-fb2d22b78186
    これらを
    意識しなくてよい︕

    View Slide

  11. Fast

    View Slide

  12. どれくらい速い︖

    View Slide

  13. なぜ速いのか︖
    Jibの動作をDockerfileで記述すると…
    FROM gcr.io/distroless/java
    COPY target/dependencies /app/dependencies
    COPY target/resources /app/resources
    COPY target/classes /app/classes
    ENTRYPOINT java -cp /app/dependencies/*
    :/app/resources :/app/classes nogami.Main

    View Slide

  14. ここだけ再ビルド︕
    なぜ速いのか︖
    • コードのみ変更した場合はLayer3のみ再ビルドが実⾏される
    distroless
    Layer 0
    dependencies
    Layer 1
    resources
    Layer 2
    classes
    Layer 3

    View Slide

  15. ベースとなるdistrolessとは︖
    • Googleが提供している軽量イメージ。
    • アプリケーションとその動作に必要な最⼩限のLinuxを含む。
    • パッケージマネージャーやシェルは含まない。
    • 提供されているイメージ
    • Go/Rust/D
    • Java
    • Python2.7、Python3
    • Node.js
    • .NET
    参考︓https://github.com/GoogleContainerTools/distroless

    View Slide

  16. イメージサイズの⽐較
    • alpineには劣るがOpenJDKのdebianベースのイメージより軽量
    (distrolessにはdebian⽤のJDKが⼊っている)
    イメージ名 イメージサイズ
    gcr.io/distroless/java:8 125MB
    openjdk:8-alpine 105MB
    openjdk:8-slim 243MB
    gcr.io/distroless/java:11 195MB
    openjdk:11-slim 468MB

    View Slide

  17. Reproducible

    View Slide

  18. 再現性をもたせるために
    • 同⼀のコードからは必ず同⼀のDockerイメージを⽣成する。
    • 本番環境と開発環境の環境差異を無くす。

    View Slide

  19. どうやっているのか︖
    • イメージ作成時に以下の情報を消去する。
    • ユーザー
    • グループ
    • タイムスタンプ
    ~ ❯❯❯ docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    openjdk 8-alpine a3562aa0b991 7 days ago 105MB
    openjdk 8-slim 53d0e22a19f1 9 days ago 243MB
    openjdk 11-slim b753a509e68b 9 days ago 468MB
    gcr.io/distroless/java 8 58ae3d27857b 49 years ago 125MB
    gcr.io/distroless/java 11 7ba07814a562 49 years ago 195MB
    jibtest latest 26c3bb3b0be4 49 years ago 142MB

    View Slide

  20. Daemonless

    View Slide

  21. Jibが解決した問題
    • コードからコンテナイメージを⽣成するには、
    以下のような⼿続きが必要。
    Code Jar
    Docker
    Daemon
    Container
    Image
    Dockerfile
    build
    send
    build
    これが…
    こうじゃ︕

    View Slide

  22. アプリ屋視点だと︖
    • ArtifactとしてContainer Imageを⽣成する。
    Code
    Jar
    build
    Container
    Image
    containerize

    View Slide

  23. 使い⽅

    View Slide

  24. 使い⽅(Maven)
    • pom.xmlにpluginを追加する。

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


    jibtest



    View Slide

  25. 使い⽅(Maven)
    • mvnコマンド叩くだけ︕
    • 対応する出⼒先
    • ECR、GCR、ACR、Docker Hub、その他Dockerレジストリ
    # ビルドしてレジストリへ登録
    $ mvn compile jib:build
    # ビルドしてDockerデーモンに登録
    $ mvn compile jib:dockerBuild

    View Slide

  26. オプション
    • ベースイメージを変更したり、追加のリソースを追加できる。
    オプション 説明 instruction
    to コンテナイメージの出⼒先 -
    from ベースイメージ FROM
    container コンテナの設定(次項参照) -
    extraDirectories イメージに追加するディレクトリ COPY
    参考︓https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin

    View Slide

  27. Containerのオプション(抜粋)
    参考︓https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin
    オプション 説明 instruction
    args アプリケーション引数 CMD
    entrypoint 起動時に実⾏されるコマンド ENTRYPOINT
    environment 環境変数 ENV
    extraClasspath 追加のクラスパス -
    jvmFlags JVM引数 -
    mainClass メインクラス -
    ports アクセス可能にするポート EXPOSE
    labels ラベル LABEL

    View Slide

  28. まとめ
    • ビルドがめちゃくちゃ速い︕
    • コマンド⼀発でDockerイメージが⽣成できる︕
    • Dockerのベストプラクティスを知らなくても、
    それっぽいイメージができる︕

    View Slide