🎼

Docker Compose の構成ファイルを使って Azure Container Apps をデプロイする

2022/06/19に公開

Azure Container Apps にて、Docker Compose の構成ファイルを基にデプロイするためのコマンドが用意されているとのこと。

過去の記事で複数コンテナを一緒に立ち上げるときに若干面倒だったこともあり、本機能が気になったので試してみました。

環境・準備

  • Azure Container Apps
  • Windows 10
  • Windows PowerShell
  • Azure CLI (v2.37.0)

事前準備

下記のコマンドを実行し、拡張機能をインストールしておきます。

az extension add --name containerapp --upgrade --yes
az extension add --name containerapp-compose --upgrade --yes

使ったサンプル

おなじみ、Azure Vote を使ったチュートリアルを使いました。

やってみた

サンプルチュートリアルをベースとし、こちらのサンプルを参考に、docker-compose.yml ファイルを作成します。内容は下記の通り。

docker-compose.yml
version: '3'
services:
  azure-vote-back:
    image: mcr.microsoft.com/oss/bitnami/redis:6.0.8
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
    expose:
      - 6379
  azure-vote-front:
    image: mcr.microsoft.com/azuredocs/azure-vote-front:v1
    environment:
      - REDIS=azure-vote-back.internal.$AZURE_CONTAINERAPPS_ENV_DEFAULT_DOMAIN
    ports:
      - 8080:80

デプロイは docker-compose.yml ファイルがあるフォルダにて、下記のコマンド群を実行するだけです。リソースグループ名などは適宜変更してください。

$RGNAME="rg-hoge"
$ACANAME="aca-hoge"
az group create --name $RGNAME --location eastus
az containerapp compose create --environment  $ACANAME `
--resource-group $RGNAME

なお、Azure Container Apps 環境が無い場合、Log Analytics Workspace を含めて自動で新しく作成されます。お試し後に残す必要が無かったら削除するのを忘れないようにしましょう。

動作確認

さて、動作確認ですが、残念ながら正常に動作しません。

これは、azure-vote-front から azure-vote-back への通信、つまり Redis の通信が HTTP(S) または gRPC (HTTP/2) ではないため、正常にアプリが動作してくれないためでした。

「現状の Azure Container Apps の Ingress では、HTTP(S) または HTTP/2 でないとコンテナ間で通信できない」と、ブログにも書いてありました…確認不足😫

Currently, Azure Container Apps traffic between ingresses (internal or external) is over HTTP(S). This means that many application/database compose files are unlikely to work right away – given the ephemeral nature of storage, that makes sense and it’d be a better architecture to use one of the database services (which could be accessed from your application in Container Apps).

上記の記載の通り、現時点ではバックエンド通信が HTTP(S) または gRPC (HTTP/2) である構成で組む必要がありますね。

ちなみに、コンテナ間通信に gRPC を利用したサンプルが下記で公開されていますので、興味のある方はぜひ。

それでも分かったこと

ネットワーク設定の記述と Ingress 設定の連動

docker-compose のファイルにて expose でポートを公開すると、自動で「Container Apps 環境に限定」した Ingress 設定としてくれました。

また、この結果としてホスト名に internal が付くことになります。

一方、ports でポートを公開した場合は、外部からアクセスできる状態での Ingress の HTTP トラフィックが設定されます。あまり考えることなく Ingress を設定してくれるのは便利ですね。

Azure Portal での設定方法や、設定状況の確認方法は下記のドキュメントを参考にしてくださいませ。

環境変数の書き方

Azure Vote のチュートリアルでは、環境変数の書き方が key: "value" という表記になっていました。

今回の az containerapp compose コマンドでは、この書き方ではエラーになります。

現時点での Docker の公式ドキュメントでは key=value という表記を利用するようになっています。こちらの表記を使う必要があるので、過去の資材を流用する際は注意が必要です。

まとめ

最後までの動作確認はできませんでしたが、連動した仕組みはある程度追うことができたと思います。ネットワークの構成を解釈して Ingress 設定も実施してくれるのは嬉しいですね!

なお、Docker Compose の仕組みを全てカバーしているわけではないとのことですので、実際に使えるかどうかは検証してから判断しましょう。

Do you support the full Compose specification?
No, the extension supports much of the service definition from the Compose spec. We currently do not support “build” operations (though are looking into that as a future addition). Volume mounts and configuration mounts are also not supported.

Discussion