posts

Azure Linux en WSL: una forma más rápida de probar tus aplicaciones .NET como se ejecutan de verdad

Si trabajas con .NET pero despliegas en contenedores Linux o sobre servicios de Azure, seguramente conoces esa incomodidad bastante poco glamurosa: en tu portátil todo parece correcto, en CI tampoco salta nada especialmente raro y, aun así, cuando llega el momento de ejecutar en el entorno real aparecen diferencias de permisos, rutas, dependencias nativas o pequeños matices del runtime que nadie había visto venir. Por eso me ha parecido especialmente interesante la llegada en public preview de Azure Linux on WSL. Yo no lo leo como una simple novedad de sistema operativo, sino como una mejora muy concreta de la experiencia de desarrollo para quienes queremos probar más cerca de producción sin salir de Windows, porque voy a ser honesto contigo… soy un total paleto en Linux 😅

Por qué esto importa más de lo que parece

La propuesta que Microsoft pone sobre la mesa con Azure Linux on WSL es bastante directa: validar comportamientos con configuraciones alineadas con producción, reproducir incidencias con más fiabilidad y reducir el tiempo dedicado a depurar diferencias entre entornos. A mí eso me parece valioso porque ataca un problema muy real en equipos que construyen sobre .NET, Docker, AKS y Azure App Service para Linux, Azure Container Apps y demás recursos o servicios de computo en Azure. Muchas veces no falla tu código como tal; falla la suposición invisible que hiciste mientras lo desarrollabas.

En Windows es facilísimo normalizar hábitos que luego en Linux no encajan igual de bien. Piensa en sensibilidad a mayúsculas y minúsculas en nombres de archivo, scripts que asumen ciertas utilidades del sistema, permisos de ejecución, certificados, zona horaria, localización del reloj o librerías nativas que en desarrollo ni siquiera estaban presentes. Y cuando empaquetas tu aplicación en un contenedor, cualquier diferencia entre tu máquina y el host real se amplifica con una facilidad casi ofensiva.

La idea importante aquí es sencilla: cuanto antes acerques tu entorno local al de destino, menos sorpresas acumulas al final del ciclo. Para un equipo .NET eso no significa renunciar a Visual Studio, a Windows ni a las herramientas habituales. Significa, más bien, tener un camino Linux local más directo, más ligero y más coherente con el sitio donde tu software va a vivir de verdad, con una integración sencilla, flexible y fácil de entender.

Diagrama del flujo de desarrollo local con Azure Linux en WSL
Una forma simple de verlo: editar en Windows, ejecutar en Azure Linux sobre WSL y acercar la validación al destino Linux real.

No lo veo como “otro Linux más”, sino como alineación con Azure

Según la visión general de las opciones de despliegue, Azure Linux se plantea como una base compartida para varios escenarios: máquinas virtuales, hosts de contenedores para AKS, opciones optimizadas para cargas containerizadas y también entorno local con WSL. Para mí, esa es la clave conceptual de todo esto.

No estoy diciendo que por usar Azure Linux en WSL vayas a replicar milimétricamente cualquier nodo de AKS o cualquier imagen de producción. Eso sería vender humo, y bastante barato además. Lo que sí digo es que te mueves dentro de una familia tecnológica más próxima al destino real que un entorno local improvisado o una distribución genérica elegida por costumbre. Y en la práctica, eso reduce incertidumbre.

Si desarrollas en .NET, la consecuencia es muy fácil de entender: puedes seguir trabajando desde Windows, pero ejecutar y observar tu aplicación dentro de una distribución Linux pensada para el ecosistema Azure. Y si tu flujo ya pasa por contenedores Linux, el salto mental y técnico entre «mi máquina» y «producción» se acorta bastante. No desaparece, pero deja de ser un abismo.

Dónde le veo más valor en proyectos .NET

Yo le veo encaje, sobre todo, en cuatro situaciones bastante concretas.

La primera es cuando tienes APIs que se ejecutan en contenedores Linux y dependen de configuraciones del sistema, certificados o comportamientos de red que en Windows no se reproducen igual. En ese escenario, poder levantar y probar desde WSL sobre un Linux alineado con Azure te da una señal local mucho más fiable. No perfecta, pero sí más honesta.

