练习 - 将 Docker 容器部署到 Azure
你的项目附带了一个发布管道,用于在解决方案中生成项目并将 Web 应用部署到其应用服务。 现在,可以更新该管道生成并将项目部署为容器。
在本单元中,你将学习以下内容:
- 定义一些管道变量,使生成管道更易于维护。
- 将现有生成任务替换为生成和推送 Docker 容器的统一任务。
- 将现有部署任务替换为使用新容器映像更新应用服务 Web 应用的任务。
- 保存管道以触发生成和发布。
定义要在管道内共享的变量
在这里,将新管道变量添加到在 azure-pipelines.yml 中定义的现有 YAML 管道。
在 Azure DevOps 中,导航到“Pipelines”。
选择管道。
选择“编辑”。 通过从下拉菜单中选择分支,确保分支设置为 main。 这会显示 azure-pipelines.yml 文件。
添加以下突出显示的行,以添加名为
webRepository
和tag
的管道变量。 这些变量将用于多个任务,以唯一标识引用的容器的特定版本。 还可以删除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: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)
保存管道以触发生成和发布
选择页面右上角的“保存”。 键入提交消息,然后选择“保存”以确认。
选择“运行”,并确保分支设置为“主分支”。 完成后选择“运行”。
选择管道以查看日志。 生成成功后,选择“AzureWebAppContainer”任务,然后选择“应用服务应用程序 URL”以查看已部署的 Web 应用。
应看到 Web 应用在应用服务上运行。
Andy:结果不错! 我认为对于我们的团队来说,采用容器将意味着一场巨大的胜利。