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 门户创建 Azure 容器注册表。 请务必选择以下选项:
- 对于定价计划 (SKU),请选择“高级”,这对于地理复制是必需的。
- 在“中国东部 2”区域中创建注册表。 本教程中引用了此区域来演示异地复制。
- 由于 Azure 容器注册表通常是在多个容器主机上使用的长期生存的资源,因此我们建议在注册表自身所在的资源组中创建该注册表。 配置异地复制注册表和 Webhook 时,这些附加资源会放置在同一个资源组中。
提示
如果以前创建了注册表并需要升级,请参阅 更改 SKU。
在本教程的其余部分,我们将 <acrName> 用作容器 注册表名称的占位符。
配置异地复制
获取高级注册表后,可以配置异地复制。 Web 应用(在下一篇教程中,会将其配置为在两个区域中运行)可从最靠近的注册表中提取其容器映像。
在 Azure 门户中转到容器注册表。 在服务菜单中的 “服务”下,选择 “异地复制”。
在 “异地复制 ”窗格中,可以看到一个地图,其中显示了可用于异地复制的 Azure 区域。
若要将注册表复制到中国东部 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 应用实例,并使用异地复制在本地提供映像。