Ejercicio: Implementación de un contenedor de Docker en Azure

Completado

En el proyecto se incluía una canalización de versión que compila los proyectos de la solución e implementa la aplicación web en la instancia de App Service. Ahora, es el momento de actualizar la construcción del pipeline e implementar el proyecto como un contenedor como alternativa.

En esta unidad aprenderá a:

  • Defina algunas variables de canalización para facilitar el mantenimiento de la canalización de compilación.
  • Reemplace las tareas de compilación existentes por una tarea unificada para compilar e insertar un contenedor de Docker.
  • Reemplace la tarea Deploy existente por una que actualice la aplicación web de App Service por la nueva imagen de contenedor.
  • Guarde la canalización para desencadenar una compilación y una versión.

Definición de variables que se van a compartir dentro de la canalización

Aquí, agregará una nueva variable de canalización a la canalización YAML existente definida en azure-pipelines.yml.

  1. En Azure DevOps, vaya a Canalizaciones.

  2. Seleccione la canalización.

  3. Seleccione Editar. Asegúrese de que la rama está establecida en main ; para ello, selecciónela en el menú desplegable. Esto abre el archivo azure-pipelines.yml .

  4. Agregue la línea resaltada siguiente para agregar una variable de canalización denominada webRepository y tag. Se usarán en varias tareas para identificar de forma única la versión específica del contenedor al que se hace referencia. También puede quitar la buildConfiguration variable; ya no la necesitará.

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

Reemplazar las tareas de la etapa de construcción

Andy: Ya no creo que necesitemos ninguna de estas tareas de compilación, ya que el Dockerfile de la carpeta del proyecto ya define la compilación que queremos. Sin embargo, aún no he tenido la oportunidad de ver lo que podemos usar para compilar la imagen mediante un Dockerfile. ¿Alguna idea?

Mara: Estaba viendo justamente esto. Parece que deberíamos poder compilar el contenedor e, incluso, insertarlo en el repositorio con una sola tarea. Vamos a agregarlo ahora.

Tarea de Docker

Puede usar la tarea docker para compilar e implementar imágenes de Docker. Reemplace toda la fase de compilación por el fragmento de código YAML siguiente.

  • command: especifica el comando docker que se va a ejecutar.
  • buildContext: especifica la ruta de acceso al contexto de compilación.
  • repository: especifica el nombre del repositorio.
  • dockerfile: especifica la ruta de acceso al Dockerfile.
  • containerRegistry: especifica el nombre de la conexión del servicio del registro de Docker.
  • tags: especifica una lista de etiquetas en líneas independientes. Estas etiquetas se usan en los comandos build, push y 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)

Reemplazo de la tarea de la fase de implementación

Andy: Bueno, eso parece bastante sencillo. Ahora todo lo que necesitamos es encontrar una tarea que indicará a App Service que use la versión recién insertada de la imagen de contenedor.

Mara: Ya estoy en eso. Es un poco diferente de implementar una compilación en Azure Pipelines, pero sigue siendo lo suficientemente simple como para que podamos completar la tarea en un solo paso. Vamos a agregarlo ahora.

Tarea Aplicación web de Azure para contenedores

La tarea Azure Web App for Container está diseñada para implementar contenedores de Docker en Azure App Service. Reemplace toda la fase deploy por el fragmento de código YAML siguiente.

  • appName: especifica el nombre de una instancia de Azure App Service existente.
  • azureSubscription: especifica el nombre de la suscripción de Azure Resource Manager para la implementación.
  • imageName: especifica el nombre completo de la imagen de contenedor; por ejemplo, myregistry.azurecr.io/nginx:latest o 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)

Guardado de la canalización para desencadenar una compilación y una versión

  1. Seleccione Guardar en la esquina superior derecha de la página. Escriba el mensaje de confirmación y seleccione Guardar para confirmarlo.

  2. Seleccione Ejecutar y asegúrese de que la rama esté configurada como main. Seleccione Ejecutar cuando haya terminado.

  3. Seleccione la canalización para ver los registros. Una vez que la compilación se haya realizado correctamente, seleccione la tarea AzureWebAppContainer y, a continuación, seleccione la dirección URL de la aplicación de App Service para ver la aplicación web implementada.

    Captura de pantalla de Azure Pipelines que muestra la ubicación de la dirección URL del sitio web.

  4. Deberías ver tu aplicación web ejecutándose en App Service.

    Captura de pantalla del sitio web de Space Game.

Andy: ¡Ha salido muy bien! Creo que la adopción de contenedores podría ser una gran victoria para nuestro equipo.