Compartir vía


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 sin usar un Dockerfile. Además, explorará cómo configurar la imagen de contenedor y su ejecución, y cómo eliminar los recursos.

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 comando dotnet --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 en ghcr.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