共用方式為


教學課程:準備異地複寫的 Azure 容器登錄

Azure 容器登錄是一種部署在 Azure 中的私人 Docker 登錄,可讓您將網路保持在靠近部署的位置。 在這三篇教學課程系列文章中,您可以了解如何使用異地複寫,將執行於 Linux 容器中的 ASP.NET Core Web 應用程式部署至兩個用於容器的 Web Apps執行個體。 您將了解 Azure 如何從最近的異地複寫存放庫,將映像自動部署到每個 Web App 執行個體。

本教學課程是下列三段式課程的第一段:

  • 建立異地複寫的 Azure 容器登錄
  • 從 GitHub 複製應用程式原始程式碼
  • 從應用程式來源建置 Docker 容器映像
  • 將容器映像推送至您的登錄

在後續的教學課程中,您將把容器從您的私人登錄部署到執行於兩個 Azure 區域的 Web 應用程式。 接著更新應用程式中的程式碼,並透過一次 docker push 將映像推送至您的登錄,從而同時更新兩個 Web App 執行個體。

開始之前

本教學課程需要 Azure CLI (版本 2.0.31 或更新版本) 的本機安裝。 執行 az --version 以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI

您應熟悉核心 Docker 概念,例如容器、容器映像和基本 Docker CLI 命令。 如需了解容器基礎概念,請參閱開始使用 Docker

若要完成本教學課程,您必須安裝本機 Docker。 Docker 提供了適用於 macOSWindowsLinux 系統的安裝指示。

Azure Cloud Shell 沒有包含完成本教學每個步驟所需的 Docker 元件。 因此,我們建議您本機安裝 Azure CLI 和 Docker 開發環境。

建立容器登錄庫

在本教學課程中,您需要一個屬於進階服務層級的 Azure 容器登錄。 要建立新的 Azure 容器登錄檔,請依照 快速入門中的步驟操作:使用 Azure 入口網站建立 Azure 容器登錄檔。 務必選擇以下選項:

  • 針對定價方案 (SKU),選取 [進階],此為異地複寫功能所需方案。
  • 美國西部 地區建立登記處。 本教學中提及此區域以示範地理複製。
  • 由於 Azure 容器登錄通常是存留較久且跨多部容器主機使用的資源,因此建議您在專屬的資源群組中建立您的登錄。 當您設定異地複寫登錄和 Webhook 時,這些額外的資源會放置在相同的資源群組中。

秘訣

如果你之前建立了登錄檔,需要升級,請參見 「變更 SKU」。

在本教學的其餘部分,我們會將 <acrName> 作為容器的 登錄名稱的佔位符。

設定異地複寫

現在您已擁有進階登錄,可以設定異地複寫。 這樣一來,您的 Web 應用程式即可從最近的登錄來提取其容器映像 (在下一個教學課程中,您會將 Web 應用程式設定為在兩個區域中執行)。

請進入 Azure 入口網站的容器登錄檔。 在服務選單中,在服務下選擇地理複製。

地理複寫 面板中,你會看到一張地圖,顯示支持地理複寫的 Azure 區域。

Azure 入口網站的區域地圖

要將您的登記冊複製到美國東部地區,請選擇該區域的綠色六角形。 在 建立複製 面板中,確認顯示正確的區域,然後選擇 建立

複製完成後,你會在 地理複製 面板上看到兩個區域都顯示 為 Ready

秘訣

你不能在使用 軟刪除政策的登錄檔上使用地理複製。

啟用管理帳戶

在後續的教學課程中,您會直接從登錄將容器映像部署到適用於容器的 Web App。 若要啟用這項功能,您也必須啟用該登錄的管理帳戶

進入 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.io
ENV DOCKER_REGISTRY <acrName>.azurecr.io
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.io

接著,使用登錄的登入伺服器的 FQDN 更新 ENV DOCKER_REGISTRY 行。 此範例會反映範例登錄名稱,uniqueregistryname

ENV DOCKER_REGISTRY uniqueregistryname.azurecr.io

建置容器映像

現在,您已使用登錄登入伺服器的 FQDN 更新 Dockerfile,接下來可使用 docker build 建立容器映像。 執行下列命令以建置映像,然後使用私人登錄 URL 加以標記,再次將 <acrName> 取代為您的登錄名稱:

docker build . -f ./AcrHelloworld/Dockerfile -t <acrName>.azurecr.io/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.io/acr-helloworld:v1

使用 docker images 查看已建置和標記的映像:

$ docker images
REPOSITORY                                      TAG    IMAGE ID        CREATED               SIZE
uniqueregistryname.azurecr.io/acr-helloworld    v1     01ac48d5c8cf    About a minute ago    284MB
[...]

將映像推送至 Azure Container Registry

接著,使用 docker push 命令,將 acr-helloworld 映像推送至您的登錄。 將 <acrName> 取代為您的登錄名稱。

docker push <acrName>.azurecr.io/acr-helloworld:v1

由於您已將登錄設定為要進行異地複寫,因此系統會使用單一 docker push 命令,將您的映像自動複寫至美國西部美國東部區域。

$ docker push uniqueregistryname.azurecr.io/acr-helloworld:v1
The push refers to a repository [uniqueregistryname.azurecr.io/acr-helloworld]
cd54739c444b: Pushed
d6803756744a: Pushed
b7b1f3a15779: Pushed
a89567dff12d: Pushed
59c7b561ff56: Pushed
9a2f9413d9e4: Pushed
a75caa09eb1f: Pushed
v1: digest: sha256:0799014f91384bda5b87591170b1242bcd719f07a03d1f9a1ddbae72b3543970 size: 1792

後續步驟

在本教學課程中,您已建立私人的異地複寫容器登錄、建置容器映像,並將該映像推送至您的登錄。

進入下一個教學課程,使用異地複寫提供本機的映像,以將容器部署至多個用於容器的 Web Apps 執行個體。