Contenedores en Windows: cuándo tienen sentido de verdad

  • Los contenedores en Windows aíslan aplicaciones compartiendo el kernel del host, lo que reduce consumo de recursos frente a máquinas virtuales completas.
  • El ecosistema Microsoft ofrece soporte integral para contenedores con Docker, Visual Studio, Azure Container Registry y Azure Kubernetes Service.
  • Contenerizar en Windows aporta ventajas claras en despliegue, portabilidad y seguridad, aunque requiere adaptar prácticas de desarrollo y operaciones.
  • La elección entre contenedores y VMs depende del caso de uso: aislamiento fuerte y sistemas diversos favorecen VMs; rapidez y densidad, a los contenedores.

contenedores en windows

Si vienes del mundo del desarrollo o de la informática “pura y dura”, es muy probable que los contenedores en Windows te suenen a algo a medio camino entre magia y marketing. Y si además te has peleado con puertos, certificados SSL o despliegues que fallan en Linux pero funcionan en tu PC con Windows, es normal que te preguntes si todo esto de Docker en Windows, Kubernetes y compañía tiene realmente sentido en un entorno Microsoft.

La realidad es que los contenedores en Windows tienen mucho más sentido del que parece, pero no siempre para todo ni para todos los escenarios. En este artículo vamos a ver con calma qué son los contenedores (sin confundirlos con máquinas virtuales), cómo funcionan específicamente en Windows, qué ventajas e inconvenientes tienen frente a las VMs, qué papel juegan en entornos de desarrollo, producción y OT/PLC, y en qué casos merece la pena apostar por ellos… Y en cuáles igual es mejor seguir con lo de siempre.

Qué es realmente un contenedor (también en Windows)

Un contenedor es, básicamente, un paquete de software aislado y ligero que incluye una aplicación y todo lo que necesita para funcionar: librerías, dependencias, configuración, ficheros de sistema en modo usuario, etc. En lugar de llevarse consigo un sistema operativo completo como hace una máquina virtual, comparte el núcleo (kernel) del sistema operativo del host.

Podrías imaginar un contenedor como una caja muy bien cerrada que sólo deja ver hacia dentro lo justo y necesario. Dentro metes tu aplicación (por ejemplo, un servidor Icecast, un SCADA o una API .NET), más las librerías y herramientas exactas que necesita. Desde fuera, esa caja se comporta como si fuese un mini sistema aislado, pero en realidad está apoyándose en el kernel de Windows o de Linux que haya por debajo.

En Windows, los contenedores funcionan aprovechando la funcionalidad de contenedores integrada en el sistema (Windows Server 2016 o superior, y Windows 10/11 desde la versión 1607 para desarrollo). Esto significa que puedes ejecutar contenedores Windows de forma nativa sobre Windows Server.

Para el desarrollador o administrador, el punto clave es que el contenedor ofrece un entorno predecible y replicable: lo que funciona en tu portátil funcionará igual en el servidor, en la nube o en el edge, porque todo viaja empaquetado en la misma imagen.

En sistemas Windows, esta capacidad es especialmente útil para aplicaciones .NET Framework, .NET, servicios de Windows Server o software legado que quieres aislar, empaquetar y mover sin reconfigurar medio sistema cada vez.

Funcionamiento de contenedores en Windows

Cómo encajan los contenedores en el ecosistema Microsoft

Microsoft se ha tomado muy en serio este tema y ofrece un ecosistema bastante completo para trabajar con contenedores, tanto de Windows como de Linux, cubriendo desde el desarrollo en local hasta el despliegue masivo en la nube.

En la parte de desarrollo, puedes ejecutar contenedores en Windows 10/11 usando Docker Desktop, que se apoya en la funcionalidad de contenedores de Windows o en WSL2 para el caso de Linux. De esta forma, en tu PC de trabajo puedes levantar fácilmente servicios en contenedores para probar, depurar y preparar imágenes.

Herramientas como Visual Studio y Visual Studio Code tienen soporte integrado para Docker, administración con Docker Compose, Kubernetes y Helm. Esto permite añadir un Dockerfile al proyecto, depurar dentro de un contenedor o generar las definiciones necesarias para desplegar en clústeres Kubernetes con bastante comodidad.

