Contenerizar una aplicación de .NET con dotnet publish
Los contenedores tienen muchas características y ventajas, como ser una infraestructura inmutable, proporcionar una arquitectura portátil y habilitar la escalabilidad. La imagen se puede usar para crear contenedores para el entorno de desarrollo local, la nube privada o la nube pública. En este tutorial, aprenderá a incluir en contenedores una aplicación .NET mediante el comando dotnet publish
Sugerencia
Si está interesado en usar un Dockerfile para contenedorizar la aplicación .NET, consulte Tutorial: Contenedorización de una aplicación .NET.
Prerrequisitos
Instale los siguientes requisitos previos:
- SDK de .NET 8+
Si tiene instalado .NET, use el comandodotnet --info
para determinar qué SDK usa.
Si planea ejecutar el contenedor localmente, necesita un entorno de ejecución de contenedor compatible con Open Container Initiative (OCI), como:
- Docker Desktop: entorno de ejecución de contenedores más común.
- Podman: una alternativa sin demonio de código abierto a Docker.
Importante
El SDK de .NET crea imágenes de contenedor sin Docker. Docker o Podman solo son necesarios si desea ejecutar la imagen localmente. De forma predeterminada, al publicar su aplicación .NET como una imagen de contenedor, se envía a un entorno de ejecución de contenedor local. Como alternativa, puede guardar la imagen como un tarball o insertarla directamente en un registro de contenedor sin usar ningún entorno de ejecución de contenedor.
Además de estos requisitos previos, se recomienda que esté familiarizado con los servicios de trabajo en .NET, ya que el proyecto de ejemplo es un trabajo.
Creación de una aplicación .NET
Necesita una aplicación de .NET para incluir en contenedores, así que empiece por crear una nueva aplicación a partir de una plantilla. Abra el terminal, cree una carpeta de trabajo (directorio de ejemplo) si aún no lo ha hecho y cambie los directorios para que esté en él. En la carpeta de trabajo, ejecute el comando siguiente para crear un nuevo proyecto en un subdirectorio denominado Worker:
dotnet new worker -o Worker -n DotNet.ContainerImage
El árbol de carpetas tiene un aspecto similar al siguiente directorio:
📁 sample-directory
└──📂 Worker
├──appsettings.Development.json
├──appsettings.json
├──DotNet.ContainerImage.csproj
├──Program.cs
├──Worker.cs
├──📂 Properties
│ └─── launchSettings.json
└──📂 obj
├── DotNet.ContainerImage.csproj.nuget.dgspec.json
├── DotNet.ContainerImage.csproj.nuget.g.props
├── DotNet.ContainerImage.csproj.nuget.g.targets
├── project.assets.json
└── project.nuget.cache
El comando dotnet new
crea una nueva carpeta denominada worker y genera un servicio de trabajo que, cuando se ejecuta, registra un mensaje cada segundo. Desde su sesión de terminal, cambie de directorio y navegue a la carpeta Worker. Use el comando dotnet run
para iniciar la aplicación.
dotnet run
Using launch settings from ./Worker/Properties/launchSettings.json...
Building...
info: DotNet.ContainerImage.Worker[0]
Worker running at: 01/06/2025 13:37:28 -06:00
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
Content root path: .\Worker
info: DotNet.ContainerImage.Worker[0]
Worker running at: 01/06/2025 13:37:29 -06:00
info: DotNet.ContainerImage.Worker[0]
Worker running at: 01/06/2025 13:37:30 -06:00
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
La plantilla de trabajo se repite en bucle indefinidamente. Use el comando cancel Ctrl+C para detenerlo.
Establecimiento del nombre de la imagen de contenedor
Hay varias opciones de configuración disponibles al publicar una aplicación como contenedor. De forma predeterminada, el nombre de la imagen de contenedor es el AssemblyName
del proyecto. Si ese nombre no es válido como nombre de imagen de contenedor, puede invalidarlo especificando un ContainerRepository
como se muestra en el siguiente archivo de proyecto:
<Project Sdk="Microsoft.NET.Sdk.Worker">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UserSecretsId>dotnet-DotNet.ContainerImage-2e40c179-a00b-4cc9-9785-54266210b7eb</UserSecretsId>
<ContainerRepository>dotnet-worker-image</ContainerRepository>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.1" />
</ItemGroup>
</Project>
Para obtener más referencia, consulte ContainerRepository
.
Publicación de la aplicación .NET
Para publicar la aplicación .NET como contenedor, use el siguiente comando dotnet publish:
dotnet publish --os linux --arch x64 /t:PublishContainer
El comando anterior de la CLI de .NET publica la aplicación como contenedor:
- Tiene Linux como sistema operativo de destino (
--os linux
). - Especificar una arquitectura x64 (
--arch x64
).
Importante
Para publicar el contenedor localmente, debe tener un demonio activo compatible con OCI en ejecución. Si no se está ejecutando al intentar publicar la aplicación como contenedor, se produce un error similar al siguiente:
..\build\Microsoft.NET.Build.Containers.targets(66,9): error MSB4018:
The "CreateNewImage" task failed unexpectedly. [..\Worker\DotNet.ContainerImage.csproj]
El comando dotnet publish
genera una salida similar a la salida de ejemplo:
Restore complete (0.2s)
DotNet.ContainerImage succeeded (2.6s) → bin\Release\net9.0\linux-x64\publish\
Este comando compila la aplicación de trabajo en la carpeta de publicación e inserta la imagen de contenedor en el demonio de Docker local de forma predeterminada. Si está usando Podman, un alias
Publicación de una aplicación .NET en un tarball
Un archivo tarball (o tar) es un archivo que contiene otros archivos. Normalmente termina con un *.tar.gz extensión de archivo compuesto para ayudar a indicar que es un archivo comprimido. Estos tipos de archivo se usan para distribuir software o para crear copias de seguridad. En este caso, el tarball creado se usa para distribuir una imagen de contenedor.
Para publicar una aplicación de .NET como contenedor en tarball, use el siguiente comando:
dotnet publish --os linux --arch x64 \
/t:PublishContainer \
-p ContainerArchiveOutputPath=./images/container-image.tar.gz
El comando anterior publica la aplicación como un contenedor en un tarball:
- Tiene Linux como sistema operativo de destino (
--os linux
). - Especificar una arquitectura x64 (
--arch x64
). - Establecer la propiedad
ContainerArchiveOutputPath
en./images/container-image.tar.gz
.
El comando no requiere un demonio compatible con OCI en ejecución. Para obtener más información, consulte ContainerArchiveOutputPath
.
Cargar el tarball
Un caso de uso común para exportar a un tarball es para organizaciones centradas en la seguridad. Crean contenedores, los exportan como archivos tar y luego ejecutan herramientas de análisis de seguridad en esos archivos. Este enfoque simplifica el cumplimiento, ya que evita las complejidades del examen de un sistema activo.
El tarball contiene todo el contenedor, que luego se puede cargar mediante la herramienta adecuada:
- Docker:
docker load -i ./images/container-image.tar.gz
- Podman:
podman load -i ./images/container-image.tar.gz
Publicación de una aplicación .NET en el registro de contenedor
Los registros de contenedor son servicios que almacenan y administran imágenes de contenedor. Se usan para almacenar y distribuir imágenes de contenedor en varios entornos. Puede publicar una aplicación de .NET como contenedor en un registro de contenedor mediante el comando siguiente:
dotnet publish --os linux --arch x64 \
/t:PublishContainer \
-p ContainerRegistry=ghcr.io
El código anterior publica la aplicación como un contenedor en un registro de contenedor:
- Tiene Linux como sistema operativo de destino (
--os linux
). - Especificar una arquitectura x64 (
--arch x64
). - Establecer la propiedad
ContainerRegistry
enghcr.io
.
Para obtener más información, consulte ContainerRegistry.
Limpieza de recursos
En este artículo, ha publicado un trabajo de .NET como una imagen de contenedor. Si lo desea, elimine este recurso. Use el comando docker images
para ver una lista de imágenes instaladas.
docker images
Considere la siguiente salida de ejemplo:
REPOSITORY TAG IMAGE ID CREATED SIZE
dotnet-worker-image 1.0.0 25aeb97a2e21 12 seconds ago 191MB
Sugerencia
Los archivos de imagen pueden ser grandes. Normalmente, quitaría los contenedores temporales que creó al probar y desarrollar la aplicación. Normalmente, las imágenes base se mantienen instaladas con el tiempo de ejecución si planea crear otras imágenes basadas en ese tiempo de ejecución.
Para eliminar la imagen, copie el identificador de la imagen y ejecute el comando docker image rm
:
docker image rm 25aeb97a2e21
Pasos siguientes
- Anuncio de la compatibilidad con contenedores integrada en el SDK de .NET
- Tutorial de : Contenedorización de una aplicación .NET
- Imágenes de contenedor de .NET
- Revise los servicios de Azure que admiten contenedores
- Consulte los comandos de Dockerfile
- Explorar las herramientas de contenedor en Visual Studio