사용자 지정 컨테이너를 사용하여 Azure App Service로 사용자 지정 소프트웨어를 마이그레이션

Azure App Service 는 Windows에서 ASP.NET 또는 Node.js같은 미리 정의된 애플리케이션 스택을 제공합니다. 이러한 애플리케이션 스택은 IIS에서 실행됩니다. 미리 구성된 Windows 환경은 다음을 제한합니다:

  • 관리자 액세스.
  • 소프트웨어 설치
  • 전역 어셈블리 캐시에 대한 변경 사항입니다.

자세한 내용은 App Service의 운영 체제 기능을 참조하세요.

Visual Studio에서 사용자 지정 구성 Windows 이미지를 배포하여 앱에 필요한 OS 변경 사항을 적용할 수 있습니다. 이렇게 하면 사용자 지정 OS 및 소프트웨어 구성이 필요한 온-프레미스 앱을 쉽게 마이그레이션할 수 있습니다. 이 자습서에서는 Windows 글꼴 라이브러리에 설치된 사용자 지정 글꼴을 사용하는 ASP.NET 앱을 App Service로 마이그레이션하는 방법을 보여줍니다. Visual Studio에서 Azure Container Registry로 사용자 지정 구성 Windows 이미지를 배포한 다음 App Service에서 이를 실행합니다.

Windows 컨테이너에서 실행되는 웹앱을 보여 주는 스크린샷

필수 조건

로컬에서 앱을 설정하세요

샘플 다운로드

이 단계에서 로컬 .NET 프로젝트를 설정합니다.

샘플 프로젝트에는 Windows 글꼴 라이브러리에 설치된 사용자 지정 글꼴을 사용하는 간단한 ASP.NET 애플리케이션이 포함되어 있습니다. 글꼴을 설치할 필요는 없습니다. 그러나 샘플은 기본 OS와 통합된 앱의 예입니다. 이러한 앱을 App Service로 마이그레이션하려면 코드 아키텍처를 변경하여 통합을 제거하거나 사용자 지정 Windows 컨테이너에서 그대로 마이그레이션해야 합니다.

글꼴을 설치하세요

Windows 탐색기에서 custom-font-win-container-master/CustomFontSample로 이동하여 FrederickatheGreat-Regular.ttf를 마우스 오른쪽 단추로 클릭하고 설치를 선택합니다.

이 글꼴은 Google Fonts을 통해 공개적으로 제공됩니다.

앱을 실행하세요

Visual Studio에서 custom-font-win-container-master/CustomFontSample.sln 파일을 엽니다.

Ctrl+F5를 선택하여 디버깅하지 않고 앱을 실행합니다. 앱이 기본 웹 브라우저에 표시됩니다.

기본 브라우저에 표시되는 앱을 보여 주는 스크린샷

앱이 설치된 글꼴을 사용하므로 App Service 샌드박스에서 앱을 실행할 수 없습니다. 그러나 Windows 컨테이너에 글꼴을 설치할 수 있으므로 대신 Windows 컨테이너를 사용하여 배포할 수 있습니다.

Windows 컨테이너 구성

솔루션 탐색기에서 CustomFontSample 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가>Container Orchestration Support(컨테이너 오케스트레이션 지원)를 선택합니다.

솔루션 탐색기에 있는 CustomFontSample 프로젝트의 스크린샷입니다. 추가 및 컨테이너 오케스트레이터 지원 메뉴 항목이 강조 표시되어 있습니다.

Docker Compose>확인을 선택합니다.

이제 프로젝트가 Windows 컨테이너에서 실행되도록 설정되었습니다. Dockerfile 항목이 CustomFontSample 프로젝트에 추가되고 docker-compose 프로젝트가 솔루션에 추가됩니다.

솔루션 탐색기에서 Dockerfile을 엽니다.

지원되는 부모 이미지를 사용해야 합니다. FROM 줄을 다음 코드로 바꿔서 부모 이미지를 변경합니다.

FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.2-windowsservercore-ltsc2019

