教程:使用 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 - 必须使用适用于 Windows 或 macOS 的 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-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
配置中,进行以下两项更改:
- 更新
azure-vote-front
服务中的image
属性。 使用 Azure 容器注册表的登录服务器名称作为映像名称的前缀,即 acrName.azurecr.cn<>。 例如,如果注册表名为“myregistry”,则登录服务器名称为“myregistry.azurecr.cn”(全小写),image 属性为myregistry.azurecr.cn/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.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
。 示例应用程序会加载,如以下示例所示:
尝试本地应用程序后,请运行 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 up
和 docker compose down
。 在这两个命令中,docker
和 compose
之间没有连字符。
容器组很快就会部署完毕。 示例输出:
[+] 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
。 示例应用程序会加载,如以下示例所示:
若要查看前端容器的日志,请运行 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 资源管理器模板进行部署。