Docker y C#: guía completa para la contenedorización de aplicaciones .NET
La contenedorización se ha convertido en el estándar de facto para el despliegue de aplicaciones modernas. Si desarrolla en C# (.NET), Docker le permite empaquetar su aplicación junto con todas sus dependencias en un contenedor ligero y aislado. En este artículo, recorreremos el camino desde la creación de un Dockerfile simple hasta la publicación y ejecución de una imagen lista. Aprenderá a contenedorizar una aplicación en C#, optimizar el tamaño de la imagen y utilizar las mejores prácticas.
1. Fundamentos de Docker para el desarrollador .NET
Docker es una plataforma para desarrollar, enviar y ejecutar aplicaciones en contenedores. Un contenedor es una unidad de software estandarizada que incluye el código y todas sus dependencias. A diferencia de las máquinas virtuales, los contenedores utilizan el núcleo compartido del sistema operativo, lo que los hace más rápidos y ligeros.
Para C# (.NET), Docker es especialmente útil porque resuelve el problema de "en mi máquina funciona": usted garantiza que la aplicación se comportará igual en la máquina del desarrollador, en el servidor de pruebas y en producción. Los componentes principales son:
- Docker Engine — el entorno de ejecución de contenedores
- Dockerfile — un archivo de texto con instrucciones para construir la imagen
- Imagen (Image) — una plantilla inmutable para crear contenedores
- Contenedor (Container) — una instancia en ejecución de una imagen
Instale Docker Desktop para Windows/Mac o Docker Engine para Linux. Después de la instalación, verifique el funcionamiento con el comando:
docker --version2. Creación de un Dockerfile para una aplicación C# (.NET)
Empecemos con una aplicación simple de ASP.NET Core Web API. Cree un nuevo proyecto:
dotnet new webapi -n MyDockerAppcd MyDockerAppAhora cree un archivo Dockerfile (sin extensión) en la raíz del proyecto. Aquí tiene una versión básica con compilación en múltiples etapas (multi-stage build):
# Etapa 1: compilación de la aplicaciónFROM mcr.microsoft.com/dotnet/sdk:8.0 AS buildWORKDIR /src
# Copiamos el csproj y restauramos las dependenciasCOPY ["MyDockerApp.csproj", "."]RUN dotnet restore
# Copiamos el resto del código y compilamos el proyectoCOPY . .RUN dotnet publish -c Release -o /app/publish
# Etapa 2: creación de una imagen mínima para la ejecuciónFROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtimeWORKDIR /appEXPOSE 80EXPOSE 443
# Copiamos la aplicación compilada desde la primera etapaCOPY --from=build /app/publish .
# Punto de entradaENTRYPOINT ["dotnet", "MyDockerApp.dll"]Explicación de las instrucciones clave:
FROM— define la imagen base (SDK para compilar, ASP.NET para ejecutar)WORKDIR— establece el directorio de trabajoCOPY— copia archivos del contexto de compilación a la imagenRUN dotnet restore— restaura los paquetes NuGetRUN dotnet publish— compila y publica la aplicaciónEXPOSE— indica los puertos que escuchará el contenedorENTRYPOINT— comando que se ejecuta al iniciar el contenedor
La compilación en múltiples etapas es críticamente importante para C#: la imagen final contiene solo el runtime y su aplicación, sin el SDK ni los archivos fuente. Esto reduce el tamaño de la imagen de ~1.5 GB a ~200 MB.
3. Compilación y ejecución del contenedor
Compile la imagen Docker:
docker build -t my-dotnet-app:latest .La bandera -t asigna una etiqueta (nombre:versión). El punto al final indica el directorio actual como contexto de compilación.
Ejecute el contenedor:
docker run -d -p 8080:80 --name my-app my-dotnet-app:latestParámetros:
-d— ejecución en segundo plano (detached)-p 8080:80— redirección de puerto: puerto del host 8080