La segunda aparece cuando tu equipo usa herramientas de build, scripts o utilidades CLI (con parámetros y opciones que difieren entre Windows y Linux) que terminan ejecutándose en Linux dentro del pipeline. Si un script se rompe por permisos, por finales de línea o por una dependencia implícita del shell, yo prefiero enterarme en mi portátil y no cuando el pipeline ya está consumiendo tiempo, atención y paciencia.

La tercera tiene que ver con las incidencias esquivas. Microsoft destaca precisamente la posibilidad de reproducir problemas con más fiabilidad, y para mí ahí está uno de los beneficios más rentables de todos. Cuando un bug solo aparece «allí», el coste no es solo técnico. También es coordinación, tickets en el ITSM que nunca terminan de cerrarse, contexto perdido, fricciones con el cliente, tiempo bloqueado y conversaciones que se alargan demasiado para un problema que, en el fondo, era una diferencia de entorno.

La cuarta es más arquitectónica. Si estás construyendo una plataforma interna para varios equipos, tener una receta compartida de desarrollo local sobre Azure Linux en WSL puede ayudarte a estandarizar. Ya no es solo una mejora individual; puede convertirse en una forma común de acercar el puesto de desarrollo al contexto operativo real.

Comparativa de incidencias que aparecen tarde frente a detección temprana en Linux local
La ganancia real no es estética: es detectar antes diferencias de rutas, permisos, scripts o dependencias nativas.

Mi lectura práctica: menos virtualización pesada, más ciclo corto

Durante años, para probar bien en Linux desde Windows, aun con WSL disponible desde hace bastante tiempo, te sorprendería ver como mucha gente sigue tirando de máquinas virtuales completas, entornos remotos o del clásico «ya lo validaremos luego en Docker o en CI». Todo eso sigue teniendo sentido en determinados casos, por supuesto. Pero también añade pesadez: más consumo, más tiempo de arranque, más pasos manuales y, en no pocas ocasiones, una depuración menos inmediata.

La guía de inicio de Azure Linux deja claro que uno de los caminos soportados es ejecutar Azure Linux como distribución de WSL. A mí me gusta ese enfoque porque encaja con un patrón de trabajo muy natural: editas con tus herramientas de Windows, ejecutas y validas en Linux local, y reservas los entornos más pesados para integración, seguridad y validación final, si es que realmente lo llegaras a necesitar, porque ya con WSL creo que basta y sobra.

Y como puedes imaginar, no hay magia. Esto no sustituye pruebas reales en Azure, no elimina la necesidad de contenedores reproducibles y no convierte WSL en producción. Pero sí puede comprimir bastante el ciclo de feedback. Y en experiencia de desarrollo, reducir unos minutos repetidos cada día suele aportar más valor que cualquier promesa grandilocuente con nombre rimbombante (que de eso en tecnología tampoco vamos escasos, sobre todo dentro de la era de la IA 😂).

Un ejemplo muy concreto que sí te cambia el día a día

Imagina una API que empaquetas para Linux y que genera archivos temporales, lee plantillas desde el sistema de archivos y ejecuta un pequeño script auxiliar durante un proceso de importación. En Windows puedes arrastrar varios problemas sin darte cuenta: una ruta con mayúsculas inconsistentes (que en Windows da igual, pero en Linux no), permisos de ejecución no marcados o una expectativa sobre un CLI que allí simplemente no existe.

En un entorno Linux local, ese tipo de fallo aparece antes. Y si ese Linux local está en la órbita de Azure Linux, mejor todavía para tu confianza operativa. No porque el bug sea imposible de detectar de otra manera, sino porque el coste de detectarlo baja mucho. Ese es el detalle que a mí me interesa.

Un comando tan simple como este ya mueve la validación hacia un sitio bastante más útil:

dotnet publish ./src/ImportService.Api/ImportService.Api.csproj \
  -c Release \
  -r linux-x64 \
  --self-contained false \
  -o ./artifacts/publish/linux-x64
# Fuerzo el RID de Linux para descubrir antes incompatibilidades de runtime, assets o dependencias nativas