파일의 끝에 다음 줄을 추가하고 파일을 저장합니다.

RUN ${source:-obj/Docker/publish/InstallFont.ps1}

InstallFont.ps1은 CustomFontSample 프로젝트에서 찾을 수 있습니다. 글꼴을 설치하는 간단한 스크립트입니다. PowerShell 갤러리에서 더 복잡한 버전의 스크립트를 찾을 수 있습니다.

참고

Windows 컨테이너를 로컬로 테스트하려면 Docker가 로컬 머신에서 시작되었는지 확인합니다.

Azure Container Registry에 게시

Azure Container Registry는 컨테이너 배포용 이미지를 저장할 수 있습니다. Container Registry에서 호스트되는 이미지를 사용하도록 App Service를 구성할 수 있습니다.

게시 창 열기

솔루션 탐색기에서 CustomFontSample 프로젝트를 마우스 오른쪽 단추로 클릭하고 게시를 선택합니다.

솔루션 탐색기의 CustomFontSample 프로젝트 스크린샷입니다. 게시 메뉴 항목이 강조 표시됩니다.

레지스트리 만들기 및 게시

  1. 게시 창에서 Azure를 선택한 다음, 다음을 선택합니다.

  2. Azure Container Registry를 선택한 다음, 다음을 선택합니다.

  3. 레지스트리를 게시할 구독을 선택한 다음 새로 만들기를 선택합니다.

Publish 창을 보여 주는 스크린샷. 새 만들기 단추가 강조 표시됩니다.

Azure 계정으로 로그인

Azure Container Registry 창에서 계정 추가를 선택한 다음, Azure 구독에 로그인합니다. 이미 로그인한 경우 드롭다운 목록에서 원하는 구독이 있는 계정을 선택합니다.

레지스트리 구성하기

다음 표의 제안된 값을 지침으로 사용하여 새 컨테이너 레지스트리를 구성합니다. 완료되면 만들기를 선택하세요.

설정 권장값
DNS 접두사 생성된 레지스트리 이름을 유지하거나 다른 고유한 이름으로 변경합니다.
리소스 그룹 새로 만들기를 선택하고 myResourceGroup을 입력한 다음 확인을 선택합니다.
SKU 기본. 자세한 내용은 가격 책정 계층을 참조하세요.
레지스트리 위치 서유럽

Azure Container Registry 창의 스크린샷.

완료를 선택합니다.

터미널 창이 열리고 이미지 배포 진행률이 표시됩니다. 배포가 완료될 때까지 기다리세요.

Azure에 로그인

Azure portal에 로그인하세요.

웹앱 만들기

리소스 만들기를 선택한 다음 Web App에서 Create를 선택합니다.

앱 기본 사항 구성

기본 사항 탭에서 다음 표를 가이드로 사용하여 설정을 구성합니다.

설정 권장 값
구독 올바른 구독이 선택되었는지 확인하세요.
리소스 그룹 새로 만들기를 선택하고 myResourceGroup을 입력한 다음 확인을 선택합니다.
이름 고유한 이름을 입력합니다. 웹앱의 URL은 https://<app-name>.azurewebsites.net이며, 여기서 <app-name>은 앱 이름입니다.
게시하기 컨테이너
운영 체제 Windows
지역 서유럽
Windows 플랜 새로 만들기를 선택하고 myAppServicePlan을 입력한 다음 확인을 선택합니다.

기본 사항 탭은 다음과 유사합니다.

웹앱을 구성하는 데 사용되는 기본 사항 탭의 스크린샷.

Windows 컨테이너 구성

컨테이너 탭에서 다음 표와 같이 사용자 지정 Windows 컨테이너를 구성한 다음 검토 + 만들기를 선택합니다.

설정 권장 값
이미지 출처 Azure Container Registry
Registry 이전에 만든 레지스트리를 선택합니다.
이미지 customfontsample
Tag 최신

앱 생성 완료

만들기를 클릭하고 Azure가 필수 리소스를 만들 때까지 기다립니다.

웹앱으로 이동

