Docker Composeを使って、Azure Container Instanceにビルド&デプロイする
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