Ese comando no sustituye al contenedor final, pero sí obliga a tu proyecto a mantener una conversación interesante contigo: ¿hay dependencias nativas?, ¿hay algo que asumía Windows sin decirlo?, ¿están bien resueltos los assets para Linux? Si publicas así y pruebas dentro de tu distribución de Azure Linux en WSL, la señal que recibes suele ser bastante más valiosa que una ejecución puramente local en Windows que puede estar ocultando vicios.

Lo que yo no prometería

También te diría algo importante: conviene mantener expectativas razonables. La documentación sobre las opciones de despliegue de Azure Linux distingue varios modelos y escenarios, y no todos equivalen entre sí. Un entorno WSL no es lo mismo que un nodo para AKS, ni una máquina virtual en Azure, ni una imagen inmutable orientada a contenedores.

Por eso yo no vendería este movimiento como «ya no necesitas probar en Azure» o «con esto reproduces producción al 100%». Eso sería una simplificación peligrosa. En mi opinión, lo correcto es verlo como una capa intermedia muy valiosa y más cercana entre el entorno local y el entorno real.

Y esa capa sirve para capturar antes una categoría entera de errores: los que nacen de la diferencia de sistema operativo, de las convenciones de ejecución y de los recursos CLI que se asumen existen por defecto (sobre todo para scripts). Cuando eliminas ese ruido antes, las pruebas posteriores en Azure pueden centrarse en lo que de verdad importa: red, seguridad, escalabilidad, observabilidad, identidad gestionada, rendimiento y comportamiento distribuido (integraciones).

Diagrama por capas del papel de WSL frente a CI y producción
WSL con Azure Linux no sustituye Azure ni CI/CD: ocupa una capa intermedia muy útil para validar antes y depurar mejor.

Cómo lo estoy incorporando yo en mis equipos

Básicamente, y de forma muy sensata, he empezado por los proyectos .NET con destino Linux claro: contenedores para AKS o Azure Container Apps, workers, jobs, APIs en App Service Linux o componentes que consumen herramientas nativas de Linux. Ahí el retorno me parece bastante rápido y, sobre todo, muy visible.

Posteriormente he definido un flujo simple y explícito de forma de trabajar: editar en Windows si te resulta más cómodo, ejecutar pruebas funcionales y validaciones clave dentro de Azure Linux en WSL y mantener el contenedor como artefacto de verdad para CI/CD. El objetivo no es añadir pasos por placer o por parecer más interesante por tener más procesos; es mover la detección de problemas sin complicarle la vida a nadie.

Por otro lado, mantengo una pequeña checklist de verificación para el entorno local: rutas, permisos, scripts, certificados, variables de entorno, codificación de archivos y cualquier dependencia nativa. Muchas incidencias de «solo falla en Linux» salen precisamente de ahí. Y cuando las conviertes en una revisión explícita, dejan de parecer misterios y vuelven a ser lo que son: problemas bastante concretos.

Por último, lo usamos como herramienta compartida de diagnóstico. Cuando aparece una incidencia difícil, tener un entorno local razonablemente alineado ayuda a que otra persona del equipo la reproduzca sin montar un laboratorio paralelo. La reproducibilidad no solo acelera la depuración; también mejora la conversación técnica. Y eso, aunque a veces se note menos, también es arquitectura.

Mi conclusión

La noticia de Azure Linux on WSL puede sonar modesta si la miras solo como novedad de plataforma. Pero si desarrollas en Windows y despliegas .NET sobre Linux y Azure, yo creo que toca un punto muy sensible: la distancia entre donde escribes el código y donde realmente se ejecuta.

La propuesta de Azure Linux como base para distintos escenarios y su camino explícito de uso en WSL dibujan una dirección bastante lógica. No elimina la necesidad de buena arquitectura, de contenedores bien construidos ni de pruebas reales en Azure. Pero sí te da una forma más directa de validar antes, reproducir mejor y depurar con menos fricción.

Y en mi experiencia, eso tiene bastante valor. Porque cuando una mejora de plataforma consigue que tú pierdas menos tiempo peleándote con el entorno, en realidad ya no estás hablando solo de Linux o de WSL. Estás hablando de velocidad de aprendizaje.

Comentarios