배포가 완료되면 알림 메시지가 나타납니다.

알림 메시지를 보여 주는 스크린샷.

  1. 리소스로 이동을 선택합니다.

  2. 앱 페이지에서 URL 아래에 있는 링크를 선택합니다.

다음 페이지가 새 브라우저 페이지에서 열립니다.

웹앱의 새 브라우저 페이지를 보여 주는 스크린샷입니다.

몇 분 정도 기다렸다가 원하는 글꼴이 있는 홈페이지가 표시될 때까지 다시 시도하세요.

구성한 글꼴이 있는 홈페이지의 스크린샷.

축하합니다! ASP.NET 애플리케이션을 Windows 컨테이너의 App Service로 마이그레이션했습니다.

컨테이너 시작 로그 보기

Windows 컨테이너를 로드하는 데 다소 시간이 걸릴 수 있습니다. 진행률을 보려면 다음 URL로 이동합니다. (<앱 이름>을 앱 이름으로 바꾸세요.)

https://<app-name>.scm.azurewebsites.net/api/logstream

스트리밍된 로그는 다음과 같이 표시됩니다.

14/09/2018 23:16:19.889 INFO - Site: fonts-win-container - Creating container for image: customfontsample20180914115836.azurecr.io/customfontsample:latest.
14/09/2018 23:16:19.928 INFO - Site: fonts-win-container - Create container for image: customfontsample20180914115836.azurecr.io/customfontsample:latest succeeded. Container Id 329ecfedbe370f1d99857da7352a7633366b878607994ff1334461e44e6f5418
14/09/2018 23:17:23.405 INFO - Site: fonts-win-container - Start container succeeded. Container: 329ecfedbe370f1d99857da7352a7633366b878607994ff1334461e44e6f5418
14/09/2018 23:17:28.637 INFO - Site: fonts-win-container - Container ready
14/09/2018 23:17:28.637 INFO - Site: fonts-win-container - Configuring container
14/09/2018 23:18:03.823 INFO - Site: fonts-win-container - Container ready
14/09/2018 23:18:03.823 INFO - Site: fonts-win-container - Container start-up and configuration completed successfully

Azure App Service는 Docker 컨테이너 기술을 사용하여 기본 제공 이미지와 사용자 지정 이미지를 모두 호스팅합니다. 기본 제공 이미지 목록을 보려면 Azure CLI 명령인 az webapp list-runtimes --os linux를 실행합니다. 이러한 이미지가 요구 사항에 맞지 않는 경우 사용자 지정 이미지를 빌드하고 배포할 수 있습니다.

참고

컨테이너는 x86-64 아키텍처를 대상으로 해야 합니다. ARM64는 지원되지 않습니다.

이 자습서에서는 다음 방법을 배웁니다:

  • Azure Container Registry에 사용자 지정 Docker 이미지를 푸시합니다.
  • App Service에 사용자 지정 이미지를 배포합니다.
  • 환경 변수를 구성합니다.
  • 관리되는 ID를 사용하여 App Service로 이미지를 끌어오세요.
  • 진단 로그에 액세스합니다.
  • Container Registry에서 App Service로 CI/CD를 사용하도록 설정합니다.
  • SSH를 사용하여 컨테이너에 연결합니다.

이 자습서를 완료하면 컨테이너 레지스트리에 대한 Azure 계정에 약간의 비용이 발생하며 컨테이너를 한 달 이상 호스트하는 경우 더 많은 비용이 발생할 수 있습니다.

초기 환경 설정하기

이 자습서에는 Azure CLI 버전 2.0.80 이상이 필요합니다. Azure Cloud Shell을 사용하는 경우 최신 버전이 이미 설치되어 있습니다.

  • Docker 이미지를 빌드하는 데 사용하는 Docker를 설치합니다. Docker를 설치하려면 컴퓨터를 다시 시작해야 할 수 있습니다.

Docker를 설치한 후 터미널 창을 열고 Docker가 설치되어 있는지 확인합니다.

docker --version

샘플 앱을 클론하거나 다운로드하세요

