Loading
BLOG 開発者ブログ

2019年2月21日

jib を使って Java アプリケーションを超簡単にコンテナ化!

もっと簡単に Java アプリケーションを動かす Docker イメージをつくれたら…
そんな悩みを解決してくれるのが、jib というツールです。

モバイルソリューショングループの arai.ya です。こんにちは。
先日、Google が jib の GA リリースを発表しました。この記事では、jib の基本的な使い方を見ていきます。

jib とは?

jib は、Google がオープンソースとして公開している、Java アプリケーションを実行する Docker コンテナイメージを超簡単に作成するためのツールです。Maven や Gradle のプラグインとしてインストールし使用します。

従来 Java アプリケーションをコンテナ化しようとすると、Docker 環境を用意して、Dockerfile を書いて、イメージをビルドして、リポジトリにプッシュして、…と意外に面倒で時間がかかる作業が発生していました。

jib を使うと、Docker 環境をローカルにインストールする必要はありません。なんと Dockerfile を書く必要もありません。とても簡単に Docker イメージを作成できるので、開発者はアプリケーションのコードを書くという本来の役割に集中できますね。

jib は昨年からベータ版として公開されていましたが、先日ついにGA版がリリースされました。

それでは、さっそくつかってみましょう。

jib をつかってみよう!

今回は、Spring Boot の簡単なサンプルアプリケーションをコンテナイメージ化してみます。

次のものが用意されている前提です。

  • Git クライアント
  • Google Cloud Platform プロジェクト
  • Docker Desktop などローカルで Docker を動かせる環境(無くても大丈夫!)

以下のような流れで、jib でどんなことができるのかを見ていきましょう。

  1. サンプルコードの取得
  2. jib で簡単に Docker イメージをつくる
  3. jib で簡単につくった Docker イメージを GCP で動かしてみる

1. サンプルプロジェクトの取得

この Spring Boot のサンプルアプリケーションを使用します。

ソースコードを任意のディレクトリにクローンします。

git clone https://github.com/spring-guides/gs-spring-boot.git
cd gs-spring-boot/complete/

まずは、普通に jar をつくってアプリケーションを起動してみましょう。

./gradlew build && java -jar build/libs/gs-spring-boot-0.1.0.jar

ウェブブラウザで http://localhost:8080 にアクセスすると、

このような画面が表示されれば成功です。Ctrl-C などでアプリケーションを終了してください。

それでは、jib を使ってこのアプリケーションを Docker イメージにしてみます。

2. jib で簡単に Docker イメージをつくってローカルで動かしてみる

まずは、ローカルで Docker イメージを作成してみます。(ローカルに Docker 環境が無い方は、ここはスキップして次へ進んでください。)

jib の gradle プラグインを使用するため、 build.gradle 内、 buildscript ブロックの下に、以下を追記します。

plugins {
  id 'com.google.cloud.tools.jib' version '1.0.0'
}

jib {
  to {
    image = 'play-with-jib/gs-spring-boot'
  }
}

次のコマンドを実行します。

./gradlew jibDockerBuild

これだけで Docker イメージの出来上がりです!

作成したイメージからコンテナを起動して確認してみましょう。

docker run -it --rm -p 8080:8080 play-with-jib/gs-spring-boot

ウェブブラウザで http://localhost:8080 を開いてみます。

コンテナが正常に起動すると、先ほどと同じ画面が表示されます。

3. jib で簡単に Docker イメージをつくって GCP 上で動かしてみる

ここまでで、とても簡単に Java アプリケーションを Docker イメージ化できることがわかりました。次は、GCP の Dockerリポジトリ(Container Registry)にイメージをプッシュし、そのイメージからコンテナを GCP 上で起動してみます。

予め、使用するプロジェクトで GCE API と Container Registry API を有効化しておいてください。

jib が Container Registry へ Docker イメージをプッシュするために、GCP プロジェクトへの認証が必要になります。今回は、サービスアカウントを作成して認証を行います。

用意した GCP プロジェクトのサービスアカウントコンソールを開きます。

サービスアカウントを作成します。

適当な名前のサービスアカウントをつくって、

ここでサービスアカウントに「ストレージ管理者」の権限を与えてください。(Container Registry にイメージをプッシュするために必要です。)

キーを JSON 形式でダウンロードします。

ダウンロードした JSON ファイルは、 build.gradle と同じディレクトリに配置します。

"GCPプロジェクトID""さっきダウンロードしたJSONファイル名"は適宜読み替えてください。

plugins {
  id 'com.google.cloud.tools.jib' version '1.0.0'
}

jib {
  to {
    image = 'gcr.io/"GCPプロジェクトID"/gs-spring-boot'
    auth {
      username = '_json_key'
      password = file('"さっきダウンロードしたJSONファイル名".json').text
    }
  }
}

以下のコマンドを実行すると、Docker イメージの作成から、用意した GCP プロジェクトの Container Registry へのプッシュまで、自動で行ってくれます。

./gradlew jib

Container Registry コンソールで、イメージが登録されていることを確認します。

つくったイメージが登録されています

Container Registry に登録したイメージから、Compute Engine 上にコンテナを起動してみましょう。

Compute Engine コンソールから、新しく VM インスタンスを作成します。

ここで、VM にコンテナをデプロイするオプションがあるので、これにチェックを入れ、コンテナイメージには、先程つくって Container Registry にプッシュしたイメージ名を指定します。

今回の Java アプリケーションは 8080 ポートでアクセスするので、ファイアウォールに 8080 ポートの通信を許可するよう設定を追加します。

アクセスするための IP アドレスをメモしておきます。

ウェブブラウザで 外部IP:8080 にアクセスすると…

コンテナが起動しているのが確認できました。とても簡単ですね。

ひととおり遊び終わったら、作成したインスタンスを削除するのを忘れずに。

おわりに

jib を使うことで、Java アプリケーションをとても簡単にコンテナ化できることがわかりました。
GAになったので、これから Java アプリケーションを Docker に乗せたいなーと考えている方は、ぜひ jib の利用を検討してみてください。

arai.yaのブログ