Azure App Service에서 사용자 지정 컨테이너를 사용한 지속적인 배포

이 자습서에서는 관리되는 Azure Container Registry 리포지토리 또는 Docker 허브에서 사용자 지정 컨테이너 이미지에 대한 연속 배포를 구성합니다.

1. 배포 센터로 이동

Azure Portal에서 App Service 앱의 관리 페이지로 이동합니다.

왼쪽 메뉴에서 배포 센터>설정을 클릭합니다.

2. 배포 원본 선택

배포 원본 선택은 시나리오에 따라 달라집니다.

  • 컨테이너 레지스트리는 컨테이너 레지스트리와 App Service 사이에 CI/CD를 설정합니다.
  • GitHub Actions 옵션은 GitHub에서 컨테이너 이미지에 대해 소스 코드를 유지 관리하는 경우에 사용됩니다. GitHub 리포지토리에 대한 새 커밋으로 트리거되는 배포 작업은 컨테이너 레지스트리에 직접 docker builddocker push를 실행한 후 새 이미지를 실행하도록 App Service 앱을 업데이트할 수 있습니다. 자세한 내용은 GitHub Actions에서 CI/CD의 작동 방법을 참조하세요.
  • Azure Pipelines를 사용하여 CI/CD를 설정하려면 Azure Pipelines에서 Azure 웹앱 컨테이너 배포를 참조하세요.

참고 항목

Docker Compose 앱의 경우 컨테이너 레지스트리를 선택합니다.

GitHub Actions를 선택한 경우 권한 부여클릭하고 권한 부여 프롬프트를 따릅니다. 이전에 GitHub로 이미 권한 부여된 경우 계정 변경을 클릭하여 다른 사용자의 리포지토리에서 배포할 수 있습니다.

GitHub로 Azure 계정에 권한 부여한 후 배포할 조직, 리포지토리분기선택합니다.

2. 레지스트리 설정 구성

3. 레지스트리 설정 구성

참고 항목

사이드카 컨테이너(미리 보기)는 App Service에서 다중 컨테이너(Docker Compose) 앱에 성공합니다. 시작하려면 자습서: Azure App Service(미리 보기) 사용자 지정 컨테이너에 대한 사이드카 컨테이너 구성을 참조하세요.

다중 컨테이너(Docker Compose) 앱을 배포하려면 컨테이너 유형에서 Docker Compose선택합니다.

컨테이너 유형 드롭다운이 표시되지 않으면 다시 원본으로 스크롤하고 컨테이너 레지스트리선택합니다.

레지스트리 원본에서 컨테이너 레지스트리가 있는 위치를 선택합니다. Azure Container Registry 또는 Docker Hub도 아닌 경우에는 프라이빗 레지스트리선택합니다.

참고 항목

다중 컨테이너(Docker Compose) 앱에 사용되는 프라이빗 이미지가 1개를 초과하는 경우 프라이빗 이미지가 동일한 프라이빗 레지스트리에 있고 동일한 사용자 자격 증명으로 액세스할 수 있는지 확인합니다. 다중 컨테이너 앱에 퍼블릭 이미지만 사용되는 경우에는 일부 이미지가 Docker Hub에 있지 않아도 Docker Hub선택합니다.

선택과 일치하는 탭을 선택하여 다음 단계를 수행합니다.

레지스트리 드롭다운에는 앱과 동일한 구독의 레지스트리가 표시됩니다. 원하는 레지스트리를 선택합니다.

참고 항목

배포할 이미지태그선택합니다. 원하는 경우 시작 파일에 시작 명령을 입력합니다.

컨테이너 유형에 따라 다음 단계를 수행합니다.

  • Docker Compose의 경우 프라이빗 이미지에 대해 레지스트리를 선택합니다. 파일 선택클릭하여 Docker Compose 파일을 업로드하거나 단순히 Docker Compose 파일의 내용을 구성붙여넣습니다.
  • 단일 컨테이너의 경우 배포할 이미지태그선택합니다. 원하는 경우 시작 파일에 시작 명령을 입력합니다.

App Service는 컨테이너를 시작할 때 시작 파일의 문자열을 docker run 명령의 끝([COMMAND] [ARG...] 세그먼트)에 추가합니다.