Git 복제 또는 다운로드를 통해 이 자습서의 샘플을 가져올 수 있습니다.

Git Bash를 사용하여 리포지토리를 복제하세요

샘플 리포지토리를 복제하세요:

git clone https://github.com/Azure-Samples/docker-django-webapp-linux.git --config core.autocrlf=input

Linux 컨테이너 내에서 사용되는 파일에 적절한 줄 끝을 보장하기 위해 --config core.autocrlf=input 인자를 포함해야 합니다.

그런 다음 폴더로 이동합니다.

cd docker-django-webapp-linux

GitHub에서 ZIP을 다운로드하세요

Git clone을 사용하는 대신 https://github.com/Azure-Samples/docker-django-webapp-linux로 이동한 다음 Code>Local>Download ZIP을 선택할 수 있습니다.

ZIP 파일의 압축을 docker-django-webapp-linux라는 이름의 폴더에 풉니다.

그런 다음 docker-django-webapp-linux 폴더에서 터미널 창을 엽니다.

샘플 용기 준비하세요

최신 브라우저 터미널과 az webapp exec는 SSH 서버나 이미지 내 내장 SSH 비밀번호 없이도 실행 중인 리눅스 컨테이너에 인증된 접근 권한을 제공합니다. 레거시 Kudu WebSSH 및 az webapp ssh 접근은 여전히 SSH 서버가 필요할 수 있습니다. 샘플 저장소에는 레거시 SSH 설정이 포함되어 있습니다. 빌드 전에 Docker파일의 내용을 다음과 같은 앱 전용 구성으로 교체하세요:

FROM tiangolo/uwsgi-nginx-flask:python3.6

RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt --no-cache-dir
ADD . /code/

COPY init.sh /usr/local/bin/

RUN chmod u+x /usr/local/bin/init.sh
EXPOSE 8000

ENTRYPOINT ["init.sh"]

init.sh 의 내용을 리눅스 줄 끝을 유지한 다음 스크립트로 대체하세요:

#!/bin/bash
set -e

exec python /code/manage.py runserver 0.0.0.0:8000

레거시 sshd_config 파일을 로컬 샘플 폴더에서 제거해서 ADD . /code/가 이를 이미지에 복사하지 않도록 하세요.

Dockerfile은 앱의 의존성을 설치하고, 애플리케이션과 시작 스크립트를 복사하며, 애플리케이션의 포트를 노출합니다. 진입점은 Python 애플리케이션만 시작합니다. 이러한 변경은 샘플의 SSH 설치 및 자격 증명을 제거합니다. 이미지에는 최신 브라우저 터미널용 /bin/bash 및 기본 az webapp exec 셸이 표시됩니다.

로컬에서 이미지를 빌드하고 테스트

참고

Docker Hub는 IP당 익명 끌어오기 수와 무료 사용자당 인증된 끌어오기 수에 할당량을 적용합니다. Docker Hub에서의 pull이 제한되고 있다면 아직 로그인하지 않았다면 docker login를 실행해 보세요.

  1. 다음 명령을 실행하여 이미지를 빌드합니다.

    docker build --tag appsvc-tutorial-custom-image .
    
  2. Docker 컨테이너를 로컬로 실행하여 빌드가 작동하는지 테스트합니다.

    docker run -it -p 8000:8000 appsvc-tutorial-custom-image
    

    이 docker run 명령은 -p 인수를 사용하여 포트를 지정하고 이미지의 이름을 포함합니다. -it를 사용하면 Ctrl+C를 사용해 중지할 수 있습니다.

    팁

    Windows에서 실행 중이고 *standard_init_linux.go:211: exec user process caused "no such file or directory" 오류가 표시되면 init.sh 파일에 예상된 LF 줄 끝 대신 CRLF 줄 끝이 포함되어 있다는 의미입니다. 이 오류는 Git을 사용하여 샘플 리포지토리를 복제했지만 --config core.autocrlf=input 매개 변수를 생략한 경우에 발생합니다. 이 경우 --config 인수를 사용하여 리포지토리를 다시 복제합니다. 또한 init.sh를 편집하고 CRLF 줄 끝 형식으로 저장한 경우에도 이 오류가 표시될 수 있습니다. 이 경우 LF 끝만 사용하여 파일을 다시 저장하세요.

  3. http://localhost:8000(으)로 이동하여 웹앱 및 컨테이너가 제대로 작동하는지 확인합니다.

    테스트 결과의 스크린샷.

