练习 - 将 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)'
    

替换生成阶段任务

安 迪: 我认为不再需要这些生成任务,因为项目文件夹中的 Dockerfile 已经定义了所需的生成。 但是,我还没有机会查看我们目前可以使用什么来使用 Dockerfile 生成映像。 有什么想法?

Mara:我刚正在查询相关信息。 它似乎应该能够生成容器,甚至可以使用单个任务将其推送到存储库。 我们现在来添加它。

Docker 任务

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

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

替换部署阶段的任务

安 迪: 嗯,这似乎相当简单。 现在,我们需要查找一项任务,该任务将指示应用服务使用新推送的容器映像版本。

玛拉: 我已经开始了 这不同于将生成部署到 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. 选择“运行”,并确保分支设置为main。 完成后,选择 “运行 ”。

  3. 选择流水线以查看日志。 生成成功后,选择 AzureWebAppContainer 任务,然后选择 应用服务应用程序 URL 以查看已部署的 Web 应用。

    Azure Pipelines 屏幕截图,显示了网站 URL 的位置。

  4. 你应该会看到你的 Web 应用正在 App Service 上运行。

    Space Game 网站的屏幕截图。

安 迪: 这原来很棒! 我认为采用容器对于我们的团队来说可能是一个巨大的胜利。