Slide 1

Slide 1 text

Jib⼊⾨ JJUG CCC 2019 Spring Lightning Talk @nogamincho

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

Java × Docker 使ってる⼈︖

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

Fast

Slide 12

Slide 12 text

どれくらい速い︖

Slide 13

Slide 13 text

なぜ速いのか︖ 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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

イメージサイズの⽐較 • 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

Slide 17

Slide 17 text

Reproducible

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

どうやっているのか︖ • イメージ作成時に以下の情報を消去する。 • ユーザー • グループ • タイムスタンプ ~ ❯❯❯ 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

Slide 20

Slide 20 text

Daemonless

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

使い⽅

Slide 24

Slide 24 text

使い⽅(Maven) • pom.xmlにpluginを追加する。 com.google.cloud.tools jib-maven-plugin 1.0.2 jibtest

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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