练习 - 将 Docker 容器部署到 Azure

已完成

你的项目附带了一个发布管道,用于在解决方案中生成项目并将 Web 应用部署到其应用服务。 现在,可以更新该管道生成并将项目部署为容器。

在本单元中,你将学习以下内容:

  • 定义一些管道变量,使生成管道更易于维护。
  • 将现有生成任务替换为生成和推送 Docker 容器的统一任务。
  • 将现有部署任务替换为使用新容器映像更新应用服务 Web 应用的任务。
  • 保存管道以触发生成和发布。

定义要在管道内共享的变量

在这里,将新管道变量添加到在 azure-pipelines.yml 中定义的现有 YAML 管道

  1. 在 Azure DevOps 中,导航到“Pipelines”。

  2. 选择管道。

  3. 选择“编辑”。 通过从下拉菜单中选择分支,确保分支设置为 main。 这会显示 azure-pipelines.yml 文件。

  4. 添加以下突出显示的行,以添加名为 webRepositorytag 的管道变量。 这些变量将用于多个任务,以唯一标识引用的容器的特定版本。 还可以删除 buildConfiguration 变量;不再需要此变量。

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

替换生成阶段任务

Andy:我认为我们不再需要这些生成任务,因为项目文件夹中的 Dockerfile 已经定义了所需的生成。 不过,我还没来得及研究我们可以使用什么来通过 Dockerfile 生成映像。 大家有什么想法吗?

Mara:我刚正在查询相关信息。 它看起来应该能够生成容器,甚至只需要一次任务就可以将容器推送到存储库。 我们现在就添加它。

Docker 任务

可以使用 Docker 任务生成和部署 Docker 映像。 将整个生成阶段替换为以下 YAML 代码片段。

  • command:指定要运行的 Docker 命令。
  • buildContext:指定生成上下文的路径。
  • repository:指定存储库的名称。
  • dockerfile:指定 Dockerfile 的路径。
  • containerRegistry:指定 Docker 注册表服务连接的名称。
  • tags:指定单独行上的标记列表。 这些标记用于 build、push 和 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)

替换部署阶段任务

Andy:这看起来非常简单。 现在,我们只需要找到一个任务,来指示应用服务使用新推送的容器映像版本。

Mara:我已经在找了。 这不同于将生成部署到 Azure Pipelines 中,但对于在一个任务中完成作业来说足够了。 我们现在来添加它。

适用于容器的 Azure Web 应用任务

用于容器的 Azure Web 应用任务旨在将 Docker 容器部署到 Azure 应用服务。 将整个部署阶段替换为以下 YAML 代码片段。

  • appName:指定现有 Azure 应用服务的名称。
  • azureSubscription:指定部署的 Azure 资源管理器订阅的名称。
  • imageName:指定完全限定的容器映像名称,例如 myregistry.azurecr.io/nginx:latestpython: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”任务,然后选择“应用服务应用程序 URL”以查看已部署的 Web 应用。

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

  4. 应看到 Web 应用在应用服务上运行。

    Screenshot of the Space Game website.

Andy:结果不错! 我认为对于我们的团队来说,采用容器将意味着一场巨大的胜利。