はじめに
近年、アプリケーションをコンテナ化する流れが一般的になっています。
特に、Spring Boot のようなクラウドネイティブなフレームワークを使う場合、アプリケーションのコンテナ化は容易で、開発の流れに組み込むメリットも大きいです。
しかし、従来の手動で Dockerfile を記述してコンテナイメージを作成・運用する方法には、以下のような課題があります。
- ベースイメージやライブラリに既知の脆弱性が含まれているリスクがある
- Dockerfile は個人の経験や知識に依存するため、ベストプラクティスから外れた内容になりがち
- Dockerfile の内容が陳腐化して、セキュリティホールやパフォーマンス低下を招く可能性がある
こうした課題から、最適化されたセキュアなコンテナイメージを維持・更新するのは難しい問題です。
Spring Boot 2.3 以降では、こうした課題を解決し、より安全で高パフォーマンスなコンテナイメージを作成する方法として、Cloud Native Buildpacks (CNB)
が標準で提供されています。
CNB を使用することで、開発者はアプリケーションのソースコードさえ用意すれば、以下の作業を自動化することができます。
- ベストプラクティスに沿った最新のベースイメージ・ライブラリの選択
- アプリケーションコードと依存ライブラリのレイヤー分離による最適化
- 最適化された Docker イメージのビルド
つまり CNB は、常に最新のベストプラクティスに基づいてセキュリティ、パフォーマンス、最適化面で適切な判断と設定を自動的に行ってくれるため、運用が大幅に効率化できます。
本記事では、Spring Boot Gradle プロジェクトで、この CNB を活用してコンテナイメージをビルドする手順を紹介します。
Gradle で CNB を使ってコンテナイメージを構築する
Spring Boot Gradle プロジェクトで、CNB を使ってコンテナイメージを作成するには、bootBuildImage
タスクを実行します。
このタスクは、内部で CNB を利用し、最適なコンテナイメージのビルドを自動化してくれます。
事前準備
bootBuildImage
タスクは、bootJar
タスクの出力を使用するため、プロジェクトには Spring Boot Gradle
プラグインに加えて、java
プラグインを適用する必要があります。
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.5'
}
また、このタスクは Docker デーモンへのアクセスを必要とするため、Docker サービスが稼働していることを確認しましょう。
bootBuildImage タスクを実行する
以下のコマンドで、bootBuildImage
タスクを実行できます。
$ ./gradlew bootBuildImage
カスタマイズ
必要に応じて、bootBuildImage
タスクの設定をカスタマイズできます。
例えば、イメージ名を指定する場合は、build.gradle
に以下を追記します。
tasks.named("bootBuildImage") {
imageName = 'demo:0.0.1-SNAPSHOT'
}
コマンドライン引数で指定することもできます。
$ ./gradlew bootBuildImage --imageName=demo:0.0.1-SNAPSHOT
他にも、ベースイメージの指定や Docker ホストの指定など、様々なオプションを設定可能です。
実行結果の確認
イメージのビルド後、docker images
コマンドで新しいイメージが作成されたことを確認できます。
$ docker images
demo 0.0.1-SNAPSHOT edd8f... 4 seconds ago 300MB
コンテナの実行
作成したイメージからコンテナを実行するには、以下の Docker run
コマンドを実行します。
$ docker run -p 8080:8080 demo:0.0.1-SNAPSHOT
Spring Boot アプリケーションは、デフォルトでコンテナ内の 8080 番ポートで実行されるため、-p 8080:8080
を指定して、外部からアクセスできるようにホストのポートをマッピングしています。
最後に、ブラウザで http://localhost:8080 にアクセスすれば、アプリケーションの出力を確認できます。
さいごに
以上、CNB を使って Spring Boot アプリケーションのコンテナイメージをビルドする方法を紹介しました。
アプリケーションのコンテナ化は避けて通れない道となっていますが、CNB によって開発者は最小限の手間でベストプラクティスに沿ったセキュアで最適化された Docker イメージを自動構築できます。
特に Spring Boot では CNB の導入が非常に簡単ですので、ぜひ活用されてみてはいかがでしょうか。
参考
▼ Spring Boot Gradle プラグインリファレンスガイド - ドキュメント (pleiades.io)
▼ Spring Boot コンテナイメージ - リファレンスドキュメント (pleiades.io)
▼ Configuring Gradle Tasks in Spring Boot 3 | Baeldung
▼ Dockerfile の属人化による脆弱性を防げ ベストなイメージが作成可能な Cloud Native Buildpacks の使い方 - ログミー Tech (logmi.jp)