Una vez tienes tu aplicación empaquetada, puedes publicar las imágenes de contenedor en un registro. Ahí entran en juego Docker Hub (público) o registros privados como Azure Container Registry (ACR), donde tu organización controla quién sube, quién descarga y qué versiones se utilizan en cada entorno, y cómo desplegar contenedores en servidores remotos.

En cuanto al despliegue a gran escala, la pieza estrella es Azure Kubernetes Service (AKS), que permite orquestar docenas, cientos o miles de contenedores sobre máquinas virtuales de Azure, ya sean Windows Server personalizados o distribuciones Linux como Ubuntu. También tienes opciones híbridas con Azure Arc, AKS on Azure Stack Hub o integraciones con OpenShift en entornos locales.

En local, si no quieres depender de Azure, es perfectamente posible montar Kubernetes sobre Windows Server por tu cuenta, o usar otras plataformas que Microsoft soporta o integra, como Red Hat OpenShift con compatibilidad para contenedores de Windows.

Cómo funcionan por dentro los contenedores en Windows

Un contenedor de Windows es, en esencia, un proceso o conjunto de procesos que se ejecutan sobre el kernel del sistema operativo anfitrión. Pero (esto es importante) con una vista aislada del sistema. Esa “vista filtrada” se aplica al sistema de archivos, al registro, a la red y a otros recursos.

La parte interesante es que el contenedor no tiene acceso directo e ilimitado al kernel, aunque lo comparta. Ve un sistema de archivos virtualizado (basado en capas), un registro aislado y recursos que el motor de contenedores le presenta como si fuesen “suyos”. Pero en realidad están gestionados por el host.

Los cambios que haces dentro de un contenedor en ejecución se aplican sobre una capa de escritura efímera. Cuando el contenedor se apaga, esa capa puede descartarse, con lo que el sistema vuelve al estado original de la imagen. Si quieres persistir datos de verdad, entonces montas volúmenes o recursos de almacenamiento externos (discos, comparticiones SMB, Azure Files, etc.).

Microsoft ofrece varias imágenes base oficiales de Windows sobre las que construir tus contenedores:

  • Windows. Imagen grande con casi todas las APIs y servicios de Windows (sin roles de servidor).
  • Windows Server. Similar, pero pensada para escenarios de servidor con el conjunto completo de APIs y roles de Windows Server.
  • Windows Server Core. Versión recortada, con menos superficie, pero incluyendo .NET Framework completo y la mayoría de roles de servidor.
  • Nano Server. Imagen ultraligera, optimizada para .NET y ciertos roles concretos, ideal cuando quieres minimizar tamaño y superficie de ataque.

Estas imágenes se construyen en capas apiladas. Una capa puede contener el sistema base, otra el runtime de .NET, otra tus librerías comunes y una última tu propia aplicación. Si varias apps comparten parte de esas capas, el host sólo las descarga y almacena una vez, ahorrando mucho espacio y tiempo.

Imágenes de contenedores Windows

Ventajas clave de usar contenedores en Windows

En el día a día, los contenedores ofrecen beneficios concretos tanto para desarrolladores como para administradores de sistemas y equipos de seguridad, especialmente cuando el entorno gira alrededor de Windows.

Para desarrolladores: misma app, mismo comportamiento en todas partes

Desde el punto de vista del desarrollo, la gran baza de los contenedores es que el entorno deja de ser una variable. Creas una imagen con la versión exacta de .NET, las DLL necesarias, herramientas auxiliares, configuración de IIS o Kestrel, etc., y esa imagen se despliega igual en todos los entornos.

Esto reduce drásticamente los clásicos problemas de “en mi máquina funciona, en el servidor no”. Además, cada desarrollador puede levantar un entorno completo en segundos sin destrozar su Windows: BD, colas, servicios auxiliares… Todo en contenedores aislados, que se pueden destruir y recrear sin miedo.

En proyectos donde parte del stack corre en Linux (por ejemplo, microservicios Node.js o contenedores de base de datos) y otra parte en Windows (servicios que dependen de APIs específicas), puedes coordinarlo todo desde el mismo docker-compose o manifest de Kubernetes, manteniendo la coherencia de versiones y puertos.

Para equipos de IT: mejor uso del hardware y menos caos

Para los administradores, los contenedores permiten aumentar la densidad de aplicaciones en los servidores Windows. En lugar de tener una VM por aplicación (con su sistema operativo completo y sus parches), puedes tener muchas aplicaciones contenedorizadas sobre menos hosts o VMs, gestionando imágenes en lugar de instalaciones sueltas.

