Compartir a través de


Novedades de los contenedores para .NET 8

En este artículo se describen las nuevas características de los contenedores para .NET 8.

Imágenes del contenedor

Se han realizado los siguientes cambios en las imágenes de contenedor de .NET para .NET 8:

Usuario no raíz

Las imágenes incluyen un usuario non-root. Este usuario hace que las imágenes sean compatibles con non-root. Para realizar ejecuciones como non-root, agregue la siguiente línea al final del archivo Dockerfile (o una instrucción similar en los manifiestos de Kubernetes):

USER app

.NET 8 agrega una variable de entorno para el UID del usuario non-root, que es 64198. Esta variable de entorno es útil para la prueba runAsNonRoot de Kubernetes, que requiere que se establezca el usuario de contenedor mediante el UID y no por nombre. Este archivo Dockerfile muestra un ejemplo de uso.

El puerto predeterminado también ha cambiado del puerto 80 al puerto 8080. Para admitir este cambio, hay disponible una nueva variable de entorno ASPNETCORE_HTTP_PORTS que facilita el cambio de puertos. La variable acepta una lista de puertos, lo que resulta más sencillo que el formato requerido por ASPNETCORE_URLS. Si vuelve a cambiar al puerto 80 mediante una de estas variables, no puede realizar ejecuciones como non-root.

Para más información, consulte El puerto de ASP.NET Core predeterminado ha cambiado de 80 a 8080 y Nuevo usuario "app" no raíz en imágenes de Linux.

Debian 12

Las imágenes de contenedor ahora usan Debian 12 (Bookworm). Debian es la distribución de Linux predeterminada en las imágenes de contenedor de .NET.

Para más información, consulte Imágenes de contenedor de Debian actualizadas a Debian 12.

Imágenes cinceladas de Ubuntu

Las imágenes de Ubuntu cinceladas están disponibles para .NET 8. Las imágenes cinceladas tienen una superficie expuesta a ataques reducida porque son ultra pequeñas, no tienen ningún administrador de paquetes ni shell, y son non-root. Este tipo de imágenes es para los desarrolladores que buscan beneficiarse de la informática de tipo dispositivo.

Las imágenes en chiseled no admiten la globalización de forma predeterminada. Se proporcionan extra imágenes, que incluyen icu y tzdata paquetes.

Para obtener más información sobre la globalización y los contenedores, consulte Aplicación de prueba de globalización.

Compilación de imágenes de contenedor multiplataforma

Docker admite el uso y la creación de imágenes multiplataforma que funcionan en varios entornos. .NET 8 presenta un patrón nuevo que permite combinar y asociar arquitecturas con las imágenes de .NET que se compilan. Por ejemplo, si usa macOS y quiere tener como destino un servicio en la nube x64 en Azure, puede compilar la imagen mediante el modificador --platform, tal como se indica a continuación:

docker build --pull -t app --platform linux/amd64

El SDK de .NET ahora admite valores $TARGETARCH y el argumento -a en la restauración. Se muestra un ejemplo en el fragmento de código siguiente:

RUN dotnet restore -a $TARGETARCH

# Copy everything else and build app.
COPY aspnetapp/. .
RUN dotnet publish -a $TARGETARCH --self-contained false --no-restore -o /app

Para más información, consulte esta entrada de blog que trata sobre la mejora de la compatibilidad con contenedores multiplataforma.

Imágenes compuestas de ASP.NET

Como parte de un esfuerzo para mejorar el rendimiento de la contenedorización, hay nuevas imágenes de Docker ASP.NET disponibles que tienen una versión compuesta del runtime. Este elemento compuesto se compila mediante la compilación de varios ensamblados MSIL en un único archivo binario de salida listo para ejecutarse (R2R). Dado que estos ensamblados se insertan en una sola imagen, los métodos de compilación JIT tardan menos y el rendimiento de inicio de las aplicaciones mejora. La otra gran ventaja de la imagen compuesta frente a la imagen de ASP.NET normal es que las imágenes compuestas tienen un tamaño menor en el disco.

Hay que tener en cuenta una advertencia. Dado que las imágenes compuestas tienen varios ensamblados insertados en uno, tienen un acoplamiento de versión más ajustado. Las aplicaciones no pueden usar versiones personalizadas del marco ni archivos binarios de ASP.NET.

Las imágenes compuestas están disponibles para las plataformas Alpine Linux, Ubuntu ("jammy") Chiseled y Mariner Distroless en el repositorio mcr.microsoft.com/dotnet/aspnet. Las etiquetas se muestran con el sufijo -composite en la página ASP.NET Docker.

Publicación de contenedores

Valores predeterminados de imágenes generadas

dotnet publish puede producir imágenes de contenedor. De forma predeterminada, produce non-root imágenes, lo que ayuda a que sus aplicaciones se mantengan seguras de forma predeterminada. Cambie este valor predeterminado en cualquier momento estableciendo el ContainerUser correcto, por ejemplo, con root.

La etiqueta de contenedor de salida predeterminada ahora está latest. Este valor predeterminado está en línea con otras herramientas en el espacio de contenedores y hace que los contenedores sean más fáciles de usar en bucles de desarrollo interno.

Rendimiento y compatibilidad

.NET 8 ha mejorado el rendimiento para insertar contenedores en registros remotos, especialmente registros de Azure. La velocidad proviene de insertar capas en una sola operación y, para los registros que no admiten cargas atómicas, un mecanismo de fragmentación más confiable.

Estas mejoras también significan que se admiten más registros: Harbor, Artifactory, Quay.io y Podman.

Autenticación

.NET 8 agrega compatibilidad con la autenticación de intercambio de tokens de OAuth (Azure Managed Identity) al insertar contenedores en registros. Esta compatibilidad significa que ahora puede insertar en registros como Azure Container Registry sin errores de autenticación. Los comandos siguientes muestran un flujo de publicación de ejemplo:

> az acr login -n <your registry name>
> dotnet publish -r linux-x64 -p PublishProfile=DefaultContainer

Para obtener más información sobre cómo incluir aplicaciones .NET en un contenedor, consulte Inclusión en un contenedor de una aplicación .NET con dotnet publish.

Publicar en el archivo tar.gz

A partir de .NET 8, puede crear un contenedor directamente como archivo tar.gz. Esta característica es útil si el flujo de trabajo no es sencillo y requiere que, por ejemplo, ejecute una herramienta de examen sobre las imágenes antes de insertarlas. Una vez creado el archivo, puede moverlo, examinarlo o cargarlo en una cadena de herramientas local de Docker.

Para publicar en un archivo, agregue la propiedad ContainerArchiveOutputPath al comando dotnet publish, por ejemplo:

dotnet publish \
  -p PublishProfile=DefaultContainer \
  -p ContainerArchiveOutputPath=./images/sdk-container-demo.tar.gz

Puede especificar un nombre de carpeta o una ruta de acceso con un nombre de archivo específico.

Consulte también