사용자 할당 관리되는 ID 만들기

App Service는 기본 관리 ID 또는 사용자 할당 관리 ID를 사용하여 컨테이너 레지스트리에 인증할 수 있습니다. 이 자습서에서는 사용자 할당 관리 ID를 사용합니다.

  1. az group create를 실행하여 리소스 그룹을 만듭니다.

    az group create --name msdocs-custom-container-tutorial --location westeurope
    

    --location 값을 변경하여 가까운 지역을 지정할 수 있습니다.

  2. 리소스 그룹에 관리형 ID를 만듭니다.

    az identity create --name myID --resource-group msdocs-custom-container-tutorial
    

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

  1. 다음 az acr create 명령을 사용하여 컨테이너 레지스트리를 만듭니다. <registry-name>를 레지스트리에 사용할 고유한 이름으로 바꿉니다. 이름에는 영문자와 숫자만 포함해야 하며 모든 Azure에서 고유해야 합니다.

    az acr create --name <registry-name> --resource-group msdocs-custom-container-tutorial --sku Basic --admin-enabled true
    

    --admin-enabled 매개 변수를 사용하면 관리 자격 증명을 사용하여 레지스트리에 이미지를 푸시할 수 있습니다.

  2. az credential acr show 명령을 실행하여 관리 자격 증명을 검색합니다.

    az acr credential show --resource-group msdocs-custom-container-tutorial --name <registry-name>
    

    이 명령의 JSON 출력은 레지스트리의 사용자 이름과 함께 두 개의 암호를 제공합니다.

Container Registry에 샘플 이미지를 푸시하세요

이 섹션에서는 나중에 App Service에서 사용하는 Container Registry에 이미지를 푸시합니다.

  1. 샘플 이미지를 빌드한 로컬 터미널에서 docker login 명령을 사용하여 컨테이너 레지스트리에 로그인합니다.

    docker login <registry-name>.azurecr.io --username <registry-username>
    

    <registry-name> 및 <registry-username>을 이전 단계의 값으로 바꿉니다. 프롬프트가 표시되면 이전 섹션의 암호 중 하나를 입력합니다.

    이 섹션의 나머지 모든 단계에서 동일한 레지스트리 이름을 사용합니다.

  2. 로그인에 성공하면 로컬 Docker 이미지를 레지스트리용으로 태그를 지정합니다.

    docker tag appsvc-tutorial-custom-image <registry-name>.azurecr.io/appsvc-tutorial-custom-image:latest
    
  3. docker push 명령을 사용하여 이미지를 레지스트리로 푸시합니다.

    docker push <registry-name>.azurecr.io/appsvc-tutorial-custom-image:latest
    

    이미지를 처음 업로드하는 경우 기본 이미지가 포함되어 있으므로 몇 분 정도 걸릴 수 있습니다. 이후 업로드는 일반적으로 더 빠릅니다.

    기다리는 동안 다음 섹션의 단계를 완료하여 레지스트리에서 배포하도록 App Service를 구성할 수 있습니다.

레지스트리에 대해 관리형 ID 권한 부여

만든 관리되는 ID에는 컨테이너 레지스트리에서 끌어올 권한이 아직 없습니다. 이 단계에서는 권한 부여 기능을 활성화합니다.

  1. 관리되는 ID의 보안 주체 ID를 검색합니다.

    principalId=$(az identity show --resource-group msdocs-custom-container-tutorial --name myID --query principalId --output tsv)
    
  2. 컨테이너 레지스트리의 리소스 ID를 검색합니다.

    registryId=$(az acr show --resource-group msdocs-custom-container-tutorial --name <registry-name> --query id --output tsv)
    
  3. 관리되는 ID에 컨테이너 레지스트리에 액세스할 수 있는 권한을 부여합니다.

    az role assignment create --assignee $principalId --scope $registryId --role "AcrPull"
    

    이러한 권한에 대한 자세한 내용은 Azure 역할 기반 액세스 제어란 무엇인가요?을 참조하세요.