Las actualizaciones también cambian de enfoque. En vez de entrar en cada servidor a modificar binarios o parches, se construye una nueva imagen con el cambio (código nuevo o librería actualizada), se envía al registro y se despliega, dejando la anterior disponible para hacer rollback si hay problemas.

En entornos donde antes tenías decenas de máquinas con Windows desactualizado “porque funciona”, migrar a contenedores bien diseñados te permite aislar esas aplicaciones y, poco a poco, llevarlas a bases más modernas, manteniendo al mismo tiempo un mayor control centralizado.

Para seguridad: aislamiento, mínima superficie y control central

La seguridad en contenedores no es automática ni perfecta, pero ofrece herramientas muy potentes si se usan bien. Por un lado, cada contenedor corre con permisos limitados y recursos aislados, lo que reduce el impacto de una intrusión respecto a una aplicación que corre directamente en el sistema host.

En clústeres Kubernetes puedes segmentar el entorno mediante namespaces y políticas de red, de forma que los distintos servicios sólo se hablen entre sí cuando está explícitamente permitido. Esto encaja muy bien con principios como “mínimo privilegio” y “zero trust en Windows Server”. Especialmente interesantes en escenarios OT.

También es más sencillo implementar un ciclo de seguridad en la cadena de suministro: escaneas imágenes en el registro en busca de vulnerabilidades, exiges que todas provengan de orígenes firmados, controlas la configuración de runtime (privilegios, montajes, capacidades, etc.) y aplicas parches reconstruyendo imágenes en lugar de tocar sistemas vivos a mano.

Cuando Windows no gestiona bien los recursos… pero aun así usas contenedores

Mucha gente tiene la percepción (bastante razonable en algunos casos) de que Windows no es el rey de la eficiencia en cuanto a consumo de recursos. Sobre todo si lo comparas con distribuciones Linux afinadas para servidor. Esto lleva a la pregunta lógica: ¿para qué me voy a complicar con contenedores de Windows si ya tengo VMs o si podría moverlo todo a Linux?

Hay varias razones por las que, aun aceptando esas limitaciones, los contenedores de Windows pueden tener sentido:

  • Aplicaciones fuertemente ligadas a Windows. Muchas soluciones empresariales, componentes COM+, servicios que usan APIs específicas de Windows o aplicaciones .NET Framework antiguas no pueden migrarse fácilmente a Linux.
  • Entornos estandarizados de empresa. Organizaciones que tienen toda su operativa basada en Active Directory, GPOs, herramientas de monitorización y backup pensadas para Windows.
  • Equipos con experiencia en tecnologías Microsoft. Personal de IT más cómodo con Windows Server, Hyper-V y herramientas de Microsoft que con administrar clústeres puramente Linux.

En estas situaciones, contenerizar sobre Windows permite ganar en consistencia, despliegue rápido, portabilidad y automatización, incluso si el host de base no es el más ligero del mundo. Después, siempre puedes optimizar con imágenes tipo Nano Server o Server Core y con buenas políticas de recursos.

Red, puertos, IPs y SSL en contenedores de Windows

Uno de los primeros quebraderos de cabeza de quien empieza con contenedores es entender cómo se gestionan los puertos y las direcciones IP en una infraestructura de red saludable. Si ya has sufrido intentando hacer convivir servicios en los mismos puertos o configurando HTTPS con contenedores, te sonará.

Por defecto, cada contenedor tiene su propio espacio de red aislado. Internamente puede escuchar en el puerto 80, 443, 8000… como si estuviera solo. El truco está en que el motor de contenedores o el orquestador se encarga de mapear esos puertos internos a puertos del host o a servicios virtuales dentro del clúster.

Eso significa que no necesitas una Raspberry Pi por servicio sólo porque todos quieran usar el puerto 80. Puedes tener varios contenedores escuchando en 80 internamente y mapear cada uno a un puerto distinto del host (por ejemplo, 8081, 8082…), o esconderlos detrás de un proxy inverso o Ingress que se encargue de hacer de frontal único.

Respecto al direccionamiento IP, en escenarios sencillos cada contenedor recibe una IP interna de la red virtual que gestionan Docker o Kubernetes. En entornos más complejos se usan plugins CNI y redes overlay para que los contenedores se vean entre sí de manera consistente a través de varios nodos.

