Implementación de una plantilla Worker Service en Azure
En este artículo, aprenderá a implementar una plantilla Worker Service de .NET en Azure. Con la plantilla Worker en ejecución como una Instancia de contenedor de Azure (ACI) desde Azure Container Registry (ACR), puede actuar como un microservicio en la nube. Hay muchos casos de uso para los servicios de ejecución larga, y la plantilla Worker Service existe por este motivo.
En este tutorial aprenderá a:
- Crear una plantilla Worker Service
- Crear un recurso de registro de contenedor
- Insertar una imagen en el registro de contenedor
- Implementar como una instancia de contenedor
- Comprobar la funcionalidad de la plantilla Worker Service
Sugerencia
Todo el ejemplo de "Trabajos en .NET" está disponible en el Explorador de ejemplos para su descarga. Para obtener más información, consulte Examinación de ejemplos de código: Trabajos en .NET.
Requisitos previos
- SDK de .NET 5.0 o posterior.
- Docker Desktop (Windows o Mac).
- Una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.
- En función del entorno de desarrollador que prefiera:
Crear un proyecto nuevo
Para crear un proyecto de Worker Service con Visual Studio, seleccione Archivo>Nuevo>Proyecto... En el cuadro de diálogo Crear un proyecto, busque "Worker Service" y seleccione la plantilla Worker Service. Escriba el nombre del proyecto deseado, seleccione una ubicación adecuada y seleccione Siguiente. En la página Información adicional, para la Plataforma de destino, seleccione .NET 5.0
y active la opción Habilitar Docker para habilitar la compatibilidad con Docker. Seleccione el SO de Docker que desee.
Para crear un proyecto de Worker Service con Visual Studio Code, puede ejecutar comandos de la CLI de .NET desde el terminal integrado. Para más información, vea Visual Studio Code: terminal integrado.
Abra el terminal integrado, ejecute el comando dotnet new
y reemplace <Project.Name>
por el nombre de proyecto deseado.
dotnet new worker --name <Project.Name>
Para más información sobre el comando del nuevo proyecto de Worker Service de la CLI de .NET, vea dotnet new worker.
Para crear un proyecto de Worker Service con la CLI de .NET, abra su terminal favorito en un directorio de trabajo. Ejecute el comando dotnet new
y reemplace <Project.Name>
por el nombre del proyecto deseado.
dotnet new worker --name <Project.Name>
Para más información sobre el comando del nuevo proyecto de Worker Service de la CLI de .NET, vea dotnet new worker.
Compile la aplicación para asegurarse de que restaura los paquetes dependientes y se compila sin errores.
Para compilar la aplicación desde Visual Studio, seleccione F6 o seleccione la opción de menú Compilar>Compilar solución.
Para compilar la aplicación desde Visual Studio Code, abra la ventana del terminal integrado y ejecute el comando dotnet build
desde el directorio de trabajo.
dotnet build
Para obtener más información sobre el comando de compilación de la CLI de .NET, consulte dotnet build
.
Para compilar la aplicación desde la CLI de .NET, ejecute el comando dotnet build
desde el directorio de trabajo.
dotnet build <path/to/project.csproj>
Especifique el valor <path/to/project.csproj>
, que es la ruta de acceso al archivo del proyecto que se va a compilar. Para obtener más información sobre el comando de compilación de la CLI de .NET, consulte dotnet build
.
Agregue compatibilidad con Docker
Si activó correctamente la casilla Habilitar Docker al crear un nuevo proyecto de trabajo, vaya al paso Compilación de la imagen de Docker.
Si no activó esta opción, no se preocupe, todavía puede hacerlo ahora. En Visual Studio, haga clic con el botón derecho en el nodo del proyecto en el Explorador de soluciones y seleccione Agregar>Compatibilidad con Docker. Se le pedirá que seleccione un SO de destino y, después, que seleccione Aceptar con la selección predeterminada del sistema operativo.
En Visual Studio Code, necesita tener instalada la extensión de Docker y la extensión Azure Account. Abra la paleta de comandos y seleccione la opción Docker: Add Docker files to workspace (Docker: Agregar archivos de Docker al área de trabajo). Si se le pide que seleccione la plataforma de aplicación, elija Consola .NET: Core. Si se le pide que seleccione el proyecto, elija el proyecto de Worker Service que creó. Cuando se le pida que seleccione el sistema operativo, elija el primer sistema operativo de la lista. Cuando se le pida si desea o no incluir archivos de Docker Compose opcionales, seleccione No.
La compatibilidad con Docker requiere un Dockerfile. Este archivo es un conjunto de instrucciones completas para compilar la plantilla Worker Service de .NET como una imagen de Docker. Dockerfile es un archivo sin extensión de archivo. El siguiente código es un Dockerfile de ejemplo que debe existir en el directorio raíz del archivo del proyecto.
Con la CLI, Dockerfileno se crea automáticamente. Copie su contenido en un nuevo archivo denominado Dockerfile en el directorio raíz del proyecto.
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
WORKDIR /app
# Creates a non-root user with an explicit UID and adds permission to access the /app folder
# For more info, please refer to https://aka.ms/vscode-docker-dotnet-configure-containers
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["App.CloudService.csproj", "./"]
RUN dotnet restore "App.CloudService.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "App.CloudService.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "App.CloudService.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "App.CloudService.dll"]
Nota:
Debe actualizar las distintas líneas del Dockerfile que hacen referencia a *App.CloudService (reemplace esto por el nombre del proyecto).
Para obtener más información sobre las imágenes oficiales de .NET, consulte Docker Hub: .NET Runtime y Docker Hub: SDK de .NET.
Compilación de la imagen de Docker
Para compilar la imagen de Docker, el motor de Docker debe estar en ejecución.
Importante
Si se usan Docker Desktop y Visual¹Studio para evitar errores relacionados con el uso compartido de volúmenes, es preciso asegurarse de que está activado.
- En la pantalla Configuración de Docker Desktop, seleccione Unidades compartidas.
- Seleccione las unidades que contienen los archivos del proyecto.
Para obtener más información, consulte Solución de problemas de desarrollo de Visual Studio con Docker.
Haga clic con el botón derecho en el Dockerfile en el Explorador de soluciones y seleccione Compilar imagen de Docker. Se abre la ventana Salida, en la que se registra el progreso del comando docker build
.
Haga clic con el botón derecho en el Dockerfile en el Explorador y seleccione Compilar imagen. Cuando se le pida Etiquetar la imagen como, escriba appcloudservice:latest
. Se muestra el terminal de salida de la Tarea de Docker, que informa del progreso del comando de compilación de Docker.
Nota
Si no se le pide que etiquete la imagen, es posible que Visual Studio Code se base en el archivo tasks.json existente. Si no desea la etiqueta utilizada, puede cambiarla actualizando el valor dockerBuild/tag
del elemento de configuración docker-build
en la matriz tasks
. Tenga en cuenta la siguiente sección de configuración de ejemplo:
{
"type": "docker-build",
"label": "docker-build: release",
"dependsOn": [
"build"
],
"dockerBuild": {
"tag": "appcloudservice:latest",
"dockerfile": "${workspaceFolder}/cloud-service/Dockerfile",
"context": "${workspaceFolder}",
"pull": true
},
"netCore": {
"appProject": "${workspaceFolder}/cloud-service/App.CloudService.csproj"
}
}
Abra una ventana de terminal en el directorio raíz del Dockerfile y ejecute el siguiente comando de Docker:
docker build -t appcloudservice:latest -f Dockerfile .
A medida que se ejecuta el comando docker build
, procesa cada línea del Dockerfile como un paso de instrucción. Este comando compila la imagen y crea un repositorio local denominado appcloudservice que apunta a la imagen.
Sugerencia
El Dockerfile generado difiere entre los entornos de desarrollo. Por ejemplo, si Agrega compatibilidad con Docker desde Visual Studio, puede experimentar problemas si intenta Compilar la imagen de Docker desde Visual Studio Code, ya que los pasos del Dockerfile varían. Es mejor elegir un único entorno de desarrollo y usarlo en este tutorial.
Crear un registro de contenedor
Un recurso de Azure Container Registry (ACR) permite compilar, almacenar y administrar imágenes y artefactos de contenedor en un registro privado. Para crear un registro de contenedor, debe crear un recurso en Azure Portal.
- Seleccione la Suscripción y el Grupo de recursos correspondiente, o bien cree uno.
- Escriba un Nombre del Registro.
- Seleccione una ubicación.
- Seleccione una SKU adecuada; por ejemplo, Básico.
- Seleccione Revisar + crear.
- Después de que aparezca Validación superada, seleccione Crear.
Importante
Para usar este registro de contenedor al crear una instancia de contenedor, debe habilitar Usuario administrador. Seleccione Claves de acceso y habilite Usuario administrador.
Un recurso de Azure Container Registry (ACR) permite compilar, almacenar y administrar imágenes y artefactos de contenedor en un registro privado. Abra una ventana de terminal en el directorio raíz del Dockerfile y ejecute el siguiente comando de la CLI de Azure:
Importante
Para interactuar con los recursos de Azure desde la CLI de Azure, debe autenticarse para la sesión del terminal. Para autenticarse, use el comando az login
:
az login
Una vez que haya iniciado sesión, use el comando az account set
para especificar la suscripción cuando tenga más de una y cuando no haya ninguna suscripción predeterminada establecida.
az account set --subscription <subscription name or id>
Una vez que inicie sesión en la CLI de Azure, la sesión puede interactuar con los recursos en consecuencia.
Si aún no tiene un grupo de recursos al que le gustaría asociar el servicio de trabajo, cree uno mediante el comando az group create
:
az group create -n <resource group> -l <location>
Proporcione el nombre <resource group>
y <location>
. Para crear un registro de contenedor, llame al comando az acr create
.
az acr create -n <registry name> -g <resource group> --sku <sku> --admin-enabled true
Reemplace los marcadores de posición por sus propios valores:
<registry name>
: el nombre del registro.<resource group>
: el nombre del grupo de recursos que usó.<sku>
: valores aceptados, Básico, Clásico, Premium o Estándar.
El comando anterior:
- Crea una instancia de Azure Container Registry, dado un nombre del registro, en el grupo de recursos especificado.
- Habilita un usuario administrador: necesario para Azure Container Instances.
Para más información, vea Inicio rápido: Creación de un instancia de Azure Container Registry mediante Azure Portal.
Inserción de imágenes en Container Registry
Con la imagen de Docker de .NET compilada y el recurso de registro de contenedor creado, ahora puede insertar la imagen en el registro de contenedor.
Haga clic con el botón derecho en el proyecto en el Explorador de soluciones y seleccione Publicar. Se muestra el cuadro de diálogo Publicar. En Destino, seleccione Azure y, a continuación, Siguiente.
En Destino específico, seleccione Azure Container Registry y, a continuación, Siguiente.
A continuación, en Container Registry, seleccione el Nombre de suscripción que usó para crear el recurso de ACR. En el área de selección Registros de contenedor, seleccione el registro de contenedor que creó y, a continuación, seleccione Finalizar.
Esto crea un perfil de publicación, que se puede usar para publicar la imagen en el registro de contenedor. Seleccione el botón Publicar para insertar la imagen en el registro de contenedor, la ventana Salida notifica el progreso de la publicación, y, cuando se complete correctamente, verá un mensaje "Publicación realizada correctamente".
Seleccione Docker en la Barra de actividad en Visual Studio Code. Expanda el panel de la vista de árbol IMÁGENES, expanda el nodo de imagen appcloudservice
y haga clic con el botón derecho en la etiqueta latest
.
La ventana del terminal integrado informa del progreso del comando docker push
al registro de contenedor.
Para insertar una imagen en el registro de contenedor, primero debe iniciar sesión en el registro:
az acr login -n <registry name>
El comando az acr login
inicia sesión en un registro de contenedor mediante la CLI de Docker. Para insertar la imagen en el registro de contenedor, use el comando az acr build con el nombre del registro de contenedor como <registry name>
:
az acr build -r <registry name> -t appcloudservice .
El comando anterior:
- Empaqueta el origen en un archivo tar.
- Lo carga en el registro de contenedor.
- El registro de contenedor desempaqueta el archivo tar.
- Ejecuta el comando
docker build
en el recurso del registro de contenedor en el Dockerfile. - Agrega la imagen en el registro de contenedor.
Para comprobar que la imagen se ha insertado correctamente en el registro de contenedor, vaya a Azure Portal. Abra el recurso del registro de contenedor y, en Servicios, seleccione Repositorios. Debería ver la imagen.
Implementación como una instancia de contenedor
En Visual Studio Code, seleccione Docker en la Barra de actividad. Expanda el nodo REGISTROS y seleccione Connect Registry (Conectar registro). Seleccione Azure cuando se le solicite e inicie sesión si es necesario.
Importante
La implementación como una instancia de contenedor desde Visual Studio Code ya no funciona en Mac. Para más información, consulte GitHub: Acerca de la extensión de Docker para Visual Studio Code.
Expanda el nodo REGISTROS, seleccione Azure, su suscripción > el registro de contenedor > la imagen y, después, haga clic con el botón derecho en la etiqueta. Seleccione Deploy Image to Azure Container Instances (Implementar imagen en Azure Container Instances).
Para crear una instancia de contenedor, primero cree un grupo de contenedores usando el comando az container create
.
az container create -g <resource group> \
--name <instance name> \
--image <registry name>.azurecr.io/<image name>:latest \
--registry-password <password>
Proporcione los valores adecuados:
<resource group>
: el nombre del grupo de recursos que ha estado usando en este tutorial.<instance name>
: el nombre de la instancia de contenedor.<registry name>
: el nombre del registro de contenedor.<image name>
: el nombre de la imagen.<password>
: la contraseña del registro de contenedor (se puede obtener en Azure Portal, un recurso de Azure Container Registry >Claves de acceso).
Para crear una instancia de contenedor, también es necesario crear un nuevo recurso en Azure Portal.
- Seleccione la misma Suscripción y el Grupo de recursos correspondiente de la sección anterior.
- Escriba un nombre de contenedor:
appcloudservice-container
. - Seleccione una Región que se corresponda con la selección de Ubicación anterior.
- Para Origen de imagen, seleccione Azure Container Registry.
- Seleccione el Registro por el nombre proporcionado en el paso anterior.
- Seleccione la Imagen y la Etiqueta de imagen.
- Seleccione Revisar + crear.
- Si aparece Validación superada, seleccione Crear.
Los recursos pueden tardar un momento en crearse. Una vez creados, seleccione el botón Ir al recurso.
Para más información, vea Inicio rápido: Implementación de una instancia de contenedor en Azure mediante Azure Portal.
Comprobación de la funcionalidad del servicio
Inmediatamente después de crear la instancia de contenedor, comienza a ejecutarse.
Para comprobar que el servicio de trabajo funciona correctamente, vaya a Azure Portal en el recurso de instancia de contenedor y seleccione la opción Contenedores.
Verá los contenedores y su Estado actual. En este caso, es En ejecución. Seleccione Registros para ver la salida de la plantilla Worker Service de .NET.
Para comprobar que el servicio de trabajo funciona correctamente, puede ver los registros de la aplicación en ejecución. Use el comando az container logs
:
az container logs -g <resource group> --name <instance name>
Proporcione los valores adecuados:
<resource group>
: el nombre del grupo de recursos que ha estado usando en este tutorial.<instance name>
: el nombre de la instancia de contenedor.
Verá los registros de salida del servicio de trabajo de .NET, lo que significa que ha implementado correctamente la aplicación en contenedores en ACI.