Docker y C#: contenedorización de aplicaciones .NET desde cero

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿Por qué contenerizar aplicaciones C#?

El desarrollo moderno de C# (.NET) rara vez prescinde de Docker. La contenerización permite empaquetar una aplicación junto con todas sus dependencias, entorno de ejecución y configuraciones en una imagen aislada. Esto resuelve el problema de "en mi máquina funciona" y simplifica el despliegue en servidores, la nube o infraestructura local.

En este artículo, analizaremos cómo crear una imagen Docker para una aplicación .NET (ASP.NET Core o consola), optimizar su tamaño, usar docker-compose para conectarse con una base de datos y configurar CI/CD. Todos los ejemplos de código están escritos en C# y listos para usar.



1. Conceptos básicos de Docker para desarrolladores .NET

Docker es una plataforma para ejecutar aplicaciones en contenedores. Un contenedor contiene todo lo necesario: código, entorno de ejecución, bibliotecas y configuraciones. Esto es especialmente conveniente para .NET, ya que no es necesario instalar el SDK de .NET en el servidor — Docker es suficiente.



1.1. Instalación de Docker

Descargue e instale Docker Desktop desde el sitio web oficial. Después de la instalación, verifique la versión:

docker --version


1.2. Estructura del proyecto .NET

Supongamos que tenemos una aplicación ASP.NET Core Web API simple. La estructura de carpetas:

MyApp/├── MyApp.csproj├── Program.cs├── Controllers/│   └── WeatherController.cs└── Dockerfile


2. Creación de un Dockerfile para una aplicación .NET

Un Dockerfile es un conjunto de instrucciones para construir una imagen. Para .NET, se recomienda usar compilaciones de múltiples etapas para separar las etapas de compilación y ejecución. Esto reduce el tamaño final de la imagen.



2.1. Dockerfile básico

Cree un archivo Dockerfile en la raíz del proyecto:

# Build stageFROM mcr.microsoft.com/dotnet/sdk:8.0 AS buildWORKDIR /srcCOPY ["MyApp.csproj", "."]RUN dotnet restoreCOPY . .RUN dotnet publish -c Release -o /app/publish

# Runtime stageFROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtimeWORKDIR /appCOPY --from=build /app/publish .EXPOSE 80ENTRYPOINT ["dotnet", "MyApp.dll"]

Explicación:

  • FROM ... AS build — utiliza el SDK para la compilación.
  • COPY ["MyApp.csproj", "."] — copia solo el archivo del proyecto para almacenar en caché el paso de restauración.
  • RUN dotnet restore — restaura los paquetes NuGet.
  • RUN dotnet publish — compila la versión de lanzamiento.
  • FROM ... AS runtime — utiliza la imagen aspnet mínima.
  • EXPOSE 80 — expone el puerto 80.
  • ENTRYPOINT — el comando para iniciar la aplicación.


2.2. Compilación y ejecución de la imagen

Ejecute los siguientes comandos en la terminal desde la carpeta del proyecto:

docker build -t myapp:latest .docker run -d -p 8080:80 --name myapp_container myapp:latest

Ahora la aplicación está disponible en http://localhost:8080.



3. Optimización de imágenes Docker para .NET

Las imágenes grandes ralentizan el despliegue y consumen recursos. Aquí hay varias prácticas para la optimización:



3.1. Use .NET 8 (o más reciente)

Las versiones más recientes de .NET tienen soporte incorporado para compilación AOT (Ahead-of-Time), lo que reduce el tamaño del tiempo de ejecución. Para ASP.NET Core, use la imagen aspnet:8.0.



3.2. Minimice las capas

Cada instrucción RUN o COPY crea una capa. Combine comandos:

RUN apt-get update && apt-get install -y \    curl \    && rm -rf /var/lib/apt/lists/*


3.3. Use .dockerignore

Cree un archivo .dockerignore en la raíz del proyecto para excluir archivos innecesarios:

bin/obj/.vs/*.user.git/README.md


3.4. Ejemplo de un Dockerfile optimizado

FROM mcr.microsoft                

Blogs

Book Recommendations