チュートリアル:Docker Compose を使用して複数コンテナー グループをデプロイする

このチュートリアルでは、Docker Compose を使用して複数コンテナー アプリケーションをローカルで定義して実行した後、Azure Container Instances にコンテナー グループとしてデプロイします。

Docker を使用してクラウドネイティブ アプリを開発していて、ローカルでの開発からクラウドへのデプロイにシームレスに切り替えたい場合は、Azure Container Instances でコンテナーをオンデマンドで実行します。 この機能は、Docker と Azure 間の統合によって実現されます。 ネイティブ Docker コマンドを使用すると、Azure で 1 つのコンテナー インスタンスまたは複数コンテナー グループを実行できます。

重要

Azure Container Instances の一部の機能はサポートされていません。 Docker ACI Integration GitHub リポジトリでイシューを作成して、Docker と Azure の統合に関するフィードバックを提供してください。

ヒント

コンテナー、イメージ、コンテキストを開発、実行、管理するための統合エクスペリエンスとして、Visual Studio Code 用の Docker 拡張機能を使用できます。

この記事では、次の内容について説明します。

  • Azure コンテナー レジストリを作成する
  • GitHub からアプリケーション ソース コードを複製する
  • Docker Compose を使用してイメージをビルドし、複数コンテナー アプリケーションをローカルで実行する
  • アプリケーション イメージをコンテナー レジストリにプッシュする
  • Docker 用の Azure コンテキストを作成する
  • Azure Container Instances にアプリケーションをデプロイする

前提条件

  • Azure CLI - ローカル コンピューターに Azure CLI がインストールされている必要があります。 バージョン 2.10.1 以降をお勧めします。 バージョンを確認するには、az --version を実行します。 インストールまたはアップグレードが必要な場合は、Azure CLI のインストールに関するページを参照してください。

  • Docker Desktop - Windows または macOS で利用可能な、Docker Desktop バージョン 2.3.0.5 以降を使用する必要があります。 または、Docker ACI Integration CLI for Linux をインストールします。

Azure Container Registry の作成

コンテナー レジストリを作成する前に、そのデプロイ先となるリソース グループが必要です。 リソース グループは、Azure リソースをまとめてデプロイして管理するための論理上のコレクションです。

az group create コマンドを使用して、リソース グループを作成します。 次の例では、myResourceGroup という名前のリソース グループが eastus リージョンに作成されます。

az group create --name myResourceGroup --location eastus

リソース グループを作成したら、az acr create コマンドを使用して Azure コンテナー レジストリを作成します。 コンテナー レジストリ名は、Azure 内で一意にする必要があります。また、5 ~ 50 文字の英数字を含める必要があります。 <acrName> を、レジストリの一意の名前に置き換えます。

az acr create --resource-group myResourceGroup --name <acrName> --sku Basic

mycontainerregistry082 という名前の新しい Azure Container Registry の出力の一部を次に示します。

{
  "creationDate": "2020-07-16T21:54:47.297875+00:00",
  "id": "/subscriptions/<Subscription ID>/resourceGroups/myResourceGroup/providers/Microsoft.ContainerRegistry/registries/mycontainerregistry082",
  "location": "eastus",
  "loginServer": "mycontainerregistry082.azurecr.io",
  "name": "mycontainerregistry082",
  "provisioningState": "Succeeded",
  "resourceGroup": "myResourceGroup",
  "sku": {
    "name": "Basic",
    "tier": "Basic"
  },
  "status": null,
  "storageAccount": null,
  "tags": {},
  "type": "Microsoft.ContainerRegistry/registries"
}

このチュートリアルの残りの部分では、この手順で選択したコンテナー レジストリ名のプレースホルダーとして <acrName> を使用します。

コンテナー レジストへのにログイン

イメージをプッシュする前に、Azure Container Registry インスタンスにログインする必要があります。 az acr login コマンドを使用して、操作を完了します。 コンテナー レジストリの作成時に選んだ一意名を指定する必要があります。

az acr login --name <acrName>

次に例を示します。

az acr login --name mycontainerregistry082

このコマンドは、完了すると Login Succeeded を返します。

Login Succeeded

アプリケーションのコードを入手する

このチュートリアルで使うサンプル アプリケーションは、基本的な投票アプリです。 アプリケーションは、フロントエンド Web コンポーネントとバックエンド Redis インスタンスで構成されています。 Web コンポーネントは、カスタム コンテナー イメージにパッケージ化されています。 Redis インスタンスでは、Docker Hub から変更されていないイメージを使用します。

サンプル アプリケーションを開発環境にクローンするには、git を使用します。

git clone https://github.com/Azure-Samples/azure-voting-app-redis.git