3. CI/CD 사용

4. CI/CD 사용

App Service는 Azure Container Registry 및 Docker Hub와의 CI/CD 통합을 지원합니다. 이를 사용하도록 설정하려면 지속적인 배포에서 켜기선택합니다.

참고 항목

원본에서 GitHub Actions를 선택하면 CI/CD가 GitHub Actions에서 직접 처리되므로 이 옵션이 표시되지 않습니다. 대신 워크플로 구성 섹션이 표시되고, 여기에서 파일 미리 보기클릭하여 워크플로 파일을 검사할 수 있습니다. Azure는 선택한 GitHub 원본 리포지토리에 이 파일을 커밋하여 빌드 및 배포 작업을 처리합니다. 자세한 내용은 GitHub Actions에서 CI/CD의 작동 방법을 참조하세요.

이 옵션을 사용하도록 설정하면 App Service가 Azure Container Registry 또는 Docker Hub의 레지스트리에 웹후크를 추가합니다. 선택한 이미지가 docker push로 업데이트될 때마다 리포지토리가 이 웹후크에 게시합니다. 이 웹후크를 통해 App Service 앱이 재시작되고 docker pull을 실행하여 업데이트된 이미지를 가져옵니다.

참고 항목

웹후크가 제대로 작동하려면 웹앱 내에서 기본 인증 게시 자격 증명 옵션을 사용하도록 설정해야 합니다. 이렇게 하지 않으면 웹후크에 대한 401 권한 없음 오류가 발생할 수 있습니다. 기본 인증 게시 자격 증명을 사용하도록 설정되어 있는지 확인하려면 다음 단계를 수행합니다.

  • 웹앱의 구성 > 일반 설정으로 이동합니다.
  • 기본 인증 게시 자격 증명 옵션을 찾을 수 있는 플랫폼 설정 섹션을 찾습니다.

다른 프라이빗 레지스트리의 경우에는 웹후크에 수동으로 또는 CI/CD 파이프라인의 한 단계로 게시할 수 있습니다. 웹후크 URL에서 복사 단추를 클릭하여 웹후크 URL을 가져옵니다.

참고 항목

다중 컨테이너(Docker Compose) 앱에 대한 지원은 제한됩니다.

  • Azure Container Registry의 경우 App Service가 선택한 레지스트리에서 레지스트리를 범위로 사용하여 웹후크를 만듭니다. Docker Compose 파일에서 참조되지 않는 항목을 포함하여 레지스트리에 있는 모든 리포지토리에 대한 docker push는 앱 다시 시작을 트리거합니다. 범위를 좁히기 위해 웹후크를 수정해야 할 수 있습니다.
  • Docker Hub는 레지스트리 수준에서 웹후크를 지원하지 않습니다. Docker Compose 파일에 지정된 이미지에 웹후크를 수동으로 추가해야 합니다.

4. 설정 저장

5. 설정 저장

저장클릭합니다.

GitHub Actions에서 CI/CD의 작동 방법

원본에서 GitHub Actions를 선택하면(배포 원본 선택 참조), App Service가 다음 방식으로 CI/CD를 설정합니다.

  • App Service에 대한 빌드 및 배포 작업을 처리하기 위해 GitHub Actions 워크플로 파일을 GitHub 리포지토리에 저장합니다.
  • 프라이빗 레지스트리에 대한 자격 증명을 GitHub 비밀로 추가합니다. 생성된 워크플로 파일은 Azure/docker-login 작업을 실행하여 프라이빗 레지스트리로 로그인한 후 docker push를 실행하여 여기에 배포합니다.
  • 앱의 게시 프로필을 GitHub 비밀로 추가합니다. 생성된 워크플로 파일은 이 비밀을 사용하여 App Service에 인증을 수행한 후 Azure/webapps-deploy 작업을 실행하여 업데이트된 이미지를 구성합니다. 이것은 업데이트된 이미지를 가져오도록 앱 다시 시작을 트리거합니다.
  • 워크플로 실행 로그에서 정보를 캡처하여 앱 배포 센터로그 탭에 표시합니다.

