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

완료됨

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

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

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

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

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

  1. Azure DevOps에서 파이프라인으로 이동합니다.

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

  3. 편집을 선택합니다. 브랜치를 드롭다운 메뉴에서 선택하여 메인으로 설정했는지 확인합니다. 그러면 azure-pipelines.yml 파일이 표시됩니다.

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

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

빌드 단계 작업 바꾸기

앤디: 프로젝트 폴더의 Dockerfile이 이미 원하는 빌드를 정의하기 때문에 이러한 빌드 작업이 더 이상 필요하지 않다고 생각합니다. 그러나 아직 Dockerfile을 사용하여 이미지를 빌드하는 데 사용할 수 있는 것을 볼 기회가 없었습니다. 어떤 아이디어?

마라: 난 그냥 그것을 찾고 있었다. 컨테이너를 빌드하고 나아가 단일 작업으로 리포지토리에 푸시할 수도 있을 것 같습니다. 이제 추가해 보겠습니다.

Docker 작업

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

  • 명령: 실행할 Docker 명령을 지정합니다.
  • buildContext: 빌드 컨텍스트의 경로를 지정합니다.
  • 리포지토리: 리포지토리의 이름을 지정합니다.
  • dockerfile: Dockerfile의 경로를 지정합니다.
  • containerRegistry: Docker 레지스트리 서비스 연결의 이름을 지정합니다.
  • tags: 별도의 줄에 있는 태그 목록을 지정합니다. 이러한 태그는 빌드, 푸시 및 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에 지시하는 작업을 찾기만 하면 됩니다.

마라: 이미 하고 있어. Azure Pipelines에 빌드를 배포하는 것과는 약간 다르지만 한 작업에서 작업을 완료할 수 있을 만큼 충분히 직접적입니다. 이제 추가해 보겠습니다.

컨테이너용 Azure 웹 앱 태스크

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

  • appName: 기존 Azure App Service의 이름을 지정합니다.
  • 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. 실행을 선택하고 브랜치가 main으로 설정되어 있는지 확인합니다. 완료되면 실행을 선택합니다.

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

    웹 사이트 URL의 위치를 보여 주는 Azure Pipelines의 스크린샷

  4. App Service에서 실행 중인 웹앱이 표시됩니다.

    Space Game 웹 사이트의 스크린샷.

앤디: 이거 잘 됐다! 컨테이너를 채택하는 것은 우리 팀에게 큰 승리가 될 수 있다고 생각합니다.