Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Azure 容器注册表是部署在 Azure 中的专用 Docker 注册表,能使部署尽量靠近网络。 本套教程由三篇文章构成,介绍如何使用异地复制将 Linux 容器中运行的 ASP.NET Core Web 应用程序部署到两个用于容器的 Web 应用实例。 在其中可以了解 Azure 如何通过最靠近的异地复制存储库将映像部署到每个 Web 应用实例。
在这套由三个部分构成的系列教程中,第一部分的内容包括:
- 创建异地复制的 Azure 容器注册表
- 克隆 GitHub 中的应用程序源代码
- 基于应用程序源代码生成 Docker 容器映像
- 将容器映像推送到注册表
后续教程将会介绍如何将容器从专用注册表部署到在两个 Azure 区域中运行的 Web 应用。 然后,可以更新应用程序中的代码,通过一条 docker push
命令将两个 Web 应用实例更新到注册表。
开始之前
本教程需要本地安装 Azure CLI 2.0.31 或更高版本。 运行 az --version
即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI。
要求熟悉 Docker 的核心概念,如容器、容器映像和基本的 Docker CLI 命令。 有关容器的入门基础知识,请参阅 Docker 入门。
要完成本教程,需要本地安装 Docker。 Docker 提供适用于 macOSWindows 和 Linux 系统的安装说明。
Azure 本地 Shell 不包含完成本教程每个步骤所需的 Docker 组件。 因此,我们建议在本地安装 Azure CLI 和 Docker 开发环境。
创建容器注册表
对于本教程,你需要高级服务层中的 Azure 容器注册表。 若要创建新的 Azure 容器注册表,请遵循本部分中的步骤。
提示
如果以前创建了注册表并需要升级,请参阅更改层。
登录 Azure 门户。
首先,选择“ 创建资源”,然后在新页面的搜索筛选器中输入 容器注册表 ,然后选择 Enter 键。 接下来,在搜索结果中选择 容器注册表 ,最后选择“ 创建”。
使用以下设置配置新注册表。 在“基本信息”选项卡中:
- 注册表名称:创建在 Azure 中全局唯一的、包含 5-50 个字母数字字符的注册表名称
-
资源组:新建>
myResourceGroup
-
位置:
China East 2
-
SKU:
Premium
(异地复制需要此项设置)
依次选择“查看 + 创建”和“创建”来创建注册表实例 。
本教程的余下部分使用 <acrName>
作为所选容器注册表名称的占位符。
提示
由于 Azure 容器注册表通常是在多个容器主机上使用的长期生存的资源,因此我们建议在注册表自身所在的资源组中创建该注册表。 配置异地复制注册表和 Webhook 时,这些附加资源会放置在同一个资源组中。
配置异地复制
获取高级注册表后,可以配置异地复制。 Web 应用(在下一篇教程中,会将其配置为在两个区域中运行)可从最靠近的注册表中提取其容器映像。
在 Azure 门户中导航到新的容器注册表,选择“服务”下面的“复制项” :
此时会出现一幅地图,其中显示了绿色的六边形,表示支持异地复制的 Azure 区域:
选择注册表对应的绿色六边形将它复制到“China East 2
”区域,然后选择“创建复制项”下面的“创建”:
完成复制后,门户会显示两个区域的“就绪”状态。 使用“刷新”按钮刷新复制状态;创建并同步副本可能需要大约一分钟时间。
启用管理员帐户
在后续教程中,会将容器映像从注册表直接部署到用于容器的 Web 应用。 若要启用此功能,还必须启用注册表的管理员帐户。
在 Azure 门户中导航到新的容器注册表,选择“设置”下面的“访问密钥” 。 在“管理员用户”下,选择“启用” 。
容器注册表登录
配置异地复制后,生成一个容器映像并将其推送到注册表。 在将映像推送到注册表之前,必须先登录到注册表。
使用 az acr login 命令进行身份验证,并缓存注册表的凭据。 将 <acrName>
替换为之前创建的注册表的名称。
az acr login --name <acrName>
该命令在完成时会返回 Login Succeeded
。
获取应用程序代码
本教程中的示例包括使用 ASP.NET Core 生成的小型 Web 应用程序。 该应用提供一个 HTML 页面,其中显示了 Azure 容器注册表已从中部署映像的区域。
使用 git 将示例下载到某个本地目录,并执行 cd
切换到该目录:
git clone https://github.com/Azure-Samples/acr-helloworld.git
cd acr-helloworld
如果没有安装 git
,可直接从 GitHub 下载 ZIP 存档。
更新 Dockerfile
示例中包含的 Dockerfile 演示如何生成容器。 它首先创建一个正式的 ASP.NET Core 运行时映像,将应用程序文件复制到容器,安装依赖项,使用正式的 .NET Core SDK 映像编译输出,最后生成优化的 aspnetcore 映像。
在克隆的源中,Dockerfile 位于 ./AcrHelloworld/Dockerfile
。
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS base
# Update <acrName> with the name of your registry
# Example: uniqueregistryname.azurecr.cn
ENV DOCKER_REGISTRY <acrName>.azurecr.cn
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
WORKDIR /src
COPY *.sln ./
COPY AcrHelloworld/AcrHelloworld.csproj AcrHelloworld/
RUN dotnet restore
COPY . .
WORKDIR /src/AcrHelloworld
RUN dotnet build -c Release -o /app
FROM build AS publish
RUN dotnet publish -c Release -o /app
FROM base AS production
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "AcrHelloworld.dll"]
acr-helloworld 映像中的应用程序尝试通过在 DNS 中查询有关注册表登录服务器的信息,确定其容器的部署源区域。 必须在 Dockerfile 中的 DOCKER_REGISTRY
环境变量内指定注册表登录服务器的完全限定的域名 (FQDN)。
首先,使用 az acr show
命令获取注册表的登录服务器。 将 <acrName>
替换为在前面步骤中创建的注册表的名称。
az acr show --name <acrName> --query "{acrLoginServer:loginServer}" --output table
输出:
AcrLoginServer
-----------------------------
uniqueregistryname.azurecr.cn
接下来,使用注册表登录服务器的 FQDN 更新 ENV DOCKER_REGISTRY
行。 本示例体现了示例注册表名称,uniqueregistryname:
ENV DOCKER_REGISTRY uniqueregistryname.azurecr.cn
生成容器映像
使用注册表登录服务器的 FQDN 更新 Dockerfile 之后,可以使用 docker build
来创建容器映像。 运行以下命令生成映像,并使用标记将它包含在专用注册表的 URL 中;同样,请将 <acrName>
替换为自己的注册表的名称:
docker build . -f ./AcrHelloworld/Dockerfile -t <acrName>.azurecr.cn/acr-helloworld:v1
生成 Docker 映像时,会显示多个输出行(此处的显示内容已截断):
Sending build context to Docker daemon 523.8kB
Step 1/18 : FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS base
2.2: Pulling from mcr.microsoft.com/dotnet/core/aspnet
3e17c6eae66c: Pulling fs layer
[...]
Step 18/18 : ENTRYPOINT dotnet AcrHelloworld.dll
---> Running in 6906d98c47a1
---> c9ca1763cfb1
Removing intermediate container 6906d98c47a1
Successfully built c9ca1763cfb1
Successfully tagged uniqueregistryname.azurecr.cn/acr-helloworld:v1
使用 docker images
查看生成和标记的映像:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
uniqueregistryname.azurecr.cn/acr-helloworld v1 01ac48d5c8cf About a minute ago 284MB
[...]
向 Azure 容器注册表推送映像
然后,使用 docker push
命令将 acr-helloworld 映像推送到注册表。 将 <acrName>
替换为注册表的名称。
docker push <acrName>.azurecr.cn/acr-helloworld:v1
由于已经为异地复制配置了注册表,因此,使用这一条 命令,即可将映像自动复制到“中国东部 2”和“中国东部”区域 。
$ docker push uniqueregistryname.azurecr.cn/acr-helloworld:v1
The push refers to a repository [uniqueregistryname.azurecr.cn/acr-helloworld]
cd54739c444b: Pushed
d6803756744a: Pushed
b7b1f3a15779: Pushed
a89567dff12d: Pushed
59c7b561ff56: Pushed
9a2f9413d9e4: Pushed
a75caa09eb1f: Pushed
v1: digest: sha256:0799014f91384bda5b87591170b1242bcd719f07a03d1f9a1ddbae72b3543970 size: 1792
后续步骤
在本教程中,我们创建了一个专用的异地复制容器注册表,生成了容器映像,然后将该图像推送到了该注册表。
请前往下一教程,了解如何将容器部署到多个用于容器的 Web 应用实例,并使用异地复制在本地提供映像。