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 提供了適用於 macOS、Windows 及 Linux 系統的安裝指示。
Azure Cloud Shell 沒有包含完成本教學每個步驟所需的 Docker 元件。 因此,我們建議您本機安裝 Azure CLI 和 Docker 開發環境。
建立容器登錄庫
在本教學課程中,您需要一個屬於進階服務層級的 Azure 容器登錄。 要建立新的 Azure 容器登錄檔,請依照 快速入門中的步驟操作:使用 Azure 入口網站建立 Azure 容器登錄檔。 務必選擇以下選項:
- 針對定價方案 (SKU),選取 [進階],此為異地複寫功能所需方案。
- 在 美國西部 地區建立登記處。 本教學中提及此區域以示範地理複製。
- 由於 Azure 容器登錄通常是存留較久且跨多部容器主機使用的資源,因此建議您在專屬的資源群組中建立您的登錄。 當您設定異地複寫登錄和 Webhook 時,這些額外的資源會放置在相同的資源群組中。
秘訣
如果你之前建立了登錄檔,需要升級,請參見 「變更 SKU」。
在本教學的其餘部分,我們會將 <acrName> 作為容器的 登錄名稱的佔位符。
設定異地複寫
現在您已擁有進階登錄,可以設定異地複寫。 這樣一來,您的 Web 應用程式即可從最近的登錄來提取其容器映像 (在下一個教學課程中,您會將 Web 應用程式設定為在兩個區域中執行)。
請進入 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 執行個體。