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 en la solución e implementa la aplicación web en la instancia de App Service. Ahora, es el momento de actualizar esa compilación de canalización e implementar el proyecto como un contenedor en su lugar.

En esta unidad aprenderá a:

  • Definir algunas variables de canalización para facilitar el mantenimiento de la canalización de compilación
  • Reemplazar las tareas de Compilación existentes por una tarea unificada que compile e inserte un contenedor de Docker
  • Reemplazar la tarea de Implementación existente por una que actualice la aplicación web de App Service con la nueva imagen de contenedor
  • Guardado de la canalización para desencadenar una compilación y una versión.

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

Aquí agregaremos una nueva variable de canalización a la canalización de 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 como main; para ello, selecciónela en el menú desplegable. Esto abre el archivo azure-pipelines.yml.

  4. Agregue las líneas resaltadas abajo para agregar unas variables de canalización denominadas webRepository y tag. Las usaremos 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 variablebuildConfiguration; ya no la necesitará.

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

Reemplazo de las tareas de la fase de compilación

Andy: Creo que ya no necesitamos ninguna de estas tareas de compilación, puesto que el Dockerfile de la carpeta del proyecto ya define la compilación que queremos. Pese a ello, todavía no he tenido la oportunidad de analizar qué podemos usar para compilar la imagen con un Dockerfile. ¿Alguna idea?

Mara: Estaba viendo justamente esto. Parece que podemos compilar el contenedor e, incluso, insertarlo en el repositorio con una sola tarea. Vamos a agregarla ahora mismo.

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 siguiente fragmento de YAML.

  • command: Especifica el comando de 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 de 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, esto parece bastante sencillo. Ahora, lo único que hay que hacer es encontrar una tarea que indique a App Service que use la versión recién insertada de la imagen del contenedor.

Mara: Ya estoy en ello. Es un poco diferente a implementar una compilación en Azure Pipelines, aunque sigue siendo lo suficientemente directa como para que podamos condensar todo en una sola tarea. Vamos a agregarla ahora mismo.

Tarea AzureWebAppContainer

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

  • appName: Especifica el nombre de un 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 Save en la esquina superior derecha de la página. Escriba el mensaje de confirmación y, luego, seleccione Save para confirmar.

  2. Seleccione Ejecutar y asegúrese de que la rama esté establecida en main. Seleccione Ejecutar cuando haya acabado.

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

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

  4. La aplicación web debería ejecutarse en App Service.

    Screenshot of the Space Game website.

Andy: ¡Ha salido muy bien! Creo que el uso de contenedores puede ser muy beneficioso para nuestro equipo.