Googleのジブでスプリングブートアプリをドッキングする方法

画像1:Jibでの摩擦のないJavaドッカー画像!

こんにちは!最近、スプリングベースのプラットフォームで作業しているときに、マイクロサービスをドッキングする方法を検討していました。そこで、Googleが開発した、この問題に関するかなり新しいアプローチであるJibに出会いました。

この投稿は、コンテナ化されたスプリングブートアプリケーションを構築するために、ジブ、より具体的にはjib-maven-pluginを利用することについてです。

この投稿で使用されているデモプロジェクトは、次の場所にあります。

ジブとは

Jibがテーブルにもたらすのは、選択したビルドツール(MavenまたはGradle)にプラグインを追加するだけでコンテナを作成できることです。追加のファイルはなく、ほんの数行の設定で、アプリケーションをコンテナイメージにパッケージ化するすべてのステップを処理します。

Googleクラウドチーム独自の言葉で:

JibはGoogleのオープンソースJavaコンテナ化ツールで、Java開発者が知っているJavaツールを使用してコンテナを構築できます。 Dockerfileを作成したり、Dockerをインストールしたりする必要はなく、MavenとGradleに直接統合されます。

「従来の」JavaからDockerへのイメージビルドフローでは、以下に示すように、Dockerfileとdockerデーモンをインストールする必要があります。

画像2:Javaアプリからdockerイメージを作成する従来の手順。

図が示すように、Jibビルドフローでは、プロジェクトのビルドファイルのプラグインが必要です。

画像3:Javaアプリからdockerイメージを作成するためのジブ方法。

セットアップ

Java開発環境をセットアップすることはこの投稿の範囲内ではありませんが、試してみましょう!

  1. Java 8+がインストールされていることを確認してください。
  2. Mavenを使用するため、存在しない場合はMaven 3.5+をインストールします。
  3. Dockerがインストールされていることを確認してください。Linuxを使用している場合、ユーザーはdockerにアクセスできます。
  4. お気に入りのIDEをインストールします(日食またはアイデア)。

基本的なスプリングブートアプリケーションを作成する

これは、春の初期化を介して、またはお気に入りのIDEを介して行うことができます。 Spring Initializrを使用した場合は、新しく作成したMavenプロジェクトをIDEにインポートする必要があります(eclipse / idea)。

jib-maven-pluginをpom.xmlに追加します

アプリの非常に基本的なローカルに保存されたイメージの場合、pom.xmlでjib-maven-pluginを次のように構成します。

アプリをコンパイルしてイメージを作成します

これで、アプリケーションをビルドして、ローカルのdockerリポジトリにイメージが作成されているかどうかを確認できます。

ターミナルを介してプロジェクトのルートフォルダーに移動し、次を実行します。

mvn compile jib:dockerBuild

Mavenビルドログには、次のような行が含まれている必要があります。

[情報] — — jib-maven-plugin:0.10.1:dockerBuild(default-cli)@ spring-boot-jib —-
[情報]
[INFO] springbootjibとしてアプリケーションをDockerデーモンにコンテナ化しています…
[警告]ベースイメージ「gcr.io/distroless/java」は特定のイメージダイジェストを使用しません—ビルドは再現できない場合があります
[情報]ベースイメージgcr.io/distroless/javaを取得しています…
[情報]依存関係レイヤーを構築しています…
[INFO]リソースレイヤーの構築…
[INFO]クラスレイヤーの構築…
[情報]ファイナライズしています…
[情報]
[INFO] [java、-cp、/ app / resources:/ app / classes:/ app / libs / *、com.jibdemo.SpringBootJibApplication]に設定されたコンテナエントリポイント
[情報] Dockerデーモンにロードしています…
[情報]
[INFO] Dockerデーモンにspringbootjibとしてイメージを構築しました

エラーがなく、mavenが「SpringbootjibとしてDockerデーモンにイメージを構築する」と表示されている限り、すべて設定されています。

Dockerイメージを実行する

この時点で、ローカルリポジトリに新しいdockerイメージが作成されます。 docker image lsを実行すると確認でき、次のような画像が表示されます。

springbootjib最新eb4bea693650 3時間前135MB

Jibがデフォルトで使用するgcr.io/distroless/javaイメージのため、非常に小さい(135mb)イメージサイズに注意してください(これを後で変更する方法を確認します)。