En cuanto al cifrado SSL/TLS, lo más habitual es no pelearse con certificados en cada contenedor, sino centralizarlos en un frontal: un reverse proxy tipo Nginx, Traefik, HAProxy, o en Windows un IIS o un Application Gateway en Azure. Ese frontal termina HTTPS y reenvía el tráfico por HTTP interno a los contenedores. También puedes montar certificados dentro de los contenedores, pero se complica la gestión y renovación.

Contenedores y OT/PLC: ¿cambio real o fantasía de TI?

En el mundo de la automatización industrial y los PLC, la situación suele ser bastante distinta a la de los data centers clásicos. Es frecuente encontrar HMIs y PCs industriales con versiones viejas de Windows, drivers muy atados a hardware específico, sistemas que no se han parcheado en años y arquitecturas pensadas siguiendo el principio “no lo toques si funciona”.

Desde el lado del software, la promesa de Kubernetes, edge computing y contenedores suena atractiva: independencia de hardware, alta disponibilidad, autorreparación, despliegues homogéneos y arquitecturas defensivas cercanas a “cero confianza”. El problema es que en el taller la realidad tiene otras restricciones.

¿Puede una arquitectura perimetral basada en contenedores ayudar? La respuesta, con la experiencia de muchos pilotos y proyectos, suele ser “sí, pero”. Sí, porque:

  • Permite encapsular aplicaciones OT legadas. Reduciendo su exposición directa a la red.
  • Facilita desplegar gateways de datos, agregadores, servicios de historización o analítica cerca de la máquina.
  • Da opciones de alta disponibilidad y autorreparación a componentes no críticos para la seguridad de personas o de la planta.

Y “pero” porque añade capas de complejidad: hay que formar a equipos, gestionar clústeres, integrar con redes OT muy restringidas y convivir con proveedores de PLC que quizá no soportan oficialmente esas arquitecturas.

Desde el punto de vista de ciberseguridad industrial, este tipo de arquitecturas se ve cada vez más como un paso razonable hacia mayor aislamiento y control, siempre que se respete la segmentación de la red, se limite estrictamente qué se ejecuta en cada nodo y se mantenga una fuerte coordinación entre OT y TI.

Máquinas virtuales frente a contenedores: cuál usar en cada caso

La eterna pregunta “¿contenedores o VMs?” no tiene una única respuesta. Lo habitual es que termines usando ambas tecnologías según la necesidad.

Si necesitas ejecutar distintos sistemas operativos completos en paralelo, aislar al máximo una carga por requisitos regulatorios o ejecutar software que asume que tiene control total del sistema, una máquina virtual sigue siendo la mejor opción. También cuando quieres una separación muy fuerte entre tenants o clientes distintos.

Si lo que buscas es rapidez de despliegue, escalabilidad y uso eficiente de recursos, y tus aplicaciones pueden ejecutarse cómodamente sobre la misma familia de sistema operativo (por ejemplo, varias apps .NET sobre Windows Server), entonces los contenedores son una opción claramente más atractiva.

En muchos entornos empresariales verás un patrón mixto: servidores virtuales (en Hyper-V, VMware o en la nube) que sirven como nodos de un clúster de contenedores. Sobre esas VMs despliegas Kubernetes, Docker Swarm u otro orquestador, y a partir de ahí todas las apps nuevas o modernizadas van ya empaquetadas en contenedores.

Desarrollo en Windows y despliegue en Linux: el choque de realidad

Un problema muy habitual, especialmente en equipos que desarrollan en Windows y despliegan en Linux (contenedor o servidor), es la diferencia en el sistema de archivos. Windows suele tratar los nombres de archivo como insensibles a mayúsculas/minúsculas, mientras que en Linux File.ts y file.ts son cosas distintas.

Esto lleva a errores muy puñeteros. Por ejemplo, importaciones en código que funcionan en local (porque Windows ignora la capitalización) pero que revientan en un contenedor Linux porque el fichero real tiene una letra distinta en el nombre. En stacks como TypeScript, Node, frontends modernos, etc., es un clásico.

