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

Jib入門

 Jib入門

3da2cc0889ceb0d8520e3a5194d7d091?s=128

nogamincho

May 18, 2019
Tweet

Transcript

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

  2. ⾃⼰紹介 • 名前 • 野上恭平(@nogamincho) • 仕事 • 新⼈研修 •

    モバイルアプリ開発(Flutter) • 趣味 • バッジ収集
  3. ⾃⼰紹介 ⾃宅は郡⼭ 勤務地は勝どき 毎⽇ 往復400km

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

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

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

  7. Java × Docker 使ってる⼈︖

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

  9. Jibのゴール Fast Reproducible Daemonless • 多層に分割し依存ライブラリをクラスから切り離す。 • 変更を含むレイヤーのみ再ビルドする。 • 同⼀のコンテンツを再ビルド時には同⼀のイメージを

    ⽣成する。 • 不要なアップデートは⾏わない。 • Dockerfileおよびdockerコマンドが不要。 • JavaのみでDockerイメージをビルド可能。 参考︓https://github.com/GoogleContainerTools/jib
  10. Dockerfileのベストプラクティス • .dockerignoreファイルを利⽤する。 • コンテナをイミュータブルでエフェメラルにする。 • コマンドを集約し、レイヤー数を最⼩化する。 • 不要なパッケージをインストールしない。 •

    複数⾏の引数はソートする。 • ビルドのキャッシュを活⽤する。 • マルチステージビルドを利⽤する。 • CMDとENTRYPOINTの違いを理解する。 参考︓https://medium.com/@nagarwal/best-practices-for-working-with-dockerfiles-fb2d22b78186 これらを 意識しなくてよい︕
  11. Fast

  12. どれくらい速い︖

  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
  14. ここだけ再ビルド︕ なぜ速いのか︖ • コードのみ変更した場合はLayer3のみ再ビルドが実⾏される distroless Layer 0 dependencies Layer 1

    resources Layer 2 classes Layer 3
  15. ベースとなるdistrolessとは︖ • Googleが提供している軽量イメージ。 • アプリケーションとその動作に必要な最⼩限のLinuxを含む。 • パッケージマネージャーやシェルは含まない。 • 提供されているイメージ •

    Go/Rust/D • Java • Python2.7、Python3 • Node.js • .NET 参考︓https://github.com/GoogleContainerTools/distroless
  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
  17. Reproducible

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

  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
  20. Daemonless

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

    Dockerfile build send build これが… こうじゃ︕
  22. アプリ屋視点だと︖ • ArtifactとしてContainer Imageを⽣成する。 Code Jar build Container Image containerize

  23. 使い⽅

  24. 使い⽅(Maven) • pom.xmlにpluginを追加する。 <plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>1.0.2</version> <configuration> <to> <image>jibtest</image>

    </to> </configuration> </plugin>
  25. 使い⽅(Maven) • mvnコマンド叩くだけ︕ • 対応する出⼒先 • ECR、GCR、ACR、Docker Hub、その他Dockerレジストリ # ビルドしてレジストリへ登録

    $ mvn compile jib:build # ビルドしてDockerデーモンに登録 $ mvn compile jib:dockerBuild
  26. オプション • ベースイメージを変更したり、追加のリソースを追加できる。 オプション 説明 instruction to コンテナイメージの出⼒先 - from

    ベースイメージ FROM container コンテナの設定(次項参照) - extraDirectories イメージに追加するディレクトリ COPY 参考︓https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin
  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
  28. まとめ • ビルドがめちゃくちゃ速い︕ • コマンド⼀発でDockerイメージが⽣成できる︕ • Dockerのベストプラクティスを知らなくても、 それっぽいイメージができる︕