다음과 같은 방법으로 GitHub Actions 빌드 공급자를 사용자 지정할 수 있습니다.

  • 워크플로 파일이 GitHub 리포지토리에서 생성된 후 이를 사용자 지정합니다. 자세한 내용은 GitHub Actions의 워크플로 구문을 참조하세요. 앱 다시 시작을 트리거하기 위해 워크플로가 Azure/webapps-deploy 작업으로 종료되는지 확인합니다.
  • 선택한 분기가 보호되는 경우 구성을 저장하지 않고 워크플로 파일을 계속 미리 볼 수 있고, 이후 이것과 필요한 GitHub 비밀을 리포지토리에 수동으로 추가할 수 있습니다. 이 방법은 Azure Portal과의 로그 통합을 제공하지 않습니다.
  • 게시 프로필 대신 Microsoft Entra ID에서 서비스 주체를 사용하여 배포합니다.

서비스 주체를 사용하여 인증

이 선택적 구성은 생성된 워크플로 파일의 게시 프로필로 기본 인증을 대체합니다.

Azure CLI에서 az ad sp create-for-rbac 명령을 사용하여 서비스 주체를 생성합니다. 다음 예제에서는 <subscription-id>, <group-name><app-name>을 사용자 고유의 값으로 바꿉니다. 다음 단계에 대한 전체 JSON 출력을 최상위 수준({})을 포함하여 저장합니다.

az ad sp create-for-rbac --name "myAppDeployAuth" --role contributor \
                            --scopes /subscriptions/<subscription-id>/resourceGroups/<group-name>/providers/Microsoft.Web/sites/<app-name> \
                            --json-auth

Important

보안을 위해 서비스 주체에 필요한 최소한의 액세스 권한을 부여합니다. 이전 예의 범위는 전체 리소스 그룹이 아닌 특정 App Service 앱으로 제한되어 있습니다.

GitHub에서 리포지토리로 이동한 후 설정 > 비밀 > 새 비밀 추가선택합니다. Azure CLI 명령의 전체 JSON 출력을 비밀의 값 필드에 붙여넣습니다. 비밀 이름을 지정합니다(예: AZURE_CREDENTIALS).

배포 센터에서 생성된 워크플로 파일에서 다음 예시와 같이 코드를 사용하여 azure/webapps-deploy 단계를 수정합니다.

- name: Sign in to Azure 
# Use the GitHub secret you added
- uses: azure/login@v1
    with:
    creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Deploy to Azure Web App
# Remove publish-profile
- uses: azure/webapps-deploy@v2
    with:
    app-name: '<app-name>'
    slot-name: 'production'
    images: '<registry-server>/${{ secrets.AzureAppService_ContainerUsername_... }}/<image>:${{ github.sha }}'
    - name: Sign out of Azure
    run: |
    az logout

CLI로 자동화

컨테이너 레지스트리 및 Docker 이미지를 구성하려면 az webapp config container set실행합니다.

az webapp config container set --name <app-name> --resource-group <group-name> --docker-custom-image-name '<image>:<tag>' --docker-registry-server-url 'https://<registry-name>.azurecr.io' --docker-registry-server-user '<username>' --docker-registry-server-password '<password>'

다중 컨테이너(Docker Compose) 앱을 구성하려면 Docker Compose 파일을 로컬로 준비한 후 --multicontainer-config-file 매개 변수를 사용하여 az webapp config container set실행합니다. Docker Compose 파일에 프라이빗 이미지가 포함된 경우 이전 예시에 표시된 것처럼 --docker-registry-server-* 매개 변수를 추가합니다.

az webapp config container set --resource-group <group-name> --name <app-name> --multicontainer-config-file <docker-compose-file>

컨테이너 레지스트리에서 앱으로의 CI/CD를 구성하려면 --enable-cd 매개 변수를 사용하여 az webapp deployment container config실행합니다. 이 명령은 웹후크 URL을 출력하지만 개별 단계로 레지스트리에 웹후크를 수동으로 만들어야 합니다. 다음 예제는 앱에서 CI/CD를 사용하도록 설정한 후 출력에서 웹후크 URL을 사용하여 Azure Container Registry에 웹후크를 만듭니다.

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

az acr webhook create --name <webhook-name> --registry <registry-name> --resource-group <group-name> --actions push --uri $ci_cd_url --scope '<image>:<tag>'

추가 리소스