La única forma de evitarlo de verdad es adoptar convenciones de nombres claras y estrictas desde el inicio del proyecto (por ejemplo, todo en kebab-case o camelCase consistente) y reforzarlo con herramientas automáticas: linters, validaciones en CI que corran pruebas en entornos Linux, revisiones de código que comprueben rutas sensibles a mayúsculas.

Las empresas que se toman en serio la calidad del código suelen incorporar estos controles en el pipeline de CI/CD, de forma que cualquier diferencia de mayúsculas, ruta mal escrita o dependencia inválida salte antes de llegar a producción. Esto es todavía más importante cuando el despliegue final es un contenedor, porque allí todos esos detalles del sistema operativo subyacente se hacen notar.

Además, gestionar bien las dependencias, las versiones de runtimes y las configuraciones específicas de cada entorno se vuelve crítico cuando empiezas a trabajar con nube, IA y servicios gestionados (AWS, Azure, etc.), donde la infraestructura es más homogénea y menos tolerante a “trucos” típicos de Windows de escritorio.

docker

Herramientas principales y alternativas en el mundo de contenedores

Aunque Docker y Kubernetes se han convertido en el estándar de facto, el ecosistema de contenedores es amplio y ofrece muchas opciones para distintos niveles de complejidad y necesidades.

Docker: la base de casi todo

Docker popularizó la forma moderna de trabajar con contenedores y sigue siendo la puerta de entrada para la mayoría de equipos. Con Docker Engine lanzas y gestionas contenedores. Con Dockerfile defines, de manera declarativa, cómo construir tus imágenes. Finalmente, con Docker Hub o registros privados compartes esas imágenes con otros entornos o equipos.

En entornos Windows, Docker es especialmente útil para crear entornos de desarrollo reproducibles, minimizar “instalaciones Frankenstein” en los servidores y construir una base sólida para escalar luego hacia orquestadores más complejos.

Kubernetes: orquestación a lo grande

Cuando una aplicación empieza a usar varios servicios, bases de datos, colas, frontales y demás piezas contenedorizadas, es cuestión de tiempo que necesites un orquestador. Kubernetes (K8s) es la plataforma open source más extendida para automatizar el despliegue, el escalado y la gestión de contenedores.

En Kubernetes agrupas contenedores relacionados en pods, defines despliegues que indican cuántas réplicas quieres de cada servicio, y expones esos pods mediante servicios de red. El plano de control se ocupa de repartir la carga entre los nodos de trabajo, monitorizar la salud de las instancias, reiniciarlas si fallan y escalar hacia arriba o abajo según la demanda.

En escenarios híbridos y de nube, plataformas como AKS (Azure Kubernetes Service), GKE (Google Kubernetes Engine) o EKS (Amazon Elastic Kubernetes Service) simplifican el despliegue de Kubernetes gestionado. Así, tú te centras en las aplicaciones, dejando parte de la gestión del clúster al proveedor.

Otras herramientas y alternativas

Además de Docker y Kubernetes, existen otras soluciones que cubren necesidades específicas o preferencias de arquitectura:

  • Podman. Similar a Docker, pero sin daemon central; muy apreciado en algunos entornos Linux.
  • Containerd. El motor de contenedores sobre el que se apoya Docker; se puede usar por separado.
  • OpenShift. Plataforma de Red Hat basada en Kubernetes, con muchas funcionalidades añadidas para desarrollo y operación empresarial.
  • Nomad. Orquestador de HashiCorp más sencillo de operar que Kubernetes en algunos casos, capaz de gestionar contenedores y cargas tradicionales.
  • LXD. Contenedores tipo “sistema completo” sobre Linux, útil cuando quieres algo intermedio entre un contenedor clásico y una VM ligera.
  • Vagrant. No es de contenedores, pero sigue siendo útil para montar entornos de desarrollo reproducibles con VMs o incluso combinados con Docker.

Todo este recorrido hace que, cuando te planteas si los contenedores en Windows tienen sentido, la respuesta no dependa tanto de la tecnología en sí, sino de si encaja con tus aplicaciones, tu equipo y tu modelo operativo. En muchos casos, son la mejor forma de dar un salto de calidad en despliegue, portabilidad y seguridad sin renunciar al ecosistema Windows;. En otros, quizá tenga más lógica seguir con VMs clásicas o apostar directamente por Linux. Lo importante es conocer bien las piezas para decidir con cabeza cuándo, cómo y dónde merece la pena contenerizar.