웹앱 만들기

  1. az appservice plan create 명령을 사용하여 App Service 계획을 만듭니다:

    az appservice plan create --name myAppServicePlan --resource-group msdocs-custom-container-tutorial --is-linux
    

    App Service 계획은 웹앱을 호스팅하는 가상 머신에 해당합니다. 기본적으로 이전 명령은 첫 달에 무료로 제공되는 저렴한 B1 가격 책정 계층을 사용합니다. --sku 매개 변수를 사용하여 계층을 지정할 수 있습니다.

  2. az webapp create 명령을 사용하여 웹앱을 만듭니다.

    az webapp create --resource-group msdocs-custom-container-tutorial --plan myAppServicePlan --name <app-name> --deployment-container-image-name <registry-name>.azurecr.io/appsvc-tutorial-custom-image:latest
    

    <app-name>을 웹 앱 이름으로 바꾸세요 이름은 Azure 전체에서 고유해야 합니다. 또한 <registry-name>을 이전 섹션의 레지스트리 이름으로 바꿉니다.

    팁

    웹앱의 컨테이너 설정은 언제든지 az webapp config container show --name <app-name> --resource-group msdocs-custom-container-tutorial 명령을 사용하여 검색할 수 있습니다. 이미지는 DOCKER_CUSTOM_IMAGE_NAME 속성에 지정됩니다. Azure DevOps 또는 Azure Resource Manager 템플릿을 통해 웹앱을 배포하는 경우 해당 이미지가 LinuxFxVersion라는 이름의 속성에도 표시될 수 있습니다. 두 속성은 모두 동일한 용도로 제공됩니다. 둘 다 웹앱의 구성에 있는 경우 LinuxFxVersion이 우선적으로 적용됩니다.

웹앱 구성

