연습 - Docker 컨테이너를 Azure에 배포하기

완료됨

해당 프로젝트는 솔루션에서 프로젝트를 빌드하고 해당 웹앱을 App Service에 배포하는 릴리스 파이프라인을 거쳤습니다. 이제 파이프라인 빌드를 업데이트하고 프로젝트를 컨테이너로 배포해야 합니다.

이 단원에서는 다음을 수행합니다.

  • 빌드 파이프라인을 보다 쉽게 유지 관리할 수 있도록 일부 파이프라인 변수를 정의합니다.
  • 기존 빌드 작업을 Docker 컨테이너를 빌드 및 푸시하는 통합 작업으로 바꿉니다.
  • 기존 배포 작업을 새로운 컨테이너 이미지로 App Service Web App을 업데이트하는 작업으로 바꿉니다.
  • 파이프라인을 저장하여 빌드 및 릴리스를 트리거합니다.

파이프라인 내에서 공유할 변수 정의

여기서는 azure-pipelines.yml에 정의된 기존 YAML 파이프라인에 새 파이프라인 변수를 추가합니다.

  1. Azure DevOps에서 Pipelines로 이동합니다.

  2. 파이프라인을 선택합니다.

  3. 편집을 선택합니다. 분기가 드롭다운 메뉴에서 선택하여 기본 설정되었는지 확인합니다. 그러면 azure-pipelines.yml 파일이 표시됩니다.

  4. 아래에 강조 표시된 줄을 추가하여 webRepositorytag라는 이름의 파이프라인 변수를 추가합니다. 해당 변수는 여러 작업에서 참조되고 있는 컨테이너의 특정 버전을 고유하게 식별하는 데 사용됩니다. 변수를 buildConfiguration 제거할 수도 있습니다. 더 이상 필요하지 않습니다.

    trigger:
    - '*'
    
    variables:
      buildConfiguration: 'Release'
      webRepository: 'web'
      tag: '$(Build.BuildId)'
    

빌드 단계 작업 바꾸기

Andy: 프로젝트 폴더의 Dockerfile이 이미 원하는 빌드를 정의하기 때문에 이러한 빌드 작업이 더 이상 필요하지 않다고 생각합니다. 그러나 Dockerfile을 사용하여 이미지를 빌드하는 데 무엇을 사용할 수 있는지 살펴본 적이 없네요. 의견 있으신 분 계신가요?

Mara: 제가 알아보고 있던 것도 그것입니다. 컨테이너를 빌드하고 이를 리포지토리에 푸시하는 것을 단일 작업으로 할 수 있는 것이어야 할 것 같습니다. 이 작업을 추가해 봅시다.

Docker 작업

Docker 작업을 사용하여 Docker 이미지를 빌드하고 배포할 수 있습니다. 전체 빌드 단계를 아래의 YAML 조각으로 바꿉니다.

  • 명령: 실행할 Docker 명령을 지정합니다.
  • buildContext: 빌드 컨텍스트의 경로를 지정합니다.
  • 리포지토리: 리포지토리의 이름을 지정합니다.
  • dockerfile: Dockerfile의 경로를 지정합니다.
  • containerRegistry: Docker 레지스트리 서비스 연결의 이름을 지정합니다.
  • 태그: 별도의 줄에 태그 목록을 지정합니다. 이러한 태그는 빌드, 푸시 및 buildAndPush 명령에 사용됩니다.
- stage: 'Build'
  displayName: 'Build and push'
  jobs:  
  - job: 'Build'
    displayName: 'Build job'
    pool:
      vmImage: 'ubuntu-20.04'
    steps:
    - task: Docker@2
      displayName: 'Build and push the image to container registry'
      inputs:
        command: buildAndPush
        buildContext: $(Build.Repository.LocalPath)
        repository: $(webRepository)
        dockerfile: '$(Build.SourcesDirectory)/Tailspin.SpaceGame.Web/Dockerfile'
        containerRegistry: 'Container Registry Connection'
        tags: |
          $(tag)

배포 단계 작업 바꾸기

앤디: 글쎄, 그건 아주 간단해 보입니다. 이제는 App Service가 새로 푸시되는 컨테이너 이미지 버전을 사용하도록 지시하는 작업만 찾아내면 됩니다.

Mara: 이미 찾아냈습니다. 이 작업은 빌드를 Azure Pipelines로 배포하는 방식과는 약간 다르지만 하나의 태스크로 목적을 달성하기에 충분할 정도로 직접적입니다. 이 작업을 추가해 봅시다.

Azure Web App for Container 작업

컨테이너 작업용 Azure 웹앱은 Docker 컨테이너를 Azure App Service에 배포하도록 설계되었습니다. 전체 배포 단계를 아래의 YAML 조각으로 바꿉니다.

  • appName: 기존 Azure 앱 서비스의 이름을 지정합니다.
  • azureSubscription: 배포에 대한 Azure Resource Manager 구독의 이름을 지정합니다.
  • imageName: 정규화된 컨테이너 이미지 이름(예 myregistry.azurecr.io/nginx:latest : 또는 python:3.7.2-alpine/.)을 지정합니다.
- stage: 'Deploy'
  displayName: 'Deploy the container'
  dependsOn: Build
  jobs:
  - job: 'Deploy'
    displayName: 'Deploy job'
    pool:
      vmImage: 'ubuntu-20.04'
    variables:
    - group: Release
    steps:
    - task: AzureWebAppContainer@1
      inputs:
       appName: $(WebAppName)
       azureSubscription: 'Resource Manager - Tailspin - Space Game'
       imageName: $(RegistryName)/$(webRepository):$(build.buildId)

파이프라인을 저장하여 빌드 및 릴리스 트리거

  1. 페이지의 오른쪽 위 모서리에서 저장을 선택합니다. 커밋 메시지 입력하고 저장을 선택하여 확인합니다.

  2. 실행을 선택하고 분기가 기본으로 설정되어 있는지 확인합니다. 완료되면 실행을 선택합니다.

  3. 파이프라인을 선택하여 로그를 봅니다. 빌드가 성공하면 AzureWebAppContainer 작업을 선택한 다음, App Service 애플리케이션 URL을 선택하여 배포된 웹앱을 봅니다.

    Screenshot of Azure Pipelines showing the location of the website URL.

  4. App Service에서 실행 중인 웹앱이 표시되어야 합니다.

    Screenshot of the Space Game website.

Andy: 아주 좋네요. 컨테이너를 도입하는 것이 팀에게 엄청난 유익이 된다고 생각합니다.