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 Dockerfile de USER
. 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
- Obtenga información sobre cómo incluir una aplicación de .NET Core en contenedores.
- Obtenga información sobre cómo incluir una aplicación ASP.NET Core en contenedores.
- Consulte el tutorial de ASP.NET Core para los microservicios.
- Obtenga información sobre las herramientas de contenedor en Visual Studio