다음을 통해 공유


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

이 문서에서는 관리되는 Azure Container Registry 리포지토리 또는 Docker Hub에서 사용자 지정 컨테이너 이미지에 대한 CI/CD(지속적인 통합 및 지속적인 업데이트)를 구성하는 방법을 설명합니다.

1. 배포 센터로 이동

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

배포 아래의 사이드바 메뉴에서 배포 센터를 선택합니다. 설정 탭을 선택합니다.

2. 코드 원본 선택

원본 드롭다운 메뉴에서 다음 조건에 따라 배포 원본을 선택합니다.

  • 컨테이너 레지스트리는 컨테이너 레지스트리와 App Service 사이에 CI/CD를 설정합니다.
  • GitHub에서 컨테이너 이미지의 소스 코드를 유지 관리하는 경우 GitHub Actions 옵션을 선택합니다. 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) 앱에서 둘 이상의 프라이빗 이미지를 사용하는 경우 프라이빗 이미지가 동일한 프라이빗 레지스트리에 있고 동일한 사용자 자격 증명으로 액세스할 수 있는지 확인합니다. 다중 컨테이너 앱에서 공용 이미지만 사용하는 경우 일부 이미지가 Docker Hub에 없는 경우에도 Docker 허브를 선택합니다.

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

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

다른 구독의 레지스트리에서 배포하려면 대신 레지스트리 원본에서 프라이빗 레지스트리를 선택합니다.

관리 ID를 사용하여 Azure Container Registry 액세스를 잠그려면 다음을 참조하세요.

배포할 이미지태그 를 선택합니다. 시작 파일에서 시작 명령을 입력하도록 선택할 수 있습니다.

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

  • Docker Compose의 경우 개인 이미지에 대한 레지스트리를 선택합니다. 파일 선택을 선택하여Docker Compose 파일을 업로드하거나 Docker Compose 파일의 내용을 Config에 붙여넣습니다.
  • 단일 컨테이너의 경우 배포할 이미지태그를 선택합니다. 시작 파일에서 시작 명령을 입력하도록 선택할 수 있습니다.

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

3. CI/CD 사용

4. CI/CD 사용

App Service는 Azure Container Registry 및 Docker Hub와의 CI/CD 통합을 지원합니다. 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 파일에 지정된 이미지에 웹후크를 수동으로 추가해야 합니다.

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

코드 소스 선택 드롭다운 메뉴에서 GitHub Actions를 선택하는 경우 App Service는 다음과 같은 방법으로 CI/CD를 설정합니다.

  • GitHub Actions 워크플로 파일을 GitHub 리포지토리에 보관하여 빌드를 처리하고 App Service에 작업을 배포합니다.
  • 프라이빗 레지스트리에 대한 자격 증명을 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의 서비스 주체 를 사용하여 배포합니다.

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

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

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

중요

보안을 위해 서비스 주체에 필요한 최소한의 액세스 권한을 부여합니다. 이전 예의 범위는 전체 리소스 그룹이 아닌 특정 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 파일을 로컬로 준비한 다음 매개 변수를 az webapp config container set 사용하여 실행 --multicontainer-config-file 합니다. 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를 구성하려면 az webapp deployment container config 매개 변수를 사용하여 --enable-cd을 실행합니다. 이 명령은 웹후크 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>'