Azure Container Apps (コンテナー アプリ)を動かしてみる

片倉洋一

今回は Azure Container Apps (コンテナー アプリ)を使って、簡単な WebAPI を作ってみたいと思います。

Azure Container Apps とは

Azure Container Apps とは Azure 上でコンテナーをデプロイして、そのコンテナーを実行できる仕組みです。
docker.io などのリポジトリ上のコンテナーだけでなく、 Azure Container Registry にローカルのコンテナイメージを登録して動かくすことも可能です。

詳しくは、以下の公式サイトを参照してください。

Azure Container Apps | Microsoft Azure

前提条件

今回のコラムでは、Azure CLI と Docker と docker compose を利用しています。

今回の手順

  1. Azure Container Registry を作成する
  2. ローカル環境で動かしたいコンテナーを作成する
  3. 作成したコンテナーを Azure Container Registry にコンテナイメージとして登録する
  4. 登録したコンテナイメージを Azure Container Apps で動かす

Azure Container Registry を作成する

まずは、 Azure Container Registry を作成する必要があります。
まだ、 Azure CLI でログインしていない場合は、ログインしましょう。

$ az login
gio: https://login.microsoftonline.com/(省略)
[
  {
    "cloudName": "AzureCloud",
    (省略)
  }
]
$

以下のコマンドで Azure Container Registry を作成します。

$ az acr create \
--resource-group (指定のリソースグループ) \
--name mycontainerregistrytest \
--sku Basic \
--admin-enabled
{
  "adminUserEnabled": true,
  (省略)
  "name": "mycontainerregistrytest ",
  (省略)
  "resourceGroup": "(指定のリソースグループ)",
  "sku": {
    "name": "Basic",
    "tier": "Basic"
  },
  (省略)
}
$

パラメータの詳細は以下を参照してください。

az acr | Microsoft Learn

今回 --admin-enabled を付けて管理者ユーザーを有効化しています。
管理者ユーザーを有効化しておかないと、Azure Container Apps から対象のコンテナイメージが参照できないためです。

ローカル環境で動かしたいコンテナーを作成する

続いてローカル環境で Azure Container Apps で動かすためのコンテナーを作成します。
今回は Flask を利用した簡単な WebAPI を作りたいと思います。

まずは、以下のサイトに docker compose 用多数のサンプルが用意されたリポジトリがありますので、そこからクローンします。

GitHub – docker/awesome-compose: Awesome Docker Compose samples

git clone https://github.com/docker/awesome-compose.git

クローンしたディレクトリ内に /flask ディレクトリがありますので、そのディレクトリに移動しコンテナーを起動します。

$ docker compose up -d
[+] Building 4.4s (12/12) FINISHED                                                                       docker:default
(省略)
 ✔ Network flask_default  Created                                                                                  0.1s
 ✔ Container flask-web-1  Started
$

正常に起動したことを確認したところで、 以下のコマンドでコンテナーを確認します。

$ docker ps -a
CONTAINER ID   IMAGE       COMMAND            CREATED          STATUS          PORTS
   NAMES
5132008cdb9c   flask-web   "python3 app.py"   22 seconds ago   Up 21 seconds   0.0.0.0:8000->8000/tcp, :::8000->8000/tcp   flask-web-1
$ curl localhost:8000
Hello World!
$

正しく確認出来たら、一旦コンテナーを削除します。

$ docker compose down
[+] Running 2/2
 ✔ Container flask-web-1  Removed                                                                                  0.6s
 ✔ Network flask_default  Removed                                                                                  0.8s
$

このままこのコンテナーを使ってもいいのですが、 WebAPI っぽくするためにコードを修正します。
flask のディレクトリ内に app ディレクトリがあり、その中に app.py というファイルがあります。
これが Web サーバの処理の本体になるので、このコードを vi などで以下のように修正します。

from flask import Flask
import uuid
app = Flask(__name__)

@app.route('/')
def hello():
        return "Hello World!"

@app.route('/generate-uuid')
def generate_uuid():
    return str(uuid.uuid4())

if __name__ == '__main__':
        app.run(host='0.0.0.0', port=8000)

内容としては /generate-uuid にアクセスしたらランダムな UUID を返すという処理です。
コードを修正したら、コンテナイメージをリビルドしてコンテナーを再度起動します。

$ docker compose build
[+] Building 4.8s (12/12) FINISHED                                                                       docker:default
(省略)
$ docker compose up -d
[+] Running 2/2
 ✔ Network flask_default  Created                                                                                  0.2s
 ✔ Container flask-web-1  Started                                                                                  0.5s
$

正常に起動したことを確認したところで、 再びコンテナーを確認します。

$ docker ps -a
CONTAINER ID   IMAGE       COMMAND            CREATED          STATUS          PORTS
   NAMES
0c7666a61196   flask-web   "python3 app.py"   48 seconds ago   Up 47 seconds   0.0.0.0:8000->8000/tcp, :::8000->8000/tcp   flask-web-1
$ curl localhost:8000
Hello World!
$ curl localhost:8000/generate-uuid
7b081b12-0133-41c1-a282-7022f71e757d
$

正しくコンテナーが作成できたことが確認できたのであれば、コンテナーを停止してください(削除ではないので気をつけてください)。