複製されたディレクトリに移動します。

cd azure-voting-app-redis

ディレクトリ内にはアプリケーションのソース コードと、事前作成された Docker Compose ファイルである docker-compose.yaml があります。

Docker Compose ファイルの変更

テキスト エディターで docker-compose.yaml を開きます。 このファイルでは、azure-vote-back および azure-vote-front サービスが構成されます。

version: '3'
services:
  azure-vote-back:
    image: mcr.microsoft.com/oss/bitnami/redis:6.0.8
    container_name: azure-vote-back
    environment:
      ALLOW_EMPTY_PASSWORD: "yes"
    ports:
        - "6379:6379"

  azure-vote-front:
    build: ./azure-vote
    image: mcr.microsoft.com/azuredocs/azure-vote-front:v1
    container_name: azure-vote-front
    environment:
      REDIS: azure-vote-back
    ports:
        - "8080:80"

azure-vote-front 構成で、次の 2 つの変更を行います。

  1. azure-vote-front サービスの image プロパティを更新します。 イメージ名の前に、Azure コンテナー レジストリのログイン サーバー名 <acrName>.azurecr.io を付けます。 たとえば、レジストリに myregistry という名前が付けられている場合、ログイン サーバー名は myregistry.azurecr.io (すべて小文字) になり、イメージ プロパティは myregistry.azurecr.io/azure-vote-front となります。
  2. ports マッピングを 80:80 に変更します。 ファイルを保存します。

更新されたファイルは、次のようになります。

version: '3'
services:
  azure-vote-back:
    image: mcr.microsoft.com/oss/bitnami/redis:6.0.8
    container_name: azure-vote-back
    environment:
      ALLOW_EMPTY_PASSWORD: "yes"
    ports:
        - "6379:6379"

  azure-vote-front:
    build: ./azure-vote
    image: myregistry.azurecr.io/azure-vote-front
    container_name: azure-vote-front
    environment:
      REDIS: azure-vote-back
    ports:
        - "80:80"

これらの置換を行うことによって、次の手順で作成する azure-vote-front イメージに Azure コンテナー レジストリ用のタグが付けられ、イメージをプルして Azure Container Instances で実行できるようになります。

ヒント

このシナリオでは、Azure コンテナー レジストリを使用する必要はありません。 たとえば、アプリケーション イメージをホストするために、Docker Hub でプライベート リポジトリを選択できます。 別のレジストリを選択した場合は、イメージのプロパティを適切に更新します。

複数コンテナー アプリケーションをローカルで実行する

docker-compose up を実行すると、サンプル docker-compose.yaml ファイルを使用してコンテナー イメージをビルドし、Redis イメージをダウンロードして、アプリケーションを起動します。

docker-compose up --build -d

完了したら、docker images コマンドを使って、作成されたイメージを確認します。 3 つのイメージがダウンロードまたは作成されていることを確認してください。 azure-vote-front イメージには、uwsgi-nginx-flask イメージをベースとして使用するフロントエンド アプリケーションが含まれています。 redis イメージは、Redis インスタンスを起動するために使用されます。

$ docker images

REPOSITORY                                TAG        IMAGE ID            CREATED             SIZE
myregistry.azurecr.io/azure-vote-front    latest     9cc914e25834        40 seconds ago      944MB
mcr.microsoft.com/oss/bitnami/redis       6.0.8      3a54a920bb6c        4 weeks ago          103MB
tiangolo/uwsgi-nginx-flask                python3.6  788ca94b2313        9 months ago        9444MB

docker ps コマンドを実行して、実行中のコンテナーを確認します。

$ docker ps

CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS                           NAMES
82411933e8f9        myregistry.azurecr.io/azure-vote-front     "/entrypoint.sh /sta…"   57 seconds ago      Up 30 seconds       443/tcp, 0.0.0.0:80->80/tcp   azure-vote-front
b62b47a7d313        mcr.microsoft.com/oss/bitnami/redis:6.0.8  "/opt/bitnami/script…"   57 seconds ago      Up 30 seconds       0.0.0.0:6379->6379/tcp          azure-vote-back

実行中のアプリケーションを表示するには、ローカルの Web ブラウザーで「 http://localhost:80」と入力します。 次の例で示すように、サンプル アプリケーションが読み込まれます。

投票アプリの画像

ローカル アプリケーションの試行が終了したら、docker-compose down を実行してアプリケーションを停止し、コンテナーを削除します。

docker-compose down

コンテナー レジストリにイメージをプッシュする

アプリケーションを Azure Container Instances にデプロイするには、azure-vote-front イメージをコンテナー レジストリにプッシュする必要があります。 docker-compose push を実行してイメージをプッシュします。

