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.
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.