教程:使用 Docker Compose 部署多容器组

在本教程中,你使用 Docker Compose 在本地定义并运行多容器应用程序,然后在 Azure 容器实例中将其部署为容器组

使用 Docker 开发云原生应用时,如果希望从本地开发无缝切换到云部署,可以按需在 Azure 容器实例中运行容器。 此功能是通过 Docker 与 Azure 之间的集成启用的。 你可以使用原生 Docker 命令在 Azure 中运行单容器实例或多容器组。

重要

Docker Compose 适用于 ACI 的集成已于 2023 年 11 月停用。 另请参阅:停用日期待定

重要

并非 Azure 容器实例的所有功能都受支持。 如需提供有关 Docker-Azure 集成的反馈,可在 Docker ACI 集成 GitHub 存储库中创建问题。

提示

可以使用用于 Visual Studio Code 的 Docker 扩展来实现一种集成体验,以便开发、运行和管理容器、映像和上下文。

本文内容:

  • 创建 Azure 容器注册表
  • 克隆 GitHub 中的应用程序源代码
  • 使用 Docker Compose 在本地构建映像并运行多容器应用程序
  • 将应用程序映像推送到容器注册表
  • 为 Docker 创建 Azure 上下文
  • 启动 Azure 容器实例中的应用程序

系统必备

  • Azure CLI - 必须已在本地计算机上安装了 Azure CLI。 建议使用 2.10.1 或更高版本。 运行 az --version 即可查找版本。 如需进行安装或升级,请参阅安装 Azure CLI

  • Docker Desktop - 必须使用适用于 WindowsmacOS 的 Docker Desktop 2.3.0.5 或更高版本。 或者安装适用于 Linux 的 Docker ACI Integration CLI

创建 Azure 容器注册表

在创建容器注册表之前,需要创建一个资源组,以便将容器注册表部署到其中。 资源组是在其中部署和管理所有 Azure 资源的逻辑集合。

使用“az group create”命令创建资源组。 以下示例在 chinaeast2 区域中创建名为 myResourceGroup 的资源组:

az group create --name myResourceGroup --location chinaeast2

创建资源组后,使用 az acr create 命令创建 Azure 容器注册表。 容器注册表名称在 Azure 中必须唯一,并且必须包含 5-50 个字母数字字符。 将 <acrName> 替换为注册表的唯一名称:

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

下面是名为 mycontainerregistry082 的新 Azure 容器注册表的部分输出:

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

本教程的余下部分使用 <acrName> 作为在此步骤中选择的容器注册表名称的占位符。

登录到容器注册表

必须先登录到 Azure 容器注册表实例,才能向其推动映像。 使用 az acr login 命令完成此操作。 必须提供创建容器注册表时选择的唯一名称。

az acr login --name <acrName>

例如:

az acr login --name mycontainerregistry082

该命令在完成后返回 Login Succeeded

Login Succeeded

获取应用程序代码

本教程使用的示例应用程序是一个基本的投票应用。 该应用程序由前端 Web 组件和后端 Redis 实例组成。 Web 组件打包到自定义容器映像中。 Redis 实例使用 Docker 中心提供的未修改的映像。

使用 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-backazure-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 配置中,进行以下两项更改:

  1. 更新 azure-vote-front 服务中的 image 属性。 使用 Azure 容器注册表的登录服务器名称作为映像名称的前缀,即 acrName.azurecr.cn<>。 例如,如果注册表名为“myregistry”,则登录服务器名称为“myregistry.azurecr.cn”(全小写),image 属性为 myregistry.azurecr.cn/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.cn/azure-vote-front
    container_name: azure-vote-front
    environment:
      REDIS: azure-vote-back
    ports:
        - "80:80"

进行这些替换后,你可以针对 Azure 容器注册表对将要在下一步生成的 azure-vote-front 映像进行标记,并且可以拉取该映像,以便在 Azure 容器实例中运行它。

提示