$ docker compose stop
[+] Stopping 1/1
 ✔ Container flask-web-1  Stopped                                                                                  0.6s
$

作成したコンテナーを Azure Container Registry にコンテナイメージとして登録する

正しくコンテナーが作成できたところで、次はその作成したコンテナーをコンテナイメージとして Azure Container Registry に登録します。

まずは、先ほど作成した Azure Container Registry にログインします。

$ az acr login --name mycontainerregistrytest
Login Succeeded
$

ログインが成功したら、以下のコマンドで Azure Container Registry のログインサーバーの情報を確認します。

$ az acr show --name mycontainerregistrytest --query loginServer
"mycontainerregistrytest.azurecr.io"
$

ログインサーバーの情報( mycontainerregistrytest.azurecr.io )が確認できましたら、続いて先ほど停止したコンテナー名を確認します。

$ docker ps -a
CONTAINER ID   IMAGE       COMMAND            CREATED          STATUS                     PORTS     NAMES
0c7666a61196   flask-web   "python3 app.py"   26 minutes ago   Exited (0) 6 minutes ago             flask-web-1
$

コンテナー名を確認できました。
それでは、このコンテナーを Azure Container Registry に登録するために、作成したコンテナーをコンテナイメージとしてコミットします。

$ docker commit flask-web-1 mycontainerregistrytest.azurecr.io/flask-test:1.0.0
sha256:01234567890abcdef01234567890abcdef01234567890abcdef01234567890ab
$

flask-web-1 は先ほど確認したコンテナー名です。
mycontainerregistrytest.azurecr.io は先ほど取得したログインサーバーの情報です。
ログインサーバー以降の値は任意の指定ですので、今回は以下の内容で進めます。

  • イメージ名:flask-test
  • タグ:1.0.0

コミットが正常にできましたら、そのコンテナイメージを Azure Container Registry にプッシュします。

$ docker push mycontainerregistrytest.azurecr.io/flask-test:1.0.0
The push refers to repository [mycontainerregistrytest.azurecr.io/flask-test]
(省略)
1.0.0: digest: sha256:01234567890abcdef01234567890abcdef01234567890abcdef01234567890ab size: 2408
$

正常に Azure Container Registry に登録されたか確認します。

$ az acr repository list --name mycontainerregistrytest
[
  "flask-test"
]
$

このように先ほどプッシュしたコンテナイメージ名が表示されれば正しく登録されています。

登録したコンテナイメージを Azure Container Apps で動かす

それでは登録したコンテナイメージを Azure Container Apps で起動します。

まずは Azure Container Apps 用の環境設定を作成します。

$ az containerapp env create \
--resource-group (指定のリソースグループ) \
--name my-container-test-app-env \
--location japaneast \
--enable-workload-profiles false \
--logs-destination none

Container Apps environment created. To deploy a container app, use: az containerapp create --help

{
  "id": "(省略)",
  "location": "Japan East",
  "name": "my-container-test-app-env",
  "properties": {
    "appLogsConfiguration": {
      "destination": null,
      "logAnalyticsConfiguration": null
    },
(省略)
    "workloadProfiles": null,
    "zoneRedundant": false
  },
  "resourceGroup": "(指定のリソースグループ)",
(省略)
}
$

パラメータの詳細は以下を参照してください。

az containerapp env | Microsoft Learn

正常に Azure Container Apps 用の環境設定が作成できましたら、先ほどのコンテナイメージを用いて Azure Container Apps を作成します。

$ az containerapp create \
--resource-group (指定のリソースグループ) \
--name my-container-test-app \
--environment my-container-test-app-env \
--image mycontainerregistrytest.azurecr.io/flask-test:1.0.0 \
--ingress external \
--target-port 8000 \
--registry-server mycontainerregistrytest.azurecr.io \
--query properties.configuration.ingress.fqdn
No credential was provided to access Azure Container Registry. Trying to look up credentials...
Adding registry password as a secret with name "(省略)"

Container app created. Access your app at https://(コンテナ接続URL)/

"(コンテナ接続URL)"
$

パラメータの詳細は以下を参照してください。

az containerapp | Microsoft Learn

今回はイングレスルールを設定しましたので、自動的にコンテナに接続するための URL が発行されます。
最後に実際に正しく動くか確認してみます。

$ curl https://(コンテナ接続URL)/
Hello World!
$ curl https://(コンテナ接続URL)/generate-uuid
ea652012-02d8-4da6-b222-bdb73f372a68
$

正しく動くことが確認できました。

このように、簡単な手順で Azure 上で任意のコンテナーを動かくすことができました。
Azure でもコンテナーを動かす仕組みが色々用意されていますので、是非活用してみてください。

<< コンテナイメージをAWS Lambda関数にデプロイしてみましたWordPress 6.5で翻訳処理が高速化。裏側に迫る。 >>

関連記事

Webサイト運用の課題解決事例100選 プレゼント

Webサイト運用の課題を弊社プロダクトで解決したお客様にインタビュー取材を行い、100の事例を108ページに及ぶ事例集としてまとめました。

・100事例のWebサイト運用の課題と解決手法、解決後の直接、間接的効果がわかる

・情報通信、 IT、金融、メディア、官公庁、学校などの業種ごとに事例を確認できる

・特集では1社の事例を3ページに渡り背景からシステム構成まで詳解