Spring Boot WEBサービスを ACI (Azure Container Instances) で起動する (ACR カスタムコンテナイメージ)
目的
Spring Boot WEBサービスを Azure Container Instances 環境で起動して理解を深めます。
実現すること
Microsoft Azure Container Instances (ACI) に Spring Boot WEBアプリのカスタムコンテナイメージをデプロイします。
技術背景
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サービスの作成
Spring Boot WEBサービスの Hello World! を参照して頂けます。
プロジェクトフォルダに移動
※ ~/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
app-hello-spring-boot-app latest e37cc77f2b36 43 years ago 262MB
Azure のアカウントを取得
Azure CLI でサインイン
Azure CLI をインストールする手順 を参照して頂けます。
$ az login
Azure 環境
リソースグループ
リソースグループを作成
$ az group create \
--name rg-hello \
--location japaneast
リソースグループ一覧表示
$ az group list
※ リソースグループを削除する場合
$ az group delete -n <group>
コンテナ レジストリ
コンテナ レジストリを作成
※ --sku Free では作成できません。
※ --name はパブリックで一意の値が求められます。
$ az acr create \
--resource-group rg-hello \
--name cr20230212 \
--sku Basic
コンテナ レジストリ一覧表示
$ az acr list
コンテナ レジストリログイン資格情報を表示
$ az acr update -n cr20230212 --admin-enabled true
$ az acr credential show \
--resource-group rg-hello \
--name cr20230212
{
"passwords": [
{
"name": "password",
"value": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
},
{
"name": "password2",
"value": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
],
"username": "cr20230212"
}
※ コンテナ レジストリを削除する場合
$ az acr delete --n <acr-name>
コンテナ レジストリにログイン
$ az acr login --name cr20230212
コンテナイメージをコンテナ レジストリにプュシュ
$ docker tag app-hello-spring-boot cr20230212.azurecr.io/app-hello-spring-boot:latest
$ docker push cr20230212.azurecr.io/app-hello-spring-boot:latest
コンテナ レジストリのイメージを確認
$ az acr repository list --name cr20230212 --output table
Result
---------------------
app-hello-spring-boot
ローカルの コンテナイメージを Azure コンテナ レジストリにプュシュすることが出来ました。
ACI 環境
コンテナグループの作成とデプロイ
$ az container create \
--resource-group rg-hello \
--name ci-hello \
--image cr20230212.azurecr.io/app-hello-spring-boot:latest \
--registry-login-server cr20230212.azurecr.io \
--registry-username cr20230212 \
--registry-password XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \
--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.222.223.225
WEBブラウザで確認
※ URLは環境で読み替えて下さい。
http://20.222.223.225:8080/api/data
WEBブラウザに {"message":"Hello World!"} と表示され、JSON データを取得することが出来ました。
※ 別ターミナルから curl コマンドで確認
$ curl -v http://20.222.223.225:8080/api/data
* Trying 20.222.223.225:8080...
* Connected to 20.222.223.225 (20.222.223.225) port 8080 (#0)
> GET /api/data HTTP/1.1
> Host: 20.222.223.225: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.222.223.225 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) 環境で起動させることが出来ました。