Spring Boot WEBサービスを ACI (Azure Container Instances) で起動する (Docker Hub カスタムコンテナイメージ)
目的
Spring Boot WEBサービスを Azure Container Instances 環境で起動して理解を深めます。
実現すること
Microsoft Azure Container Instances (ACI) に Spring Boot WEBアプリのカスタムコンテナイメージをデプロイします。
この記事では、Docker Hub にプュシュしたパブリックアクセスのカスタムコンテナイメージを使用しています。 実際のシステムを構築される際にはご注意ください。
Microsoft Azure Container Registry (ACR) を使用した構成の例として、以下の記事もございます。
技術背景
Microsoft Azure Container Instances (ACI) とは?
こちらを展開してご覧いただけます。
Microsoft Azure Container Apps (ACA)
Microsoft Azure Container Instances (ACI) は、コンテナを簡単にデプロイ・実行できるマネージドコンテナ実行環境です。クラウドネイティブアプリケーションやマイクロサービスを構築する上で、柔軟性が高く、シンプルな設定でコンテナを実行できる点が特徴です。
また、料金形態も課金単位を秒単位まで細かく設定できるため、使い方に応じた最適なコスト管理が可能です。
開発環境
- Windows 11 Home 22H2 を使用しています。
- WSL の Ubuntu を操作していきますので macOS の方も参考にして頂けます。
WSL (Microsoft Store アプリ版)
> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
Ubuntu
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.1 LTS
Release: 22.04
Java JDK ※ Java JDK の導入と Hello World!
$ java -version
openjdk version "11.0.17" 2022-10-18
OpenJDK Runtime Environment (build 11.0.17+8-post-Ubuntu-1ubuntu222.04)
OpenJDK 64-Bit Server VM (build 11.0.17+8-post-Ubuntu-1ubuntu222.04, mixed mode, sharing)
Maven ※ Maven の導入と Hello World!
$ mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.17, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Docker Desktop
Version 4.16.3 (96739)
$ docker --version
Docker version 20.10.22, build 3a2c30b
$ docker-compose --version
Docker Compose version v2.15.1
※ この記事では基本的に Ubuntu のターミナルで操作を行います。
"Hello World" を表示する手順
Spring Boot WEBサービスの作成
こちらを参照して頂けます。
プロジェクトフォルダに移動
※ ~/tmp/hello-spring-boot をプロジェクトフォルダとします。
$ cd ~/tmp/hello-spring-boot
Java アプリをビルド(※参考)
※ target/app.jar が作成されます。
※ 下の コンテナイメージを作成する操作でも同時に target/app.jar が作成されるので必須ではありません。
$ mvn clean install
コンテナイメージを作成
コンテナイメージをビルド
※ ローカルの Docker 環境 (Docker Desktop) に app-hello-spring-boot コンテナイメージが作成されます。
※ コンテナイメージの作成時間が Unix エポックになるのは spring-boot:build-image の仕様です。
$ mvn spring-boot:build-image \
-Dspring-boot.build-image.imageName=app-hello-spring-boot
コンテナイメージの確認
$ docker images | grep app-hello-spring-boot
app-hello-spring-boot latest e37cc77f2b36 43 years ago 262MB
ローカルでコンテナイメージを起動して確認
$ docker run --name app-local -p 8080:8080 app-hello-spring-boot
別ターミナルから curl コマンドで確認
※ 8080 ポートでリッスン出来ているか確認します。
$ curl -v http://localhost:8080/api/data
* Trying 127.0.0.1:8080...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /api/data HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Mon, 27 Feb 2023 07:18:25 GMT
<
* Connection #0 to host localhost left intact
{"message":"Hello World!"}
Docker Hub にコンテナイメージを登録
※ $USER の部分はご自身のコンテナレジストリに読み替えて下さい。
タグ付け
$ docker tag app-hello-spring-boot $USER/app-hello-spring-boot:latest
プュシュ
$ docker push $USER/app-hello-spring-boot:latest
Docker Hub に $USER/app-hello-spring-boot:latest としてカスタムコンテナイメージが公開出来ました。
Azure のアカウントを取得
Azure CLI でサインイン
こちらを参照して頂けます。
ログイン
$ az login
Azure 環境
リソースグループ
リソースグループを作成
$ az group create \
--name rg-hello \
--location japaneast
リソースグループ一覧表示
$ az group list
※ リソースグループを削除する場合
$ az group delete -n <group>
ACI 環境
コンテナグループの作成とデプロイ
※ Kubernetes 基盤の環境だと思われるので少し時間がかかります。
※ $USER の部分はご自身のコンテナレジストリに読み替えて下さい。
$ az container create \
--resource-group rg-hello \
--name ci-hello \
--image $USER/app-hello-spring-boot:latest \
--ip-address public \
--ports 8080
※ コンテナグループを削除する場合
$ az container delete -n <name> -g <group>
コンテナグループのIPアドレスを取得
$ az container show \
--resource-group rg-hello \
--name ci-hello \
--query ipAddress.ip \
--output tsv
20.46.187.231
WEBブラウザで確認
※ URLは環境で読み替えて下さい。
http://20.46.187.231:8080/api/data
WEBブラウザに {"message":"Hello World!"} と表示され、JSON データを取得することが出来ました。
※ 別ターミナルから curl コマンドで確認
$ curl -v http://20.46.187.231:8080/api/data
* Trying 20.46.187.231:8080...
* Connected to 20.46.187.231 (20.46.187.231) port 8080 (#0)
> GET /api/data HTTP/1.1
> Host: 20.46.187.231:8080
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Mon, 27 Feb 2023 08:12:19 GMT
<
* Connection #0 to host 20.46.187.231 left intact
{"message":"Hello World!"}
ターミナルに {"message":"Hello World!"} と表示され、JSON データを取得することが出来ました。
※ Azure 側で SSL/TLS対応や HTTP/2プロトコル適用などはされていないようです。
コンテナに接続
$ az container exec \
--resource-group rg-hello \
--name ci-hello \
--exec-command "/bin/bash"
コンテナに接続後
$ pwd
/workspace
$ ls -la
total 20
drwxr-xr-x 1 cnb cnb 4096 Jan 1 1980 .
drwxr-xr-x 1 root root 4096 Feb 27 08:10 ..
drwxr-xr-x 1 cnb cnb 4096 Jan 1 1980 BOOT-INF
drwxr-xr-x 3 cnb cnb 4096 Jan 1 1980 META-INF
drwxr-xr-x 3 cnb cnb 4096 Jan 1 1980 org
コンテナの情報
$ cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.6 LTS"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
NAME="Ubuntu"
ID=ubuntu
PRETTY_NAME="Paketo Buildpacks Base Bionic"
VERSION_ID="18.04"
HOME_URL="https://github.com/paketo-buildpacks/bionic-base-stack"
UBUNTU_CODENAME=bionic
VERSION="18.04.6 LTS (Bionic Beaver)"
ID_LIKE=debian
SUPPORT_URL="https://github.com/paketo-buildpacks/bionic-base-stack/blob/main/README.md"
BUG_REPORT_URL="https://github.com/paketo-buildpacks/bionic-base-stack/issues/new"
VERSION_CODENAME=bionic
まとめ
- Ubuntu のシンプルな構成の Java 開発環境で Spring Boot WEBサービスのカスタムコンテナイメージを ACI (Azure Container Instances) 環境で起動させることが出来ました。
個人的見解
- Microsoft Azure においては、Azure Container Apps という、コンテナイメージがより容易にデプロイ・運用出来る PaaS が開始されたので、Azure Container Instances の利用は用途によると思いました。
参考
[Microsoft Learn] Azure Container Instances (ACI) コマンド リファレンス