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

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

并非 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 - 必须使用适用于 Windows macOS 的 Docker Desktop 2.3.0.5 或更高版本。 或者安装 适用于 Linux 的 Docker ACI Integration CLI

    创建 Azure 容器注册表

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

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

    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 容器注册表的部分输出:

    "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 容器注册表实例,才能向其推动映像。 使用 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 配置中,进行以下两项更改:

  • 更新 azure-vote-front 服务中的 image 属性。 用你的 Azure 容器注册表的登录服务器名称作为映像名称的前缀,即 <acrName>.azurecr.io。 例如,如果你的注册表名称为 myregistry,登录服务器名称为 myregistry.azurecr.io(全小写),则映像属性为 myregistry.azurecr.io/azure-vote-front
  • 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 容器注册表对将要在下一步生成的 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.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 容器实例,需要将 azure-vote-front 映像推送到容器注册表。 运行 docker-compose push 来推送映像:

    docker-compose push
    

    推送到注册表可能需要几分钟时间。

    若要验证映像是否存储在注册表中,请运行 az acr repository show 命令:

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

    创建 Azure 上下文

    若要使用 Docker 命令在 Azure 容器实例中运行容器,请先登录到 Azure:

    docker login azure
    

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

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

    docker context create aci myacicontext
    

    出现提示时,选择你的 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.io/azure-vote-front                            Running             52.179.23.131:80->80/tcp
    

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

    若要查看前端容器的日志,请运行 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 资源管理器模板进行部署。

  •