이 단계에서는 다음과 같이 웹앱을 구성합니다.

  • 포트 8000에 요청을 보내도록 앱을 구성합니다. 샘플 컨테이너는 웹 요청에 대해 포트 8000에서 수신 대기합니다.
  • 관리 ID를 사용하여 컨테이너 레지스트리에서 이미지를 가져오도록 앱을 구성합니다.
  • 컨테이너 레지스트리에서 연속 배포를 구성합니다. 레지스트리에 푸시하는 모든 이미지는 새 이미지를 끌어오도록 앱을 트리거합니다. 이 단계는 컨테이너 레지스트리에서 끌어오도록 웹앱을 구성하는 데 필요하지 않지만 새 이미지가 레지스트리에 푸시되면 웹앱에 알릴 수 있습니다. 이 단계를 완료하지 않으면 웹앱을 다시 시작하여 이미지 끌어오기를 수동으로 트리거해야 합니다.
  1. az webapp config appsettings set을 사용하여 WEBSITES_PORT 환경 변수를 앱 코드에서 기대하는 대로 설정합니다.

    az webapp config appsettings set --resource-group msdocs-custom-container-tutorial --name <app-name> --settings WEBSITES_PORT=8000
    

    <app-name>을 이전 단계에서 사용한 이름으로 바꾸세요.

  2. 다음 az webapp identity assign 명령을 사용하여 웹앱에서 사용자 할당 관리 ID를 사용하도록 설정합니다.

    id=$(az identity show --resource-group msdocs-custom-container-tutorial --name myID --query id --output tsv)
    az webapp identity assign --resource-group msdocs-custom-container-tutorial --name <app-name> --identities $id
    

    <app-name>을 이전 단계에서 사용한 이름으로 바꿉니다.

  3. 관리형 ID를 사용하여 Container Registry에서 끌어오도록 앱을 구성합니다.

    appConfig=$(az webapp config show --resource-group msdocs-custom-container-tutorial --name <app-name> --query id --output tsv)
    az resource update --ids $appConfig --set properties.acrUseManagedIdentityCreds=True
    

    <app-name>을 이전 단계에서 사용한 이름으로 바꿉니다.

  4. 웹앱이 Container Registry에서 끌어오는 데 사용하는 클라이언트 ID를 설정합니다. 시스템 할당 관리 ID를 사용하는 경우에는 이 단계가 필요하지 않습니다.

    clientId=$(az identity show --resource-group msdocs-custom-container-tutorial --name myID --query clientId --output tsv)
    az resource update --ids $appConfig --set properties.AcrUserManagedIdentityID=$clientId
    
  5. App Service에서 CI/CD를 사용하도록 설정합니다.

    cicdUrl=$(az webapp deployment container config --enable-cd true --name <app-name> --resource-group msdocs-custom-container-tutorial --query CI_CD_URL --output tsv)
    

    CI_CD_URL은 App Service에서 생성하는 URL입니다. 레지스트리는 이 URL을 사용하여 이미지 밀어넣기가 발생했음을 App Service에 알려야 합니다. 이는 실제로 사용자를 위해 웹후크를 만들지 않습니다.

  6. 컨테이너 레지스트리에 웹후크를 만듭니다. 마지막 단계에서 얻은 CI_CD_URL을 사용합니다.

    az acr webhook create --name appserviceCD --registry <registry-name> --uri $cicdUrl --actions push --scope appsvc-tutorial-custom-image:latest
    
  7. 웹후크가 제대로 구성되었는지 테스트하려면 웹후크를 ping하고 200 OK 응답을 받는지 확인합니다.

    eventId=$(az acr webhook ping --name appserviceCD --registry <registry-name> --query id --output tsv)
    az acr webhook list-events --name appserviceCD --registry <registry-name> --query "[?id=='$eventId'].eventResponseMessage"
    

    팁

    모든 웹후크 이벤트에 관한 모든 정보를 보려면 --query 매개 변수를 제거하십시오.

    컨테이너 로그를 스트리밍하는 경우 웹후크가 앱을 다시 시작하도록 트리거하기 때문에 웹후크 ping 후에 Starting container for site 메시지가 표시됩니다.

웹앱으로 이동

앱을 테스트하려면 https://<app-name>.azurewebsites.net로 이동합니다. <app-name>을 웹 앱 이름으로 바꾸세요.

앱에 처음 액세스하려고 하면 App Service가 레지스트리에서 전체 이미지를 끌어와야 하므로 앱이 응답하는 데 다소 시간이 걸릴 수 있습니다. 브라우저에서 시간이 초과되면 페이지를 새로 고칩니다. 초기 이미지를 끌어온 후에는 후속 테스트가 훨씬 더 빠르게 실행됩니다.

브라우저에서 실행되는 웹앱의 스크린샷

진단 로그 보기

App Service가 이미지를 가져올 때까지 기다리는 동안 컨테이너 로그를 터미널에 스트리밍하여 App Service가 수행하는 작업을 정확히 확인하는 것이 좋습니다.

  1. 컨테이너 로깅을 켭니다:

    az webapp log config --name <app-name> --resource-group msdocs-custom-container-tutorial --docker-container-logging filesystem
    
  2. 로그 스트림을 사용하도록 설정합니다.

    az webapp log tail --name <app-name> --resource-group msdocs-custom-container-tutorial
    

    콘솔 로그가 즉시 표시되지 않으면 30초 후에 다시 확인하세요.

    https://<app-name>.scm.azurewebsites.net/api/logs/docker로 이동하여 브라우저에서 로그 파일을 검사할 수도 있습니다.

  3. 언제든지 로그 스트리밍을 중지하려면 Ctrl+C를 누릅니다.

앱 코드 수정 및 다시 배포

