자습서: 지리적 복제 Azure Container Registry 준비

Azure Container Registry는 네트워크를 배포에 가깝게 유지할 수 있는 Azure에 배포된 프라이빗 Docker 레지스트리입니다. 3부로 구성된 이 자습서에서는 지리적 복제를 사용하여 Linux 컨테이너에서 실행되는 ASP.NET Core 웹 애플리케이션을 두 개의 Web Apps for Containers 인스턴스에 배포하는 방법을 알아봅니다. Azure에서 가장 가까운 지리적 복제 리포지토리의 각 웹앱 인스턴스에 이미지를 자동으로 배포하는 방법을 확인할 수 있습니다.

총 3부 중 1부인 이 자습서에서는 다음을 수행합니다.

  • 지리적 복제 Azure Container Registry 만들기
  • GitHub에서 애플리케이션 원본 코드 복제
  • 애플리케이션 원본에서 Docker 컨테이너 이미지 만들기
  • 컨테이너 이미지를 레지스트리에 푸시하기

후속 자습서에서는 프라이빗 레지스트리의 컨테이너를 두 개의 Azure 지역에서 실행되는 웹앱에 배포합니다. 그런 다음, 애플리케이션에서 코드를 업데이트하고 레지스트리에 대한 단일 docker push로 두 개의 웹앱 인스턴스를 업데이트합니다.

시작하기 전에

이 자습서에는 Azure CLI(버전 2.0.31 이상)의 로컬 설치가 필요합니다. az --version을 실행하여 버전을 찾습니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.

컨테이너, 컨테이너 이미지 및 기본 Docker CLI 명령과 같은 핵심 Docker 개념에 익숙해야 합니다. 컨테이너 기본 사항에 대한 입문서는 Docker 시작을 참조하세요.

이 자습서를 완료하려면 로컬 Docker 설치가 필요합니다. Docker는 macOS, WindowsLinux 시스템에 대한 설치 지침을 제공합니다.

Azure Cloud Shell에는 이 자습서의 모든 단계를 완료하는 데 필요한 Docker 구성 요소가 포함되어 있지 않습니다. 따라서 Azure CLI 및 Docker 개발 환경을 로컬로 설치하는 것이 좋습니다.

컨테이너 레지스트리 만들기

이 자습서에서는 프리미엄 서비스 계층에 Azure 컨테이너 레지스트리가 필요합니다. 새 Azure 컨테이너 레지스트리를 만들려면 이 섹션의 단계를 수행합니다.

이전에 레지스트리를 만들었고 업그레이드해야 하는 경우 계층 변경을 참조하세요.

Azure Portal에 로그인합니다.

리소스 만들기 > 컨테이너 > Azure Container Registry 를 선택합니다.

Azure Portal에서 컨테이너 레지스트리 만들기

새 레지스트리를 다음 설정으로 구성합니다. 기본 사항 탭에서 다음을 수행합니다.

  • 레지스트리 이름: Azure 내에서 글로벌로 고유하며, 5~50자의 영숫자가 포함된 레지스트리 이름을 만듭니다.
  • 리소스 그룹: 새로 만들기 > myResourceGroup
  • 위치: West US
  • SKU: Premium (지역에서 복제에 필요)

검토 + 만들기 를 선택한 다음, 만들기 를 선택하여 레지스트리 인스턴스를 만듭니다.

Azure Portal에서 컨테이너 레지스트리 구성

이 자습서의 나머지 부분에서는 선택한 컨테이너 레지스트리 이름 의 자리 표시자로 <acrName>을 사용합니다.

Azure Container Registry는 일반적으로 여러 컨테이너 호스트에서 사용되는 수명이 긴 리소스이기 때문에 자체 리소스 그룹에 레지스트리를 만드는 것이 좋습니다. 지리적 복제 레지스트리와 webhook를 구성할 때 이러한 추가 리소스는 동일한 리소스 그룹에 배치됩니다.

지역에서 복제 구성

프리미엄 레지스트리가 있으니 이제 지역에서 복제를 구성할 수 있습니다. 두 지역에서 실행되도록 다음 자습서에서 구성하는 웹앱은 가장 가까운 레지스트리에서 컨테이너 이미지를 끌어올 수 있습니다.

Azure Portal에서 새 컨테이너 레지스트리로 이동하여 서비스 아래에서 복제 를 선택합니다.

Azure Portal 컨테이너 레지스트리 UI의 복제

지역에서 복제에 사용할 수 있는 Azure 영역을 나타내는 녹색 육각형이 지도에 표시됩니다.

Azure Portal의 지역 지도

녹색 육각형을 선택하여 미국 동부 지역에 레지스트리를 복제한 다음 복제 만들기 에서 만들기 를 선택합니다.

Azure Portal에서 복제 UI 만들기

복제가 완료되면 포털에서 두 영역 모두에 준비 가 반영됩니다. 새로 고침 단추를 사용하여 복제 상태를 새로 고치세요. 복제본을 만들고 동기화하는 데 1~2분 정도 걸릴 수 있습니다.

Azure Portal의 복제 상태 UI

관리자 계정 사용

후속 자습서에서는 레지스트리의 컨테이너 이미지를 Web App for Containers에 직접 배포합니다. 이 기능을 사용하도록 설정하려면 레지스트리의 관리자 계정도 사용하도록 설정해야 합니다.

Azure Portal에서 새 컨테이너 레지스트리로 이동하여 설정 아래에서 액세스 키 를 선택합니다. 관리 사용자 에서 사용 을 선택합니다.

Azure Portal에서 관리자 계정 사용

컨테이너 레지스트리 로그인

지역에서 복제를 구성했으니 이제 컨테이너 이미지를 작성한 다음 레지스트리로 푸시합니다. 이미지를 푸시하기 전에 먼저 레지스트리에 로그인해야 합니다.

az acr login 명령을 사용하여 인증하고 레지스트리에 대한 자격 증명을 캐시합니다. <acrName>을 앞에서 만든 레지스트리 이름으로 바꿉니다.

az acr login --name <acrName>

완료되면 이 명령은 Login Succeeded를 반환합니다.

애플리케이션 코드 가져오기

이 자습서의 샘플에는 ASP.NET Core로 작성한 작은 웹 애플리케이션이 포함되어 있습니다. 이 응용 프로그램은 Azure Container Registry에서 이미지가 배포된 지역을 표시하는 HTML 페이지를 제공합니다.

브라우저에 표시된 자습서 앱

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

컨테이너 이미지 만들기

Dockerfile을 레지스트리 로그인 서버의 FQDN으로 업데이트했으니 이제 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 App for Containers 인스턴스에 컨테이너를 배포하여 이미지를 로컬로 제공하는 다음 자습서로 이동합니다.