Saltar al contenido

Cómo escalar aplicaciones ASP.NET Core con el modo Docker Swarm

Con Docker Swarm puedes aplicar actualizaciones continuas a un servicio sin interrupciones. Para publicar las actualizaciones primero tenemos que versionar nuestra aplicación.

Abra project.json y añada el elemento “version”: “1.0.0-*”. Ahora necesitamos usar el número de versión para etiquetar la imagen del Docker.

Cómo escalar aplicaciones ASP.NET Core con el modo Docker Swarm
Cómo escalar aplicaciones ASP.NET Core con el modo Docker Swarm

En la raíz del proyecto, a continuación el archivo .sln, crear un script de PowerShell swarm-ver-deploy.ps1 con el siguiente contenido:

123456789101112131415161718192021$serviceName="tokengen "# parse project.json y extraiga la versión de la aplicación$rootPath= Split-Path -Path $MyInvocation.MyCommand. Definition -Parent$projectPath="$rootPathsrcTokenGenproject.json"$json= Get-Content -Raw -Path $projectPath| ConvertFrom-Json$version=$json.version. Split("-")[0]# tag docker image with app version$imageName="$serviceName-img:$version "# build imageif(docker images -q $imageName){"Image $imageName existe! "return}else{ docker build -t $imageName -f "$rootPathTokenGen.dockerfile"$rootPath}# create servicedocker service create --publish 5000:5000 --name $serviceName --replicas 3 --update-delay 5s $imageName

bash

Este script lee la versión de project.json, construye la imagen docker tokengen-img:version, y crea el servicio tokengen.

Tenga en cuenta que estamos usando el parámetro de actualización-retardo para configurar el enjambre con un retardo de actualización de 5 segundos, para que las nuevas instancias de servicio tengan tiempo de iniciarse.

Si ejecutamos swarm-ver-deploy.ps1 entonces docker ps obtenemos lo siguiente:

1234IDENTIFICACIÓN DEL CONTENEDOR IMAGEN COMANDO CREADO NOMBRES DE PUERTOS DE ESTADO223a898ee96b tokengen-img:1.0.0 "dotnet run" Hace aproximadamente un minuto Subir Aproximadamente un minuto 5000/tcp tokengen.3 .8ugt7nogpqczkorm7ehdvw2nb0b2d5e3b7288 tokengen-img:1.0.0 "dotnet run" Hace un minuto Arriba Un minuto 5000/tcp tokengen.2 .creqhebrccauxmiwm2iaz6fxt9edb15886b9a tokengen-img:1.0.0 "dotnet run" Hace un minuto Subir Alrededor de un minuto 5000/tcp tokengen.1.a3ufm7s7iul5nouidrjt38tkg

Ahora podemos crear otro guión que publicará nuevas versiones. Nombra este script swarm-ver-update.ps1:

123456789101112131415161718192021$serviceName="tokengen "# parse project.json y extraiga la versión de la aplicación$rootPath= Split-Path -Path $MyInvocation.MyCommand. Definition -Parent$projectPath=$rootPath + "srcTokenGenproject.json"$json= Get-Content -Raw -Path $projectPath| ConvertFrom-Json$version=$json.version. Split("-")[0]# tag docker image with app version$imageName="$serviceName-img:$version "# build imageif(docker images -q $imageName){"Image $imageName exists!"return}else{ docker build -t $imageName -f "$rootPathTokenGen.dockerfile"$rootPath}# apply updatedocker service update --image $imageName$serviceName

bash

Al igual que el guión de despliegue, swarm-ver-actualización.psl lee la versión de project.json y construye la nueva imagen. Pero en lugar de crear un servicio, usamos el comando de actualización de servicios para especificar la nueva imagen.

Si cambias la versión del proyecto a 1.0.1-* y ejecutas swarm-ver-update.ps1, la salida de docker ps será:

bash

Como pueden ver, todas las réplicas del servicio han sido actualizadas a la v1.0.1. Si ejecutara docker ps mientras se ejecuta la actualización vería que la v1.0.1 se aplicó gradualmente.