이 섹션에서는 웹앱 코드를 변경하고, 이미지를 다시 빌드한 다음, 이미지를 컨테이너 레지스트리에 푸시합니다. 그런 다음, App Service에서 자동으로 레지스트리로부터 업데이트된 이미지를 가져와서 실행 중인 웹앱을 업데이트합니다.

  1. 로컬 docker-django-webapp-linux 폴더에서 app/templates/app/index.html 파일을 엽니다.

  2. 첫 번째 HTML 요소를 다음 코드와 일치하도록 변경합니다.

    <nav class="navbar navbar-inverse navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <a class="navbar-brand" href="#">Azure App Service - Updated Here!</a>
        </div>
      </div>
    </nav>
    
  3. 변경 내용을 저장하세요.

  4. docker-django-webapp-linux 폴더로 이동하여 이미지를 다시 빌드하세요.

    docker build --tag appsvc-tutorial-custom-image .
    
  5. 이미지의 태그를 업데이트합니다latest:

    docker tag appsvc-tutorial-custom-image <registry-name>.azurecr.io/appsvc-tutorial-custom-image:latest
    

    <registry-name>을 레지스트리 이름으로 바꿉니다.

  6. 이미지를 레지스트리로 푸시합니다.

    docker push <registry-name>.azurecr.io/appsvc-tutorial-custom-image:latest
    
  7. 이미지 푸시가 완료되면 웹후크는 App Service에 푸시에 대해 알리고 App Service는 업데이트된 이미지를 가져오려고 시도합니다. 몇 분 정도 기다렸다가 https://<app-name>.azurewebsites.net로 이동하여 업데이트가 배포되었는지 확인합니다.

SSH를 사용하여 컨테이너에 연결

컨테이너가 실행 중이면 최신 브라우저 터미널 또는 az webapp exec를 사용하여 App Service의 인증된 Kudu 프록시를 통해 액세스할 수 있습니다. 이런 옵션들을 위해 이미지에 SSH 서버를 설치하거나 실행할 필요는 없습니다.

액세스 전제 조건과 앱 또는 슬롯 제어는 컨테이너 셸(SSH)을 열고 명령 실행을 참조하세요.

컨테이너에 대한 SSH 연결 열기

  1. Azure CLI 2.90.0 또는 그 이후 버전을 사용하고 Azure 계정에 로그인하세요. 로컬 터미널에서 미리보기 az webapp exec 명령어로 인터랙티브 셸을 열어보세요:

    az webapp exec --resource-group msdocs-custom-container-tutorial --name <app-name>
    
  2. 이미지에서 top를 사용할 수 있으면 앱 내에서 실행 중인 프로세스를 검사하세요.

인터랙티브 세션 대신 분리된 명령 실행에 대해서는 인터랙티브 세션 없이 명령 실행을 참조하세요. 요청 수락은 명령이 성공적으로 완료되었음을 확인하지 않습니다.

리소스 정리

이 문서에서 만든 리소스는 지속적인 비용이 발생할 수 있습니다. 리소스를 정리하려면 해당 리소스가 포함된 리소스 그룹만 삭제하면 됩니다.

az group delete --name msdocs-custom-container-tutorial

다음 단계

학습한 내용은 다음과 같습니다.

  • 프라이빗 컨테이너 레지스트리에 사용자 지정 이미지를 배포합니다.
  • App Service에 사용자 지정 이미지를 배포합니다.
  • 이미지를 업데이트하고 다시 배포합니다.
  • 진단 로그에 접근합니다.
  • SSH를 사용하여 컨테이너에 연결합니다.
  • Container Registry에 사용자 지정 Docker 이미지를 푸시합니다.
  • App Service에 사용자 지정 이미지를 배포합니다.
  • 환경 변수를 설정합니다.
  • 관리 ID를 사용하여 App Service로 이미지를 끌어오세요.
  • 진단 로그에 액세스합니다.
  • Container Registry에서 App Service로 CI/CD를 사용하도록 설정합니다.
  • SSH를 사용하여 컨테이너에 연결합니다.

다음 자습서로 이동:

또는 다른 리소스를 확인해 보세요.