对于此方案,无需使用 Azure 容器注册表。 例如,你可以选择 Docker Hub 内的一个专用存储库来承载应用程序映像。 如果选择其他注册表,请相应地更新映像属性。

在本地运行多容器应用程序

运行 docker-compose up,它使用示例 docker-compose.yaml 文件来生成容器映像、下载 Redis 映像以及启动应用程序:

docker-compose up --build -d

完成后,使用 docker images 命令查看创建的映像。 已下载或创建三个映像。 azure-vote-front 映像包含前端应用程序,后者使用 uwsgi-nginx-flask 映像作为基础。 redis 映像用于启动 Redis 实例。

$ docker images

REPOSITORY                                TAG        IMAGE ID            CREATED             SIZE
myregistry.azurecr.cn/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.cn/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。 示例应用程序会加载,如以下示例所示:

Image of voting app

尝试本地应用程序后,请运行 docker-compose down 以停止应用程序并删除容器。

docker-compose down

将映像推送到容器注册表

若要将应用程序部署到 Azure 容器实例,需要将 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 容器实例中运行容器,请先登录到 Azure:

docker login azure --cloud-name AzureChinaCloud

在系统提示时输入或选择 Azure 凭据。

通过运行 docker context create aci 创建 ACI 上下文。 此上下文将 Docker 与 Azure 订阅和资源组相关联,以便你可以创建和管理容器实例。 例如,创建名为 myacicontext 的上下文:

docker context create aci myacicontext --resource-group <ACI_Deployment_Resource_Group> --location <ACI_Deployment_Region>

出现提示时,选择你的 Azure 订阅 ID,然后选择现有资源组或“创建新的资源组”。 如果选择新的资源组,则创建的新资源组将使用系统生成的名称。 Azure 容器实例(例如所有 Azure 资源)都必须部署到资源组中。 使用资源组可以组织和管理相关的 Azure 资源。

运行 docker context ls 以确认已将 ACI 上下文添加到 Docker 上下文:

docker context ls

将应用程序部署到 Azure 容器实例

接下来,切换到 ACI 上下文。 后续 Docker 命令在此上下文中运行。

docker context use myacicontext

运行 docker compose up 以在 Azure 容器实例中启动应用程序。 将从你的容器注册表中拉取 azure-vote-front 映像,并在 Azure 容器实例中创建容器组。

docker compose up

注意

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.cn/azure-vote-front                            Running             52.179.23.131:80->80/tcp

若要查看云中正在运行的应用程序,请在本地 Web 浏览器中输入显示的 IP 地址。 在此示例中,输入 52.179.23.131。 示例应用程序会加载,如以下示例所示:

Image of voting app in ACI

若要查看前端容器的日志,请运行 docker logs 命令。 例如:

docker logs azurevotingappredis_azure-vote-front

你还可以使用 Azure 门户或其他 Azure 工具来查看部署的容器组的属性和状态。

完成应用程序试用后,通过 docker compose down 停止应用程序和容器:

docker compose down

此命令删除 Azure 容器实例中的容器组。

后续步骤

在本教程中,你已使用 Docker Compose 从在本地运行多容器应用程序切换到在 Azure 容器实例中运行。 你已了解如何执行以下操作:

  • 创建 Azure 容器注册表
  • 克隆 GitHub 中的应用程序源代码
  • 使用 Docker Compose 在本地构建映像并运行多容器应用程序
  • 将应用程序映像推送到容器注册表
  • 为 Docker 创建 Azure 上下文
  • 启动 Azure 容器实例中的应用程序

还可以使用用于 Visual Studio Code 的 Docker 扩展来实现一种集成体验,以便开发、运行和管理容器、映像和上下文。

若要利用 Azure 容器实例中的更多功能,请使用 Azure 工具指定一个多容器组。 有关示例,请参阅以下相关教程,了解如何通过 Azure CLI 使用 YAML 文件部署容器组,或使用 Azure 资源管理器模板进行部署。