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 de contenedor
Se han realizado los siguientes cambios en las imágenes de contenedor de .NET para .NET 8:
- Usuario no raíz
- Debian 12
- Imágenes cinceladas de Ubuntu
- Compilación de imágenes de contenedor multiplataforma
- Imágenes compuestas de ASP.NET
Usuario sin privilegios de root
Las imágenes incluyen un usuario non-root
. Este usuario hace que las imágenes sean compatibles con non-root
. Para ejecutar como non-root
, agregue la siguiente línea al final del Dockerfile (o una instrucción similar en los manifiestos de Kubernetes):
USER app
.NET 8 agrega una variable de entorno para el UID para el usuario de non-root
, que es 1654. Esta variable de entorno es útil para la prueba de runAsNonRoot
de Kubernetes, lo que requiere que el usuario del contenedor se establezca a través de UID y no por nombre. En este dockerfile se muestra un ejemplo de uso.
El puerto predeterminado también cambió de puerto 80
a 8080
. Para admitir este cambio, hay disponible una nueva variable de entorno ASPNETCORE_HTTP_PORTS
para facilitar el cambio de puertos. La variable acepta una lista de puertos, que es más sencillo que el formato requerido por ASPNETCORE_URLS
. Si cambia el puerto de vuelta al puerto 80
mediante una de estas variables, no se puede ejecutar 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 predeterminada de Linux 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 imagen es para desarrolladores que quieren los beneficios de la informática al estilo de electrodoméstico.
Las imágenes en chiseled no admiten la globalización de forma predeterminada. Se proporcionan las imágenes extra
, que incluyen los paquetes icu
y tzdata
.
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 compilación de imágenes de varias plataformas que funcionan en varios entornos. .NET 8 presenta un nuevo patrón que permite mezclar y combinar arquitecturas con las imágenes de .NET que se generan. 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
como se indica a continuación:
docker build --pull -t app --platform linux/amd64
El SDK de .NET ahora admite los valores $TARGETARCH
y el argumento -a
al restaurar. En el fragmento de código siguiente se muestra un ejemplo:
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 obtener más información, consulte la entrada de blog Mejora de la compatibilidad con contenedores multiplataforma.
ASP.NET imágenes compuestas
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 entorno de ejecución. Esta composición se compila mediante la compilación de varios ensamblados CIL en un único binario de salida listo para ejecutar (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 del compuesto sobre la imagen de ASP.NET normal es que las imágenes compuestas tienen un tamaño menor en el disco.
Hay una advertencia de tener en cuenta. 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 o ASP.NET archivos binarios.
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
- rendimiento y compatibilidad
- Autenticación
- Publicar en el archivo tar.gz
Valores predeterminados de imágenes generadas
dotnet publish
puede generar imágenes de contenedor. De forma predeterminada, genera imágenes non-root
, lo que ayuda a las aplicaciones a mantener la seguridad de forma predeterminada. Cambie este valor predeterminado en cualquier momento estableciendo la propiedad ContainerUser
, 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 enviar a 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 containerizar aplicaciones .NET, consulte Containerizar una aplicación .NET con dotnet publish.
Publicar en archivo tar.gz
A partir de .NET 8, puede crear un contenedor directamente como un archivo de tar.gz. Esta característica es útil si el flujo de trabajo no es sencillo y requiere que, por ejemplo, ejecute una herramienta de escaneo sobre las imágenes antes de subirlas. 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.