docker-compose push

レジストリにプッシュされるまでに数分かかる場合があります。

イメージがレジストリに格納されたことを確認するには、az acr repository show コマンドを実行します。

az acr repository show --name <acrName> --repository azuredocs/azure-vote-front

Azure コンテキストを作成する

Docker コマンドを使用して Azure Container Instances でコンテナーを実行するには、最初に Azure にログインします。

docker login azure

メッセージが表示されたら、Azure の資格情報を入力または選択します。

docker context create aci を実行して、ACI コンテキストを作成します。 このコンテキストにより、Azure サブスクリプションとリソース グループに Docker が関連付けられて、コンテナー インスタンスを作成、管理できるようになります。 たとえば、myacicontext というコンテキストを作成するには、次のように入力します。

docker context create aci myacicontext

プロンプトが表示されたら、Azure サブスクリプション ID を選択してから、既存のリソース グループを選択するか、新しいリソース グループを作成します。 新しいリソース グループを選択すると、システムによって生成された名前で作成されます。 Azure のコンテナー インスタンスは、すべての Azure リソースと同様に、リソース グループにデプロイする必要があります。 リソース グループを使用すると、関連する Azure リソースを整理して管理できます。

docker context ls を実行して、Docker コンテキストに ACI コンテキストを追加したことを確認します。

docker context ls

アプリケーションを Azure Container Instances にデプロイする

次に、ACI コンテキストに変更します。 以降の Docker コマンドは、このコンテキストで実行されます。

docker context use myacicontext

docker compose up を実行して、Azure Container Instances でアプリケーションを起動します。 azure-vote-front イメージがコンテナー レジストリからプルされ、コンテナー グループが Azure Container Instances に作成されます。

docker compose up

Note

ACI コンテキストで現在使用できる Docker Compose コマンドは docker compose updocker compose down です。 これらのコマンドには、dockercompose の間にハイフンはありません。

しばらくすると、コンテナー グループがデプロイされます。 サンプル出力:

[+] Running 3/3
 ⠿ Group azurevotingappredis  Created                          3.6s
 ⠿ azure-vote-back            Done                             10.6s
 ⠿ azure-vote-front           Done                             10.6s

docker ps を実行して、実行中のコンテナーとコンテナー グループに割り当てられている IP アドレスを確認します。

docker ps

サンプル出力:

CONTAINER ID                           IMAGE                                         COMMAND             STATUS              PORTS
azurevotingappredis_azure-vote-back    mcr.microsoft.com/oss/bitnami/redis:6.0.8                         Running             52.179.23.131:6379->6379/tcp
azurevotingappredis_azure-vote-front   myregistry.azurecr.io/azure-vote-front                            Running             52.179.23.131:80->80/tcp

クラウドで実行中のアプリケーションを表示するには、表示されている IP アドレスをローカル Web ブラウザーに入力します。 この例では、「52.179.23.131」と入力します。 次の例で示すように、サンプル アプリケーションが読み込まれます。

ACI での投票アプリの画像

フロントエンド コンテナーのログを表示するには、docker logs コマンドを実行します。 次に例を示します。

docker logs azurevotingappredis_azure-vote-front

また、Azure portal またはその他の Azure ツールを使用して、デプロイしたコンテナー グループのプロパティと状態を確認することもできます。

アプリケーションの試行が完了したら、docker compose down を使用してアプリケーションとコンテナーを停止します。

docker compose down

このコマンドを実行すると、Azure Container Instances のコンテナー グループが削除されます。

次のステップ

このチュートリアルでは、Docker Compose を使用して、複数コンテナー アプリケーションのローカルでの実行から Azure Container Instances での実行に切り替えました。 以下の方法を学習しました。

  • Azure コンテナー レジストリを作成する
  • GitHub からアプリケーション ソース コードを複製する
  • Docker Compose を使用してイメージをビルドし、複数コンテナー アプリケーションをローカルで実行する
  • アプリケーション イメージをコンテナー レジストリにプッシュする
  • Docker 用の Azure コンテキストを作成する
  • Azure Container Instances にアプリケーションをデプロイする

また、コンテナー、イメージ、コンテキストを開発、実行、管理するための統合エクスペリエンスとして、Visual Studio Code 用の Docker 拡張機能を使用することもできます。

さらに多くの Azure Container Instances の機能を利用する場合は、Azure ツールを使用して複数コンテナー グループを指定します。 たとえば、Azure CLI を YAML ファイルと共に使用して、または Azure Resource Manager テンプレートを使用してコンテナー グループをデプロイする方法のチュートリアルを参照してください。