これで、docker run -it springbootjibと入力して通常どおりイメージを実行し、アプリが期待どおりに実行されていることを確認できます。

Dockerイメージを微調整するためのJibプラグインの構成

ドッカーリポジトリへのログイン、ポートの公開、特定のベースイメージの選択など、いくつかの一般的なシナリオに合わせて、さらに掘り下げて、ジブプラグインをさらに構成できます。

たとえば、次の構成ではイメージを示します。

  • openjdk:alpine(Docker Hubから取得)のベースから構築されます
  • localhost:5000 / springbootjib:0.0.1-SNAPSHOT、localhost:5000 / springbootjib:alpine、およびlocalhost:5000 / springbootjib:latestにプッシュされます
  • java -Xms256m -Xdebug -cp app / libs / *:app / resources:app / classes com.jibdemo.SpringBootJibApplicationのいくつかの引数を呼び出して実行します
  • tcp(デフォルト)にはポート8001を公開し、udpにはポート8002および8003を公開します
  • ラベルがあります(名前:springbootjib)
  • OCI形式として構築されます

これで、イメージを再度ビルドして、Mavenログの違いを確認できます。

[情報] --- jib-maven-plugin:0.10.1:dockerBuild(default-cli)@ spring-boot-jib ---
[情報]
[INFO] localhost:5000 / springbootjib:0.0.1-SNAPSHOT、localhost:5000 / springbootjib:alpine、localhost:5000 / springbootjib ...としてアプリケーションをDockerデーモンにコンテナ化しています...
[情報]基本画像openjdk:alpineを取得しています...
[情報]依存関係レイヤーを構築しています...
[情報]リソースレイヤーを構築しています...
[情報]クラスレイヤーを構築しています...
[情報]ベースイメージには認証が必要です。 openjdk:alpineを再試行しています...
[情報] registry.hub.docker.comのレジストリ資格情報を取得しています...
[情報]ファイナライズしています...
[情報]
[情報] [java、-Xms256m、-Xdebug、-cp、/ app / resources:/ app / classes:/ app / libs / *、com.jibdemo.SpringBootJibApplication]に設定されたコンテナエントリポイント
[情報] Dockerデーモンにロードしています...
[情報]
[情報] localhost:5000 / springbootjib:0.0.1-SNAPSHOT、localhost:5000 / springbootjib:alpine、localhost:5000 / springbootjibとしてDockerデーモンにイメージを構築しました

上記のログセグメントでは、プラグインがイメージopenjdk:alpineをDocker Hubから取得し、3つの異なるタグ付きバージョンにイメージを構築し、ローカルリポジトリに保存したことに注目してください。

ジブで撮った理由

  • Dockerfileを維持したり、Dockerデーモンを実行したり、すべての依存関係を含むファットJARを作成する必要さえありません。
  • イメージの階層化とレジストリキャッシングを利用して、高速でインクリメンタルビルドを実現します。
  • 入力が同じである限り、再現可能なビルドイメージを作成するように構成できます。

結論

spotifyやfabric8のプラグインなど、他のMavenプラグインを使用してJavaアプリ用のdockerイメージを作成したので、Googleがこの問題に取り組むことを歓迎します。 fabric8のプラグインよりも必要なファイルが少なく、(私の謙虚な意見では)spotifyのプラグインよりも設定が簡単だと感じています。ぜひ試してみることをお勧めします!

免責事項:これは比較記事ではなく、個人的な経験に裏打ちされた問題に関する私の見解です。

JibのGitHubレポジトリでいつでも詳細を読むことができます。これには、すべての構成パラメーターに関する詳細な情報があります。ここまで読んでくれてありがとう!楽しんでいただけましたでしょうか!ここにフィードバックを残してください。

私について

おい、立ち寄ってくれてありがとう。私は独立したフルスタックエンジニアであり、バックエンドとdevOpsに重点を置いています。プロトタイプ/ MVPを作成し、クラウドで拡張可能なプラットフォームを開発して、ビジネス価値を生み出すことに興味があります。

私と私の話の詳細はこちらをご覧ください。ビジネスについて話し合いたい、または連絡を取りたい場合は、tasos.tsaousis @ codedlines.comにメールを送ってください。