Introducción a .NET y Docker

Los contenedores son una de las formas más populares de implementar y hospedar aplicaciones en la nube, con herramientas como Docker, Kubernetes y Podman. Muchos desarrolladores optan por los contenedores porque es sencillo empaquetar una aplicación con sus dependencias y conseguir que esa aplicación se ejecute de forma confiable en cualquier host de contenedor. Hay una amplia compatibilidad con el uso de .NET con contenedores.

Docker proporciona una excelente introducción a los contenedores. Docker Desktop: Community Edition es una buena herramienta para usar contenedores en la máquina de escritorio para desarrolladores.

Imágenes de .NET

Las imágenes de contenedor oficiales de .NET se publican en el Registro de artefactos de Microsoft y se pueden detectar en el Docker Hub. Hay imágenes de runtime para producción e imágenes SDK para compilar el código, para Linux (Alpine, Debian, Ubuntu, Mariner) y Windows. Para obtener más información, vea Imágenes de contenedor .NET.

Las imágenes de .NET se actualizan periódicamente cada vez que se publica una nueva revisión de .NET o cuando se actualiza una imagen base del sistema operativo.

Las imágenes de contenedor chiseled son imágenes de contenedor de Ubuntu con un conjunto mínimo de componentes requeridos por el runtime de .NET. Estas imágenes son ~100 MB más pequeñas que las imágenes de Ubuntu normales y tienen menos CVE, ya que tienen menos componentes. En concreto, no contienen un shell ni un administrador de paquetes, lo que mejora significativamente su perfil de seguridad. También incluyen un usuario no root y están configurados con ese usuario habilitado.

Crear imagenes de contenedor

Puede compilar una imagen de contenedor con un Dockerfile o confiar en el SDK de .NET para generar una imagen. Para obtener ejemplos sobre la creación de imágenes, consulte dotnet/dotnet-docker y dotnet/sdk-container-builds.

En el siguiente ejemplo se muestra cómo compilar y ejecutar una imagen de contenedor en unos pocos pasos rápidos (compatible con .NET 8 y .NET 7.0.300).

$ dotnet new webapp -o webapp
$ cd webapp/
$ dotnet publish -t:PublishContainer
MSBuild version 17.8.3+195e7f5a3 for .NET
  Determining projects to restore...
  All projects are up-to-date for restore.
  webapp -> /home/rich/webapp/bin/Release/net8.0/webapp.dll
  webapp -> /home/rich/webapp/bin/Release/net8.0/publish/
  Building image 'webapp' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'.
  Pushed image 'webapp:latest' to local registry via 'docker'.
$ docker run --rm -d -p 8000:8080 webapp
7c7ad33409e52ddd3a9d330902acdd49845ca4575e39a6494952b642e584016e
$ curl -s http://localhost:8000 | grep ASP.NET
    <p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
$ docker ps
CONTAINER ID   IMAGE     COMMAND               CREATED              STATUS              PORTS                                       NAMES
7c7ad33409e5   webapp    "dotnet webapp.dll"   About a minute ago   Up About a minute   0.0.0.0:8000->8080/tcp, :::8000->8080/tcp   jovial_shtern
$ docker kill 7c7ad33409e5

docker init es una nueva opción para los desarrolladores que desean usar Dockerfiles.

Puertos

La asignación de puertos es una parte clave del uso de contenedores. Los puertos deben publicarse fuera del contenedor para responder a solicitudes web externas. Las imágenes de contenedor de ASP.NET Core han cambiado en .NET 8 para escuchar en el puerto 8080, de manera predeterminada. .NET 6 y 7 escuchan en el puerto 80.

En el ejemplo anterior con docker run, el puerto host 8000 se asigna al puerto de contenedor 8080. Kubernetes funciona de forma similar.

Las variables de entorno ASPNETCORE_HTTP_PORTS, ASPNETCORE_HTTPS_PORTS y ASPNETCORE_URLS se pueden usar para configurar este comportamiento.

Usuarios

A partir de .NET 8, todas las imágenes incluyen un usuario no root llamado app. De forma predeterminada, las imágenes chiseled se configuran con este usuario habilitado. La característica de publicar aplicación como contenedor de .NET (que se muestra en la sección Compilar imágenes de contenedor) también configura imágenes con este usuario habilitado de forma predeterminada. En todos los demás escenarios, el usuario app se puede establecer manualmente, por ejemplo con la instrucción USERDockerfile. Si se ha configurado una imagen con app y los comandos deben ejecutarse como root, la instrucción USER se puede usar para establecer en el usuario en root.

Mantenerse al día

Las noticias relacionadas con contenedores se publican en las discusiones de dotnet/dotnet-docker y en la categoría"contenedores" del blog de .NET.

Servicios de Azure

Varios servicios de Azure admiten contenedores. Cree una imagen de Docker para la aplicación e impleméntela en alguno de los siguientes servicios:

  • Azure Kubernetes Service (AKS)
    Escalado y organización de contenedores Windows y Linux mediante Kubernetes.

  • Azure App Service
    Implemente aplicaciones web o API con contenedores en un entorno PaaS.

  • Azure Container Apps
    Ejecute las cargas de trabajo de contenedor sin administrar servidores, orquestaciones o infraestructura y aproveche la compatibilidad nativa con Dapr y KEDA para la observabilidad y el escalado a cero.

  • Azure Container Instances
    Cree contenedores individuales en la nube sin ningún servicio de administración de nivel superior.

  • Azure Batch
    Ejecute trabajos de proceso repetitivos mediante contenedores.

  • Azure Service Fabric
    Eleve, cambie y modernice aplicaciones .NET a microservicios utilizando contenedores Windows y Linux.

  • Azure Container Registry
    Almacene y administre imágenes de contenedor en todos los tipos de implementaciones de Azure.

Pasos siguientes