🐰

Docker Composeを使って、Azure Container Instanceにビルド&デプロイする

2022/10/01に公開

1. はじめに

Azure Container Instancesにdocker-composeでデプロイを試みた際にあまり情報がまとまっていなかったので簡単に手順をまとめました。

1.1. 前提条件

- Docker CLI 1.0以上

Container Instancesは現在東日本リージョンのみ提供されているため、本手順では使用するリソースについてすべて東日本(japaneast)に統一してください。
利用するリージョンを統一しない場合、配備できない場合があります。
Container Instancesが使用可能なリージョン

1.2. 検証環境

  • Windows 10 Pro
  • Docker 20.10.5

2. Azureの環境準備

2.1. Azureにログイン

まずはじめにAzureポータルにログインします。

2.2. azure リソースグループの作成

ポータルよりリソースグループを作成。

  • リソースグループ名: rg-mycontainers
  • リージョン: 東日本

リソースグループの作成
リソースグループの作成

リソースグループの概要よりリソースグループが作成されたことを確認します。
リソースグループの確認
リソースグループの確認

2.3. コンテナレジストリの作成

MarketPlaceよりコンテナーレジストリを選択し、先ほど作成したリソースグループ内にコンテナーレジストリを作成します。

コンテナーレジストリの作成
コンテナーレジストリの作成

コンテナーレジストリの作成が完了したら、概要よりログインサーバーの情報を確認し記録します。
この情報は後の手順にて使用します。
作成されたレジストリの情報
作成されたレジストリの情報

デプロイに必要な管理者ユーザーを有効化します。
管理者ユーザの有効化
管理者ユーザの有効化

2.4. サービスプリンシパルの作成

アクセス用のサービスプリンシパルの作成のため、Azure Active Directoryのメニューよりアプリの登録を選択します。
アプリの登録メニュー
アプリ登録の選択

下記の内容を入力して、登録ボタンを押下します。

  • 名前: mycontainers
  • サポートされているアカウントの種類: この組織のみに含まれるアカウント(既定のディレクトリのみ - シングルテナント)

アプリケーションの登録
アプリケーションの登録

作成が完了したら概要に表示されるアプリケーション(クライアント)IDを記録しておきます。
概要
アプリの登録[概要]

シークレットを作成します。メニューより「証明書とシークレット」を選択し、「+新しいクライアントシークレット」をクリック。
DockerからAzureにログインする際に使用するため、クライアントシークレットを記録しておきます。

  • 説明: mycontainers
  • 有効期限: <任意の期間>

クライアントシークレットの追加
クライアントシークレットの追加

作成したサービスプリンシパルに使用しているサブスクリプションの所有者の権限を付与します。
厳密には所有者の権限は過剰かもしれませんが、今回は所有者を利用します。
所有者の権限追加
サービスプリンシパルへの権限の追加

以上でAzure環境の準備は完了です。

3. Dockerの環境準備

3.1. Docker Contextの追加

Dockerからdocker login azureコマンドを使用して、Azureへログインします。

> docker login azure --client-id <CLIENT-ID> --client-secret <CLIENT-SECRET> --tenant-id <TENANT-ID>
login succeeded

ログインが完了したら、Dockerのコンテストを追加するためdocker context createコマンドを実行してください。

> docker context create aci crmycontainers --subscription-id <YOUR-SUBSCRIPTION-ID> --resource-group "rg-mycontainers" --location "japaneast"
Successfully created aci context "crmycontainers"

Dockerのコンテキストが追加されたことを確認します。docker context listコマンドを実行してcrmycontainersがあることを確認してください。

> docker context list
NAME                TYPE                DESCRIPTION                               DOCKER ENDPOINT                  KUBERNETES ENDPOINT             ORCHESTRATOR
crmycontainers      aci                 rg-mycontainers@japaneast
default *           moby                Current DOCKER_HOST based configuration   npipe:////./pipe/docker_engine   https://34.97.6.169 (default)   swarm

4. Docker Compose関連ファイルの準備

docker-compose.ymlなどのContainer Instancesにデプロイする資材はgithubに準備しています。下記よりダウンロードしてください。
https://github.com/takker0708/zenn-elastic
ElasticStackをセットで起動しようとしましたがリソース不足となったのかうまく起動できなかったため、今回はlogstashを起動できるようにしています。

  • docker-compose.yml (本体)
  • docker-compose.local.yml (ローカル実行用) ※ 今回は使用しません。
  • docker-compose.azure.yml (Azure実行用)

docker-composeを分割してoverride実行する構成にしています。ストレージアカウントやイメージファイル名などAzureにデプロイするための特有の構成を切り分けるためです。
ストレージアカウント名が重複すると失敗しますので適宜変更してください。

version: '3'
services:
  logstash:
    image: crmycontainers20210519.azurecr.io/logstash:7.12.1

volumes:
  lsdata:
    driver: azure_file
    driver_opts:
      share_name: lsdata
      storage_account_name: stesdata20210519 

4.1. Azure Container Resistryへのビルド

コンテナーレジストリへのビルドを行っていきます。
az acr loginを実行してコンテナーレジストリにログインします。

az acr login --name crmycontainers20210519.azurecr.io
Login Succeeded

docker-composeをbuildオプションで実行し、logstashのイメージをビルドします。
ビルド完了後にdocker image lsコマンドでビルドイメージを確認にしてください。

docker-compose -f .\docker-compose.yml -f .\docker-compose.azure.yml build
docker image ls
REPOSITORY                                      TAG                     IMAGE ID       CREATED         SIZE
zenn-elastic_logstash                           latest                  f372cbb6fe17   24 hours ago    996MB

作成したビルドイメージにdocker tagコマンドでタグを付け、docker pushコマンドでコンテナーレジストリにプッシュします。

docker tag zenn-elastic_logstash crmycontainers20210519.azurecr.io/logstash:7.12.1
docker push crmycontainers20210519.azurecr.io/logstash:7.12.1

az acr repository listコマンドを利用して、コンテナーレジストリにイメージがプッシュされたことを確認します。

az acr repository list --name crmycontainers20210519.azurecr.io --output table
Result
--------
logstash

4.1.1. イメージパスの変更

コンテナーレジストリでイメージのパス確認してdocker-compose.azure.ymlのパスを変更しましょう。

version: '3'
services:
  logstash:
    image: crmycontainers20210519.azurecr.io/logstash:7.12.1

4.2. Azure Container Incetancesへのデプロイ

最後にコンテナグループとして、ビルドしたイメージをデプロイしていきます。
docker context useコマンドで利用するDockerコンテキストを作成したcrmycontainersに切り替えます。

$ docker context use crmycontainers
crmycontainers

コンテナグループとしてdocker composeコマンドでAzureにデプロイします。dockerとcomposeの間が-ではないことに注意してください。

docker compose -f docker-compose.yml -f docker-compose.azure.yml -p "ci-mycontainers" up
[+] Running 2/2
 - Group ci-mycontainers  Created                                                                                                                                                                     1.7s 
 - logstash               Created               

作成したリソースを確認しましょう。以上がdocker-composeを利用してコンテナグループをデプロイする手順となります。
完成!

Discussion