0% encontró este documento útil (0 votos)
59 vistas403 páginas

Virtualization Windowscontainers

Los contenedores de Windows permiten empaquetar aplicaciones con sus dependencias, ofreciendo entornos aislados y rápidos para su ejecución. Microsoft proporciona herramientas y plataformas para desarrollar e implementar aplicaciones en contenedores, incluyendo compatibilidad con Docker y orquestadores como Azure Kubernetes Service. Los contenedores son ideales para aumentar la densidad de la infraestructura y facilitar el desarrollo ágil de aplicaciones en diversos entornos.

Cargado por

Ana Grossmuller
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
59 vistas403 páginas

Virtualization Windowscontainers

Los contenedores de Windows permiten empaquetar aplicaciones con sus dependencias, ofreciendo entornos aislados y rápidos para su ejecución. Microsoft proporciona herramientas y plataformas para desarrollar e implementar aplicaciones en contenedores, incluyendo compatibilidad con Docker y orquestadores como Azure Kubernetes Service. Los contenedores son ideales para aumentar la densidad de la infraestructura y facilitar el desarrollo ágil de aplicaciones en diversos entornos.

Cargado por

Ana Grossmuller
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Díganos qué opina sobre la experiencia de descarga del PDF.

Contenedores en la documentación de
Windows
Los contenedores de Windows permiten a los usuarios empaquetar aplicaciones con sus
dependencias y aprovechar la virtualización de nivel de sistema operativo para
proporcionar entornos rápidos y totalmente aislados en un único sistema. Obtenga
información sobre cómo usar contenedores de Windows con nuestras guías de inicio
rápido, guías de implementación y ejemplos.

Contenido destacado

e INFORMACIÓN GENERAL

Pruebe los contenedores de Windows en AKS.

Pruebe contenedores de Windows en AKS en Azure Stack HCI.

Consulte nuestras imágenes de contenedor en Docker Hub.

Lea el blog contenedores.

Visión general

e INFORMACIÓN GENERAL

Acerca de los contenedores de Windows

Requisitos del sistema

Preguntas más frecuentes

Comenzar

b INTRODUCCIÓN

Configuración del entorno

Ejecución del primer contenedor

Contenedorización de una aplicación de ejemplo


Migración mediante lift-and-shift a contenedores

Tutoriales

g TUTORIAL

Creación de un contenedor de Windows

Ejecución en Azure Kubernetes Service en Azure Stack HCI

Ejecución en AKS

Ejecución en Service Fabric

Ejecución en Azure App Service

Configurar la extensión Containers en Windows Admin Center

Conceptos

p CONCEPTO

Estibador

Orquestación de contenedores

Aspectos básicos del contenedor de Windows

Protección de contenedores de Windows

Cuentas de servicio administradas de grupo

Referencia

i REFERENCIA

Compatibilidad de versiones

Ciclos de vida de mantenimiento de imágenes

CLUF de imagen del sistema operativo de contenedor

Recursos
i REFERENCIA

Muestras

Solución de problemas
Windows y contenedores
Artículo • 21/03/2023

Se aplica a: Windows Server 2022, Windows Server 2019, Windows Server 2016

Los contenedores son una tecnología para empaquetar y ejecutar aplicaciones de Windows y
Linux en diversos entornos locales y en la nube. Los contenedores proporcionan un entorno
ligero y aislado que facilita el desarrollo, implementación y administración de las aplicaciones.
Los contenedores se inician y detienen rápidamente, por lo que son ideales para las
aplicaciones que necesitan adaptarse rápidamente a la demanda cambiante. La naturaleza
ligera de los contenedores también los convierte en una herramienta útil para aumentar la
densidad y el uso de la infraestructura.

El ecosistema de contenedores de Microsoft


Microsoft ofrece una serie de herramientas y plataformas que le ayudarán a desarrollar e
implementar aplicaciones en contenedores:

Ejecute contenedores basados en Windows o Linux en Windows 10 para procesos de


desarrollo y pruebas con Docker Desktop , que usa la funcionalidad de contenedores
integrada en Windows. También puede ejecutar contenedores de forma nativa en
Windows Server.

Desarrolle, pruebe, publique e implemente contenedores basados en Windows gracias


a la eficaz compatibilidad con contenedores en Visual Studio y Visual Studio Code , que
incluyen compatibilidad con Docker, Docker Compose, Kubernetes, Helm y otras
tecnologías útiles.

Publique sus aplicaciones como imágenes de contenedor en DockerHub público para


que las usen otros usuarios, o en una instancia privada de Azure Container Registry
para los procesos de desarrollo e implementación de su organización. De este modo,
podrá enviar ("push") e incorporar ("pull") cambios directamente desde Visual Studio y
Visual Studio Code.

Implemente contenedores a escala en Azure u otras nubes:


Extraiga la aplicación (imagen de contenedor) de un registro de contenedor (como
Azure Container Registry) y después impleméntela y adminístrela a escala mediante un
orquestador como Azure Kubernetes Service (AKS).
Azure Kubernetes Service implementa contenedores en máquinas virtuales de Azure y
los administra a escala, independientemente de si son docenas de contenedores,
cientos o incluso miles. Las máquinas virtuales de Azure ejecutan una imagen de
Windows Server personalizada (si va a implementar una aplicación basada en
Windows) o una imagen de Ubuntu Linux personalizada (si va a implementar una
aplicación basada en Linux).

Implemente contenedores en el entorno local mediante AKS en Azure Stack HCI, Azure
Stack con el motor de AKS o Azure Stack con OpenShift. También puede configurar
Kubernetes en Windows Server (consulte Kubernetes en Windows) y estamos trabajando
en admitir la ejecución de contenedores de Windows en RedHat OpenShift Container
Platform .

Cómo funcionan los contenedores


Un contenedor es un paquete aislado y ligero para ejecutar una aplicación en el sistema
operativo host. Los contenedores se basan en el kernel del sistema operativo host (que puede
considerarse la fontanería del sistema operativo), tal como se muestra en el diagrama a
continuación.

Container Container

Apps Services Apps Services Apps Services

OS Kernel

Hardware
Aunque un contenedor comparte el kernel del sistema operativo host, no obtiene acceso sin
restricciones a dicho kernel. En su lugar, el contenedor obtiene una vista aislada (y, en
ocasiones, virtualizada) del sistema. Por ejemplo, un contenedor puede tener acceso a una
versión virtualizada del sistema de archivos y el registro, pero los cambios solo afectan al
contenedor y se descartan cuando se detiene. Para guardar los datos, el contenedor puede
montar una instancia de almacenamiento persistente, como Azure Disk o un recurso
compartido de archivos (incluido Azure Files ).

Un contenedor se basa en el kernel, pero el kernel no proporciona todas las API y servicios que
una aplicación necesita para ejecutarse; la mayoría de estos últimos se proporcionan a través
de archivos del sistema (bibliotecas) que se ejecutan sobre el kernel en modo de usuario. Dado
que un contenedor está aislado del entorno de modo de usuario del host, el contenedor
necesita su propia copia de estos archivos del sistema de modo de usuario, que se
empaquetan en algo conocido como imagen base. La imagen base cumple el papel de la capa
fundamental en la que se basa el contenedor y le proporciona los servicios de sistema
operativo que no ofrece el kernel. Sin embargo, mencionaremos más detalles acerca de las
imágenes de contenedor más adelante.

Contenedores frente a máquinas virtuales


A diferencia de un contenedor, una máquina virtual (VM) ejecuta un sistema operativo
completo, incluido su propio kernel, tal como se muestra en este diagrama.

Virtual Machine

Apps Services Apps Services

OS Kernel OS Kernel

Hardware

Los contenedores y las máquinas virtuales tienen sus usos particulares; de hecho, muchas
implementaciones de contenedores usan máquinas virtuales como sistema operativo host en
lugar de ejecutarse directamente en el hardware, sobre todo cuando se ejecutan contenedores
en la nube.

Para obtener más información sobre las similitudes y las diferencias de estas tecnologías
complementarias, consulte Contenedores frente a máquinas virtuales.
Imágenes del contenedor
Todos los contenedores se crean a partir de imágenes de contenedor. Una imagen de
contenedor es un conjunto de archivos organizados en una pila de capas que se hospeda en el
equipo local o en un registro de contenedor remoto. La imagen de contenedor está compuesta
por los archivos de sistema operativo del modo de usuario que son necesarios para admitir la
aplicación, los entornos de ejecución o las dependencias de la aplicación, y cualquier otro
archivo de configuración que la aplicación necesite para ejecutarse correctamente.

Microsoft ofrece varias imágenes (denominadas imágenes base) que puede usar como punto
de partida para crear su propia imagen de contenedor:

Windows: contiene el conjunto completo de API y servicios del sistema de Windows


(menos los roles de servidor).
Windows Server: contiene el conjunto completo de API y servicios del sistema de
Windows.
Windows Server Core: una imagen más pequeña que contiene un subconjunto de las API
de Windows Server; es decir, la versión completa de .NET Framework. También incluye la
mayoría de los roles de servidor, pero no todos (por ejemplo, servidor de fax no está
incluido).
Nano Server: referente a la imagen de Windows Server más pequeña, compatible con las
API de .NET Core y algunas funciones de servidor.

Como se mencionó anteriormente, las imágenes de contenedor se componen de una serie de


capas. Cada capa contiene un conjunto de archivos que, cuando se superponen, representan la
imagen de contenedor. Debido a la naturaleza por capas de los contenedores, no es necesario
que siempre tenga como destino una imagen base para compilar un contenedor de Windows.
En su lugar, puede elegir como destino otra imagen que ya contenga el marco de trabajo que
quiere. Por ejemplo, el equipo de .NET publica una imagen de .NET Core que incluye el
entorno de ejecución de .NET Core. Esto evita que los usuarios tengan que realizar nuevamente
el proceso de instalación de .NET Core. En su lugar, pueden volver a usar las capas de esta
imagen de contenedor. La imagen de .NET Core está basada en Nano Server.

Para obtener más información, consulte Imágenes base del contenedor.

Usuarios de los contenedores

Contenedores para desarrolladores


Los contenedores ayudan a los desarrolladores a crear y distribuir aplicaciones de mayor
calidad, más rápido. Con los contenedores, los desarrolladores pueden crear una imagen de
contenedor que se implementa en segundos de forma idéntica en todos los entornos. Los
contenedores actúan como un mecanismo sencillo para compartir código entre equipos y
arrancar un entorno de desarrollo sin afectar al sistema de archivos del host.

Los contenedores son portátiles y versátiles, pueden ejecutar aplicaciones escritas en cualquier
lenguaje y son compatibles con cualquier equipo que ejecute Windows 10, versión 1607 o
posterior, o Windows Server 2016 o posterior. Los desarrolladores pueden crear y probar
contenedores localmente en su equipo portátil o de escritorio y luego implementar esa misma
imagen de contenedor en la nube privada, la nube pública o el proveedor de servicios de su
empresa. La agilidad natural de los contenedores admite patrones de desarrollo de
aplicaciones modernas en entornos de nube virtualizados y a gran escala. La ventaja más útil
para los desarrolladores es quizás la capacidad de aislar el entorno para que la aplicación
siempre reciba la versión de las bibliotecas que se especifique, a fin de evitar conflictos con las
dependencias.

Contenedores para los profesionales de TI


Los contenedores ayudan a los administradores a crear una infraestructura que sea más fácil de
actualizar y mantener, y que el uso de los recursos de hardware sea más completo. Los
profesionales de TI pueden utilizar los contenedores para ofrecer entornos estandarizados para
su desarrollo, sus controles de calidad y sus equipos de producción. Mediante el uso de
contenedores, los administradores de sistemas abstraen las diferencias en las instalaciones de
sistemas operativos y la infraestructura subyacente.

También puede usar el modo interactivo de contenedores para ejecutar en el mismo sistema
las instancias en conflicto de una herramienta de línea de comandos.

Orquestación de contenedores
Los orquestadores son una parte fundamental de la infraestructura al configurar un entorno
basado en contenedores. Aunque puede administrar algunos contenedores manualmente
mediante Docker y Windows, las aplicaciones suelen usar cinco, diez o incluso cientos de
contenedores, donde se encuentran los orquestadores.

Los orquestadores de contenedor se crearon para ayudar a administrar contenedores a escala


y en producción. Los orquestadores proporcionan las funcionalidades para:

Los orquestadores le ayudan a aumentar el tamaño de las aplicaciones en contenedores a


escala, lo que proporciona funcionalidades para:

Implementación a escala
Programación de cargas de trabajo
Supervisión de estado
Conmutación por error cuando se produce un error en un nodo
Escalado o reducción vertical
Funciones de red
Detección de servicios
Coordinación de las actualizaciones de aplicaciones
Afinidad de nodos de clúster

Hay muchos orquestadores diferentes que puede utilizar con los contenedores de Windows.
Estas son las opciones que proporciona Microsoft:

Azure Kubernetes Service (AKS): use un servicio administrado de Azure Kubernetes.


Azure Kubernetes Service (AKS) en Azure Stack HCI: use Azure Kubernetes Service en el
entorno local.

Prueba de contenedores en Windows


Para empezar a trabajar con contenedores en Windows Server o Windows 10, consulte lo
siguiente:

Introducción: configuración del entorno para los contenedores

Para obtener ayuda a la hora de decidir qué servicios de Azure son adecuados para su
escenario, consulte Azure Container Services y Selección de los servicios de Azure que se
usarán para hospedar la aplicación.

Recursos
Para ver los recursos a fin de usar Windows Server:

Para ver las incidencias actuales y las actualizaciones de características planeadas,


consulte el repositorio de GitHub de contenedores de Windows .

Consulte nuestro blog: blog de contenedores de Windows .

Para ponerse en contacto con el equipo encargado de los contenedores de


Windows Server, envíe un correo electrónico a Clientes de contenedores de Windows.
Contenedores frente a máquinas
virtuales
Artículo • 05/02/2025

Se aplica a: Windows Server 2025, Windows Server 2022, Windows Server 2019,
Windows Server 2016

En este tema se describen algunas de las principales similitudes y diferencias entre


contenedores y máquinas virtuales (VM) y cuándo es posible que desee usar cada una.
Los contenedores y las máquinas virtuales tienen sus usos, de hecho, muchas
implementaciones de contenedores usan máquinas virtuales como sistema operativo
host en lugar de ejecutarse directamente en el hardware, especialmente cuando se
ejecutan contenedores en la nube.

Para obtener información general sobre los contenedores, consulte Windows y


contenedores.

Arquitectura de contenedor
Un contenedor es un silo aislado y ligero para ejecutar una aplicación en el sistema
operativo host. Los contenedores se basan en el kernel del sistema operativo host (que
se puede considerar como la fontanería enterrada del sistema operativo) y contienen
solo aplicaciones y algunas API y servicios ligeros del sistema operativo que se ejecutan
en modo de usuario, como se muestra en este diagrama.

diagrama de arquitectura de
Container Container

Apps Services Apps Services Apps Services

OS Kernel

Hardware

Arquitectura de máquina virtual


A diferencia de los contenedores, las máquinas virtuales ejecutan un sistema operativo
completo, incluido su propio kernel, como se muestra en este diagrama.
diagrama de arquitectura de
Virtual Machine

Apps Services Apps Services

OS Kernel OS Kernel

Hardware

Contenedores frente a máquinas virtuales


En la tabla siguiente se muestran algunas de las similitudes y diferencias de estas
tecnologías complementarias.

ノ Expandir tabla

Característica Máquina virtual Contenedor

Aislamiento Proporciona aislamiento completo Normalmente proporciona


del sistema operativo host y de aislamiento ligero del host y otros
otras máquinas virtuales. Esto contenedores, pero no proporciona
resulta útil cuando un límite de un límite de seguridad tan sólido
seguridad fuerte es crítico, como como una máquina virtual. (Puede
hospedar aplicaciones de empresas aumentar la seguridad si usa el modo
competidoras en el mismo servidor de aislamiento de Hyper-V para aislar
o clúster. cada contenedor en una máquina
virtual ligera).

Sistema operativo Ejecuta un sistema operativo Ejecuta la parte del modo de usuario
completo, incluido el kernel, lo que de un sistema operativo y se puede
requiere más recursos del sistema adaptar para contener solo los
(CPU, memoria y almacenamiento). servicios necesarios para la
aplicación, con menos recursos del
sistema.

Compatibilidad de Ejecuta casi cualquier sistema Se ejecuta en la misma versión del


invitados operativo dentro de la máquina sistema operativo que el host (el
virtual. aislamiento de Hyper-V le permite
ejecutar versiones anteriores del
mismo sistema operativo en un
entorno de máquina virtual ligera).

Despliegue Implementar máquinas virtuales Implementar contenedores


individuales mediante Windows individuales mediante Docker a través
Admin Center o Hyper-V Manager; de la línea de comandos; implemente
Característica Máquina virtual Contenedor

implemente varias máquinas varios contenedores mediante un


virtuales mediante PowerShell o orquestador como Azure Kubernetes
System Center Virtual Machine Service.
Manager.

Actualizaciones y Descargue e instale las Actualizar o mejorar los archivos del


mejoras del actualizaciones del sistema sistema operativo dentro de un
sistema operativo operativo en cada máquina virtual. contenedor es lo mismo:
La instalación de una nueva versión
del sistema operativo requiere 1. Edite el archivo de compilación
actualizar o, a menudo, de la imagen de contenedor
simplemente crear una máquina (conocido como Dockerfile)
virtual completamente nueva. Esto para que apunte a la versión
puede llevar mucho tiempo, más reciente de la imagen base
especialmente si tiene muchas de Windows.
máquinas virtuales. 2. Vuelva a generar la imagen de
contenedor con esta nueva
imagen base.
3. Sube la imagen del contenedor
a tu registro de contenedores.
4. Vuelva a implementar
mediante un orquestador.
El orquestador proporciona
una automatización eficaz para
hacerlo a escala. Para más
información, consulte Tutorial:
Actualización de una aplicación
en Azure Kubernetes Service.

Almacenamiento Use un disco duro virtual (VHD) Use Azure Disks para el
persistente para el almacenamiento local para almacenamiento local para un solo
una sola máquina virtual o un nodo o Azure Files (recursos
recurso compartido de archivos compartidos SMB) para el
SMB para el almacenamiento almacenamiento compartido por
compartido por varios servidores. varios nodos o servidores.

Equilibrio de carga El equilibrio de carga de las Los contenedores no se mueven; en


máquinas virtuales mueve las VMs su lugar, un orquestador puede
en ejecución a otros servidores de iniciar o detener automáticamente los
un clúster de conmutación por contenedores en los nodos del
error. clúster para administrar los cambios
en la carga y la disponibilidad.

Tolerancia a Las máquinas virtuales pueden Si se produce un error en un nodo de


errores conmutarse a otro servidor de un clúster, el orquestador vuelve a crear
clúster, reiniciando su sistema rápidamente los contenedores que se
operativo en el nuevo servidor. ejecutan en él en otro nodo de
clúster.
Característica Máquina virtual Contenedor

Gestión de redes Usa adaptadores de red virtual. Usa una vista aislada de un
adaptador de red virtual, lo que
proporciona un poco menos
virtualización: el firewall del host se
comparte con contenedores, al
tiempo que usa menos recursos. Para
más información, vea Redes de
contenedores en Windows.

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Requisitos del contenedor de Windows
Artículo • 05/02/2025

Se aplica a: Windows Server 2025, Windows Server 2022, Windows Server 2019,
Windows Server 2016; Azure Stack HCI, versiones 21H2 y 20H2, Windows 10,
Windows 11

En esta guía se enumeran los requisitos de un host de contenedor de Windows.

Requisitos del sistema operativo


La característica contenedor de Windows está disponible en Windows Server 2016
y versiones posteriores, Windows 10 Professional y Enterprise Edition (versión 1607
y posteriores) y Windows 11 Pro y Enterprise.
El rol Hyper-V se debe instalar antes de ejecutar el aislamiento de Hyper-V.
Los hosts de contenedor de Windows Server deben tener Windows instalado en c:.
Esta restricción no se aplica si solo se implementarán Hyper-V contenedores
aislados.

Hosts de contenedor virtualizados


Si va a ejecutar un host de contenedores de Windows desde una máquina virtual Hyper-
V y también va a hospedar aislamiento de Hyper-V, debe habilitar la virtualización
anidada. La virtualización anidada tiene los siguientes requisitos:

Al menos 4 GB de RAM disponible para el host de Hyper-V virtualizado.


Procesador con Intel VT-x (esta característica está disponible actualmente para
procesadores Intel y AMD).
La máquina virtual del host de contenedor también necesita al menos dos
procesadores virtuales.

Requisitos de memoria
Puede configurar restricciones en la memoria disponible para los contenedores a través
de controles de recursos o sobrecargando un host de contenedor. La cantidad mínima
de memoria necesaria para iniciar un contenedor y ejecutar comandos básicos
( ipconfig , dir , etc.) se enumeran a continuación.
7 Nota

Estos valores no tienen en cuenta el uso compartido de recursos entre


contenedores o requisitos de la aplicación que se ejecuta en el contenedor. Por
ejemplo, un host con 512 MB de memoria libre puede ejecutar varios contenedores
de Server Core bajo aislamiento Hyper-V porque los contenedores comparten
recursos.

Consulte también
directiva de soporte técnico para contenedores de Windows y Docker en escenarios
locales

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Preguntas más frecuentes sobre
los contenedores
Preguntas más frecuentes

¿Tiene alguna pregunta acerca de los contenedores de Windows Server? Consulte si se


ha respondido en la lista siguiente.

¿Cuál es la diferencia entre los


contenedores de Windows Server y
Linux?
Los contenedores de Windows Server y Linux implementan tecnologías similares dentro
de su kernel y su sistema operativo base. La diferencia reside en la plataforma y las
cargas de trabajo que se ejecutan dentro de los contenedores.

Cuando un cliente usa contenedores de Windows Server, puede integrarlos con las
tecnologías de Windows existentes, como. NET, ASP.NET y PowerShell.

¿Cuáles son los requisitos previos para


ejecutar contenedores en Windows?
Los contenedores se introdujeron en la plataforma con Windows Server 2016. Para usar
contenedores, se necesitarán Windows Server 2016, la actualización de Windows 10
Anniversary (versión 1607) o posterior, o bien Windows 10 IoT Enterprise o posterior.
Lee los Requisitos del sistema para obtener más información.

¿Cuáles de los sistemas operativos


Windows se admiten en Kubernetes?
La compatibilidad con contenedores de Windows depende de la plataforma de
Kubernetes en la que se ejecute. Azure Kubernetes Service (AKS), AKS en Azure Stack
HCI y Windows Server admiten los nodos de Windows de Windows Server 2019 y
Windows Server 2022. Azure Kubernetes Service Edge Essentials admite Windows
Server 2019, Windows Server 2022 y Windows 10/11 Enterprise o Pro. Para consultar la
compatibilidad de versiones de contenedor de Windows, consulte Compatibilidad con
versiones de contenedores de Windows.

¿Cómo se aplica una revisión a los


nodos de Windows?
Los nodos de Windows Server en AKS y AKS en Azure Stack HCl y Windows Server
deben actualizarse para obtener las actualizaciones y correcciones de revisión más
recientes. Las actualizaciones de Windows no están habilitadas en los nodos de
Windows de esos servicios. Sin embargo, ambos servicios proporcionan mecanismos
para actualizar las imágenes de nodo de Windows.

¿Pueden usar gMSA los contenedores


de Windows Server?
Sí, gMSA es compatible con los nodos de trabajo de Windows unidos a un dominio.
Para obtener más información sobre el uso de gMSA con contenedores de Windows,
consulte Preparación de nodos de Windows para gMSA.

¿Qué son WCOW y LCOW?


WCOW es la abreviatura de "Windows containers on Windows" (Contenedores de
Windows en Windows). LCOW es la abreviatura de "Linux containers on Windows"
(Contenedores de Linux en Windows).

¿Cómo se concede la licencia de


contenedores? ¿Hay un límite en el
número de contenedores que puedo
ejecutar?
En el CLUF de la imagen de contenedor de Windows se describe un uso que depende
de un usuario que tiene un sistema operativo host con licencia válida. El número de
contenedores que puede ejecutar un usuario depende de la edición del sistema
operativo host y del modo de aislamiento con el que se ejecuta un contenedor, así
como de si estos contenedores se ejecutan con fines de desarrollo y pruebas o en
producción.
ノ Expandir tabla

Sistema operativo Límite de contenedor Límite de contenedor


host aislado de proceso aislado de Hyper-V

Windows Server Sin límite 2


Standard

Windows Server Sin límite Sin límite


Datacenter

Windows Pro y Sin límite (solo con fines de Sin límite (solo con fines de
Enterprise prueba o desarrollo) prueba o desarrollo)

Windows 10 Sin límite* Sin límite*


IoT Core

Windows IoT Sin límite* Sin límite*


Enterprise

El uso de imágenes de contenedor de Windows Server se determina mediante la lectura


del número de invitados de virtualización admitidos para esa edición.

7 Nota

*El uso de contenedores en producción en una edición IoT de Windows depende


de si has aceptado los términos de uso comerciales de Microsoft para imágenes de
tiempo de ejecución de Windows 10 Core o la licencia de dispositivo de
Windows 10 IoT Enterprise ("Contrato de Windows IoT Commercial"). Se aplican
términos y restricciones adicionales en los contratos de IoT Windows Commercial al
uso de la imagen de contenedor en un entorno de producción. Lee el CLUF de la
imagen de contenedor para comprender exactamente lo que se permite y lo que
no.

Como desarrollador, ¿tengo que volver


a escribir la aplicación para cada tipo de
contenedor?
No. Las imágenes de contenedores de Windows son comunes para los contenedores de
Windows Server y el aislamiento de Hyper-V. La elección del tipo de contenedor se
realiza cuando se inicia el contenedor. Desde la perspectiva del desarrollador, los
contenedores de Windows Server y el aislamiento de Hyper-V son dos versiones de lo
mismo. Ofrecen la misma experiencia de desarrollo, programación y administración, son
abiertos y extensibles e incluyen el mismo nivel de integración y compatibilidad con
Docker.

Un desarrollador puede crear una imagen de contenedor con un contenedor de


Windows Server e implementarla en el aislamiento de Hyper-V o viceversa, sin ningún
cambio aparte de especificar la marca de tiempo de ejecución adecuada.

Los contenedores de Windows Server ofrecen mayor densidad y rendimiento para


cuando la velocidad es clave, como un menor tiempo de spin up y un rendimiento en
tiempo de ejecución más rápido en comparación con las configuraciones anidadas. El
aislamiento de Hyper-V, como su nombre indica, ofrece mayor aislamiento,
garantizando que el código que se ejecuta en un contenedor no se pueda poner en
peligro ni afectar negativamente al sistema operativo host u otros contenedores que se
ejecutan en el mismo host. Esto es útil en los escenarios de varios inquilinos con
requisitos para el hospedaje de código no seguro, entre los que se incluyen las
aplicaciones de SaaS y el hospedaje de procesos.

¿Puedo ejecutar contenedores de


Windows en modo aislado de proceso
en Windows 10?
A partir de la actualización de Windows 10 de octubre de 2018, puedes ejecutar un
contenedor de Windows con aislamiento de procesos, pero primero debes solicitar
directamente el aislamiento de procesos con la marca --isolation=process al ejecutar
los contenedores con docker run . El aislamiento de procesos es compatible con
Windows 10 Pro (o más reciente), Windows 10 Enterprise (o más reciente), Windows
10 IoT Core (o más reciente) y Windows 10 IoT Enterprise (o más reciente).

Si quieres ejecutar los contenedores de Windows de esta manera, debes asegurarte de


que el host ejecuta Windows 10 compilación 17763 o versión posterior y de que tiene
una versión de Docker con el motor 18.09 o más reciente.

2 Advertencia
Aparte de los hosts de IoT Core e IoT Enterprise (después de aceptar los términos y
restricciones adicionales), esta característica solo está pensada para el desarrollo y
pruebas. Debes seguir usando Windows Server como host para las
implementaciones de producción. Con esta característica, también debe asegurarse
de que las etiquetas de la versión y el número de compilación del contenedor y del
host coinciden; de lo contrario, el contenedor puede no iniciarse o mostrar un
comportamiento indefinido.

¿Cómo hago que mis imágenes de


contenedor estén disponibles en
máquinas con separación de aire?
Las imágenes base del contenedor de Windows contienen artefactos cuya distribución
está restringida por licencia. Al compilar en estas imágenes e insertarlas en un registro
privado o público, observarás que la capa base nunca se inserta. En su lugar, usamos el
concepto de una capa externa que apunta a la capa base real que reside en el
almacenamiento en la nube de Azure.

Esto puede complicar las cosas cuando tienes una máquina con separación de aire que
solo puede extraer imágenes de la dirección del registro de contenedor privado. En este
caso, los intentos de seguir la capa externa para obtener la imagen base no funcionarán.
Para reemplazar el comportamiento de la capa externa, puedes usar la marca --allow-
nondistributable-artifacts en el demonio de Docker.

) Importante

El uso de esta marca no excluirá la obligación de cumplir los términos de la licencia


de imagen base del contenedor de Windows; no debes publicar el contenido de
Windows para la redistribución pública o de terceros. Se permite el uso dentro de
su propio entorno.

Comentario adicional
¿Quites agregar algo a las preguntas más frecuentes? Abre un nuevo problema de
comentarios en la sección de comentarios o configura una solicitud de incorporación de
cambios para esta página con GitHub.
Comentarios
¿Le ha resultado útil esta página?  Sí  No
Introducción: Preparar Windows para
contenedores
Artículo • 09/04/2025

En este inicio rápido, verá varios enfoques para crear un entorno listo para contenedores en
Windows y Windows Server. También se instala un entorno de ejecución de contenedor.

Los contenedores proporcionan un entorno ligero y aislado que facilita el desarrollo, la


implementación y la administración de las aplicaciones. Para poder usar un contenedor, debe
configurar un entorno de ejecución adecuado.

Este inicio rápido se aplica a Windows Server 2025, Windows Server 2022, Windows Server
2019, Windows Server 2016, Windows 11 y Windows 10.

Prerrequisitos
El entorno que necesita para esta introducción rápida depende de su sistema operativo (SO).

Windows 10 y Windows 11
Para ejecutar contenedores en Windows 10 o Windows 11, necesita el siguiente entorno:

Un sistema de equipo físico que ejecuta Windows 11 o Windows 10 con la actualización


de aniversario (versión 1607) o posterior
Edición Professional o Enterprise
Hyper-V habilitado

Los contenedores de Windows Server utilizan aislamiento Hyper-V por defecto en Windows 10
y Windows 11 para proporcionar a los desarrolladores la misma versión y configuración del
kernel utilizada en producción. Para obtener más información sobre el aislamiento de Hyper-V,
consulte Modos de aislamiento.

Windows Server
Para ejecutar contenedores de Windows Server en entornos de desarrollo, necesita un servidor
físico o una máquina virtual (VM) que ejecute Windows Server.

Para realizar pruebas, puede descargar una copia de evaluación de Windows Server 2025 o
una versión preliminar del Programa Windows Server Insider .
Elección de un método
El enfoque que se toma para construir un entorno listo para contenedores depende del
sistema operativo. También depende de otros factores, como la complejidad y el costo de la
implementación.

Windows 10 y Windows 11
En las ediciones Windows 10 y Windows 11 Professional y Enterprise, puedes usar Docker
Desktop para ejecutar aplicaciones en contenedores. Docker Desktop proporciona una manera
de administrar contenedores, aplicaciones e imágenes.

Windows Server
Para muchas aplicaciones y patrones de orquestación, debe compilar e implementar sus
propias máquinas virtuales personalizadas. Con la transición de compatibilidad para el
entorno de ejecución del contenedor de Windows a Mirantis, el entorno de ejecución del
contenedor ya no se proporciona como parte de una oferta de máquina virtual de
Marketplace. En el resto de esta guía se muestra cómo compilar una máquina virtual para
Azure con el entorno de ejecución del contenedor instalado y listo para usarse.

Azure sigue ofreciendo una experiencia completa y totalmente administrada de un extremo a


otro a través de Azure Kubernetes Service (AKS) tanto en la nube como en el entorno local.
AKS y Azure Kubernetes Service en Azure Stack HCI son servicios totalmente administrados con
una sobrecarga de administración menor que las implementaciones personalizadas. La
compatibilidad con el entorno de ejecución del contenedor se incluye en los servicios AKS y
Azure Kubernetes Service en Azure Stack HCI en su suscripción de Azure.

Implementación de un contenedor de Windows Server en un clúster de Azure Kubernetes


Service (AKS) mediante la CLI de Azure
Configuración de un host de Azure Kubernetes Service en Azure Local y Windows Server
e implementación de un clúster de cargas de trabajo mediante PowerShell

También existen otras opciones para hacer que la experiencia de construcción de máquinas
virtuales de Azure listas para contenedores sea lo más fluida posible. Dos ejemplos son Azure
VM Image Builder y extensiones de script personalizadas. Al comparar opciones, tenga en
cuenta los siguientes puntos. Es necesario que su organización decida qué aspecto optimizar.

¿Qué tan complejo es implementarlo?


¿Cuál es el costo?
¿Cómo afecta a mi carga de trabajo en producción?
En las subsecciones siguientes se describen las ventajas y desventajas de VM Image Builder y
las extensiones de script personalizadas, y se muestra cómo empezar.

Generador de imágenes de máquina virtual

La ventaja de usar VM Image Builder es que la configuración se realiza durante un tiempo de


compilación y no tiene ningún efecto en la carga de trabajo en tiempo de ejecución. Cuando el
conjunto de escalado de máquinas virtuales crea una instancia de una nueva máquina virtual a
partir de la imagen personalizada, la imagen ya está preparada y está lista para ejecutar
contenedores.

Sin embargo, VM Image Builder puede ser más complejo de implementar que las extensiones
de script y hay más pasos implicados. Además, el servicio Vm Image Builder es gratuito, pero
debe pagar por el uso de proceso, almacenamiento y redes asociado al proceso de
compilación. Para obtener más información, consulte Costos.

Para obtener un procedimiento detallado y paso a paso para crear su propia imagen de
máquina virtual Windows Server, consulte Crear una máquina virtual Windows utilizando Azure
VM Image Builder. Para instalar el entorno de ejecución de contenedor que prefiera, use los
scripts de PowerShell de esta guía.

 Sugerencia

Asegúrese de almacenar en caché las imágenes de contenedor que planea usar


localmente en la máquina virtual. Esta práctica ayuda a mejorar el tiempo de inicio del
contenedor después de la implementación. Para ver los scripts que ayudan con esta tarea,
consulte Windows Server, más adelante en este inicio rápido.

Extensiones de script personalizado

Las extensiones de script personalizadas son más rápidas de implementar que una solución vm
Image Builder. El único costo asociado a las extensiones es el precio de almacenar el script en
Azure o GitHub. Sin embargo, el script solo se puede ejecutar después de aprovisionar una
máquina virtual. Como resultado, el presupuesto debe incluir tiempo adicional para la
preparación de la máquina virtual en el momento de ampliación.

Con los scripts que se ofrecen en esta guía, configure los conjuntos de escalado de máquinas
virtuales para instalar el entorno de ejecución del contenedor que prefiera después del
aprovisionamiento. Para usar una extensión de script personalizada para automatizar el
proceso de instalación de aplicaciones en máquinas virtuales de Azure, consulte Tutorial:
Instalación de aplicaciones en virtual Machine Scale Sets con la CLI de Azure.
Instalación del entorno de ejecución del
contenedor
El procedimiento que se usa para instalar un entorno de ejecución de contenedor depende del
sistema operativo.

Windows 10 y Windows 11
Para instalar Docker en las ediciones Windows 10 o Windows 11 Professional y Enterprise, siga
estos pasos:

1. Descargue e instale Docker Desktop y cree una cuenta de Docker si aún no tiene una.
Puede crear una cuenta gratuita de Docker para usuarios personales o de pequeñas
empresas. Sin embargo, para empresas más grandes, hay una tarifa mensual. Para
obtener información detallada, consulte la documentación de Docker .

2. Durante la instalación, establezca el tipo de contenedor predeterminado en


Contenedores de Windows. Para cambiar el tipo una vez finalizada la instalación, realice
uno de los pasos siguientes:

Ejecute el siguiente comando en una ventana de PowerShell.

Consola

& $Env:ProgramFiles\Docker\Docker\DockerCli.exe -SwitchDaemon

Use el elemento de Docker en la bandeja del sistema de Windows, como se muestra


en la captura de pantalla siguiente:
Centro de Administración de Windows (Windows Admin
Center)
Para usar Windows Admin Center para configurar una máquina Windows Server como host de
contenedor, siga estos pasos:

1. En Windows Admin Center, asegúrese de que tiene instalada la extensión Containers más
reciente. Para obtener más información sobre cómo instalar y configurar extensiones,
consulte la documentación de Windows Admin Center.

2. Abra la máquina Windows Server que desea configurar.

3. En el panel lateral, en Herramientas, seleccione Contenedores.

4. Seleccione Instalar.
Windows Admin Center inicia la configuración de Windows Server y Docker en segundo
plano.

5. Una vez completado el proceso, actualice la página para ver otra funcionalidad de la
extensión Containers.

Windows Server
Para ejecutar un contenedor de Windows, debe tener un entorno de ejecución de contenedor
compatible disponible en la máquina. Los entornos de ejecución admitidos actualmente en
Windows son Moby , Mirantis Container Runtime y containerd .

En esta sección se muestra cómo instalar cada tiempo de ejecución en una máquina virtual que
ejecuta Windows Server. En el caso de los entornos de ejecución de Moby y contenedores,
puede usar scripts de PowerShell para completar la instalación en unos pocos pasos.

Docker CE/Moby
Docker Community Edition (Docker CE) proporciona un entorno de tiempo de ejecución
estándar para contenedores. El entorno ofrece una API común y una interfaz de línea de
comandos. La comunidad de código abierto administra el marco y los componentes de
Docker CE como parte del proyecto Moby .

Para empezar a trabajar con Docker en Windows Server, use el siguiente comando para
ejecutar el script de PowerShellinstall-docker-ce.ps1 . Este script configura el entorno
para habilitar las características del sistema operativo relacionadas con el contenedor. El
script también instala el entorno de ejecución de Docker.

PowerShell

Invoke-WebRequest -UseBasicParsing
"https://raw.githubusercontent.com/microsoft/Windows-
Containers/Main/helpful_tools/Install-DockerCE/install-docker-ce.ps1" -o
install-docker-ce.ps1
.\install-docker-ce.ps1

Para obtener información detallada sobre cómo configurar el motor de Docker, consulte
Motor de Docker en Windows.

Pasos siguientes

7 Nota

Para obtener instrucciones del equipo de productos contenedores de Windows, consulte


el repositorio contenedores de Windows en GitHub.

Ahora que el entorno está configurado correctamente, consulte cómo ejecutar un contenedor.

Ejecutar su primer contenedor


Introducción: Ejecución del primer
contenedor de Windows
10/06/2025

Se aplica a: Windows Server 2025, Windows Server 2022, Windows Server 2019, Windows
Server 2016

En este artículo se muestra cómo ejecutar el primer contenedor de Windows, después de


configurar el entorno como se describe en Introducción: Preparación de Windows para
contenedores. La ejecución de un contenedor implica dos pasos generales:

Descargar una imagen base. Con los contenedores, el proceso de descarga de una
imagen base se conoce como una operación de extracción. La imagen base proporciona
una capa fundamental de servicios de sistema operativo al contenedor.
Crear y ejecutar una imagen de contenedor basada en la imagen base.

Extracción de una imagen base de contenedor


Todos los contenedores se crean a partir de imágenes de contenedor. Microsoft ofrece varias
imágenes de inicio, llamadas imágenes base, entre las que elegir. Para obtener más
información, consulte Imágenes base de contenedor.

Puede usar el siguiente procedimiento para extraer la imagen base ligera de Nano Server o, en
otras palabras, para descargar e instalar esa imagen.

1. Abra una ventana de consola, como el Símbolo del sistema integrado, PowerShell o
Windows Terminal .

2. Ejecute el siguiente comando para descargar e instalar la imagen base:

Consola

docker pull mcr.microsoft.com/windows/nanoserver:ltsc2022

Mientras espera, lea los términos de la licencia complementaria para la imagen.

Si Docker no se inicia al intentar descargar la imagen, es posible que no se pueda acceder


al demonio de Docker. Para resolver este problema, reinicie el servicio Docker.

 Sugerencia
Si ve el mensaje de error "No hay manifiesto coincidente para linux/amd64 en las
entradas de la lista de manifiestos", Docker podría configurarse para ejecutar
contenedores de Linux en lugar de contenedores de Windows. Para cambiar a
contenedores de Windows en Docker, siga uno de los pasos siguientes:

En la bandeja del sistema de Windows, haga clic con el botón derecho en el


icono de Docker y seleccione Cambiar a contenedores de Windows.
En un intérprete de comandos, ejecute &
$Env:ProgramFiles\Docker\Docker\DockerCli.exe -SwitchDaemon .

3. Compruebe la existencia de la imagen en el sistema consultando el repositorio de


imágenes de Docker local. Para realizar esta comprobación, ejecute el docker images
comando , que devuelve una lista de imágenes instaladas.

Este es un ejemplo de salida de ese comando, que muestra la imagen de Nano Server.

Consola

REPOSITORY TAG IMAGE ID CREATED


SIZE
mcr.microsoft.com/windows/nanoserver ltsc2022 4f0ead5b1b67 6 days ago
296MB

Ejecución de un contenedor de Windows


En este ejemplo básico, crea e implementa una imagen de contenedor de Hola Mundo. Para
obtener la mejor experiencia, ejecute los comandos de esta sección en una terminal con
privilegios elevados. Pero no use el entorno de scripting integrado (ISE) de Windows
PowerShell. No es adecuado para sesiones interactivas con contenedores; los contenedores
parecen dejar de responder.

1. Inicie un contenedor con una sesión interactiva a partir de la imagen nanoserver


ingresando el siguiente comando en el terminal:

Consola

docker run -it mcr.microsoft.com/windows/nanoserver:ltsc2022 cmd.exe

Cuando el contenedor se inicia, la ventana de la consola cambia de contexto al


contenedor.
2. Dentro del contenedor, ejecute los siguientes comandos. El primer comando crea un
archivo de texto que contiene la frase "Hello World!" El segundo comando sale del
contenedor.

Símbolo del sistema de Windows

echo "Hello World!" > Hello.txt


exit

3. Ejecute el docker ps comando para obtener el identificador de contenedor del


contenedor que acaba de salir:

Consola

docker ps -a

4. Cree una nueva imagen helloworld que incluya los cambios realizados en el primer
contenedor que ejecutó. Para ello, ejecute el docker commit comando y reemplace
<container-ID> por el identificador del contenedor:

Consola

docker commit <container-ID> helloworld

Ahora tiene una imagen personalizada que contiene el archivo Hello.txt. Puede usar el
docker images comando para ver la nueva imagen.

Consola

docker images

Este es un ejemplo de la salida:

Consola

REPOSITORY TAG IMAGE ID CREATED


SIZE
helloworld latest 81013d6b73ae 25 seconds
ago 299MB
mcr.microsoft.com/windows/nanoserver ltsc2022 4f0ead5b1b67 6 days ago
296MB

5. Ejecute el nuevo contenedor mediante el docker run comando con la --rm opción .
Cuando se usa esta opción, Docker quita automáticamente el contenedor cuando el
comando, cmd.exe en este caso, se detiene.

Consola

docker run --rm helloworld cmd.exe /s /c type Hello.txt

Docker crea un contenedor a partir de la helloworld imagen e inicia una instancia de


cmd.exe en el contenedor. El cmd.exe proceso lee el archivo Hello.txt y escribe el

contenido en la ventana de la consola. Como último paso, Docker detiene y quita el


contenedor.

Ejecución de un contenedor de Windows mediante


Windows Admin Center
Puedes usar Windows Admin Center para ejecutar los contenedores localmente. En concreto,
puedes usar la extensión Containers de Windows Admin Center para este propósito.

Visualización de imágenes de contenedor


1. Abra el host de contenedor que desea administrar.

2. En el panel Herramientas , seleccione Contenedores para abrir la extensión Containers.

3. En el panel principal, en Host de contenedor, seleccione Imágenes.

Descargar una imagen de contenedor


1. Si el host no tiene una imagen de contenedor base, seleccione Descargar para abrir el
cuadro de diálogo Descargar imagen de contenedor.

2. En el cuadro de diálogo Obtener imagen de contenedor, escriba la dirección URL de la


imagen y la etiqueta.

Si no está seguro de qué imagen se va a extraer, expanda Imágenes comunes de


Windows para ver una lista de imágenes comunes de Microsoft.
Si desea extraer una imagen de un repositorio privado, expanda Autenticación del
Registro para escribir las credenciales.

3. Seleccione Extraer. Windows Admin Center inicia el proceso de extracción en el host del
contenedor. Una vez completada la descarga, verá la nueva imagen en la pestaña
Imágenes .

Ejecutar una imagen


1. Seleccione la imagen que desea ejecutar y, a continuación, seleccione Ejecutar. Se abre el
cuadro de diálogo Ejecutar imagen .
2. En el cuadro de diálogo Ejecutar imagen , escriba información para configurar el
contenedor, como el nombre del contenedor, el tipo de aislamiento, los puertos que se
van a publicar y la asignación de memoria y CPU. También puede agregar opciones para
anexar al docker run comando, como -v para especificar un volumen persistente. Para
obtener más información sobre los parámetros disponibles docker run , vea docker
container run .

3. Seleccione Ejecutar. La pestaña Contenedores muestra el estado de los contenedores en


ejecución.

Paso siguiente
Vea cómo incluir en contenedores una aplicación de ejemplo
Contenerizar una aplicación de .NET
Core
Artículo • 05/02/2025

Se aplica a: Windows Server 2025, Windows Server 2022, Windows Server 2019,
Windows Server 2016

En este tema se describe cómo empaquetar una aplicación de .NET de ejemplo existente
para la implementación como un contenedor de Windows, después de configurar el
entorno, tal como se describe en Introducción a Windows: Preparación de Windows
para contenedoresy ejecución del primer contenedor como se describe en Ejecutar el
primer contenedor de Windows.

También necesitará el sistema de control de código fuente de Git instalado en el equipo.


Para instalarlo, visite Git .

Clonación del código de ejemplo desde GitHub


Todo el código fuente de ejemplo de contenedor se mantiene en el repositorio git de
Virtualization-Documentation en una carpeta denominada windows-container-
samples .

1. Abra una sesión de PowerShell y cambie los directorios a la carpeta en la que


desea almacenar este repositorio. (Otros tipos de ventanas de la línea de
comandos también funcionan, pero nuestros comandos de ejemplo utilizan
PowerShell).

2. Clona el repositorio en el directorio de trabajo actual.

PowerShell

git clone https://github.com/MicrosoftDocs/Virtualization-


Documentation.git

3. Vaya al directorio de ejemplo que se encuentra en Virtualization-


Documentation\windows-container-samples\asp-net-getting-started y cree un

Dockerfile con los siguientes comandos.

Un dockerfile es como un archivo Make, es una lista de instrucciones que indican


al motor de contenedor cómo compilar la imagen de contenedor.
Powershell

# Navigate into the sample directory


Set-Location -Path Virtualization-Documentation\windows-container-
samples\asp-net-getting-started

# Create the Dockerfile for our project


New-Item -Name Dockerfile -ItemType file

Escritura de Dockerfile
Abra el Archivo Dockerfile que acaba de crear con el editor de texto que desee y
agregue el siguiente contenido:

Dockerfile

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build-env


WORKDIR /app

COPY *.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "asp-net-getting-started.dll"]

Vamos a desglosarlo de línea a línea y explicar lo que hace cada una de las
instrucciones.

Dockerfile

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build-env


WORKDIR /app

El primer grupo de líneas declara la imagen base que se usará para crear el contenedor.
Si el sistema local aún no tiene esta imagen, Docker intentará capturarla
automáticamente. El mcr.microsoft.com/dotnet/core/sdk:2.1 viene empaquetado con el
SDK de .NET Core 2.1 instalado, por lo que está preparado para compilar proyectos de
ASP.NET Core dirigidos a la versión 2.1. La siguiente instrucción cambia el directorio de
trabajo de nuestro contenedor para que sea /app , por lo que todos los comandos
siguientes a este se ejecutan en este contexto.
Dockerfile

COPY *.csproj ./
RUN dotnet restore

A continuación, estas instrucciones copian los archivos .csproj hacia el directorio /app
del contenedor build-env . Después de copiar este archivo, .NET leerá de él y, a
continuación, extraerá y capturará todas las dependencias y herramientas necesarias
para nuestro proyecto.

Dockerfile

COPY . ./
RUN dotnet publish -c Release -o out

Una vez que .NET ha extraído todas las dependencias en el contenedor de build-env , la
siguiente instrucción copia todos los archivos de origen del proyecto en el contenedor.
A continuación, le decimos a .NET que publique nuestra aplicación con una
configuración de versión y especifique la ruta de salida.

La compilación debería tener éxito. Ahora debemos crear la imagen final.

 Sugerencia

En este inicio rápido se compila un proyecto de .NET Core a partir del origen. Al
crear imágenes de contenedor, se recomienda incluir solo la carga de producción y
sus dependencias en la imagen de contenedor. No queremos que el SDK de .NET
Core se incluya en nuestra imagen final porque solo necesitamos el entorno de
ejecución de .NET Core, por lo que el dockerfile se escribe para usar un contenedor
temporal que se empaqueta con el SDK llamado build-env para compilar la
aplicación.

Dockerfile

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "asp-net-getting-started.dll"]

Dado que la aplicación es ASP.NET, especificamos una imagen con este tiempo de
ejecución incluido. A continuación, copiamos todos los archivos del directorio de salida
de nuestro contenedor temporal en nuestro contenedor final. Configuramos el
contenedor para que se ejecute con nuestra nueva aplicación como punto de entrada
cuando se inicia el contenedor.

Se ha escrito el Dockerfile para realizar una compilación de varias fases. Cuando se


ejecuta el dockerfile, usa el contenedor temporal, build-env , con el SDK de .NET Core
2.1 para compilar la aplicación de ejemplo y, a continuación, copia los archivos binarios
generados en otro contenedor que contiene solo el entorno de ejecución de .NET Core
2.1 para que se minimice el tamaño del contenedor final.

Compilación y ejecución de la aplicación


Con el Dockerfile escrito, podemos apuntar a Docker en nuestro Dockerfile y indicarle
que compile y, a continuación, ejecute nuestra imagen:

1. En una ventana de la terminal, vaya al directorio donde reside el Dockerfile y, a


continuación, ejecute el comando docker build para construir el contenedor
desde el Dockerfile.

Powershell

docker build -t my-asp-app .

2. Para ejecutar el contenedor recién compilado, ejecute el comando docker run .

Powershell

docker run -d -p 5000:80 --name myapp my-asp-app

Vamos a diseccionar este comando:

-d indica a Docker que ejecute el contenedor "desasociado", lo que significa

que no se enlaza ninguna consola a la consola dentro del contenedor. El


contenedor se ejecuta en segundo plano.
-p 5000:80 indica a Docker que asigne el puerto 5000 en el host al puerto 80

del contenedor. Cada contenedor obtiene su propia dirección IP. ASP .NET
escucha de forma predeterminada en el puerto 80. La asignación de puertos
nos permite ir a la dirección IP del host en el puerto asignado y Docker
reenvía todo el tráfico al puerto de destino dentro del contenedor.
--name myapp indica a Docker que asigne a este contenedor un nombre

conveniente para realizar consultas (en lugar de tener que buscar el


identificador de contenedor asignado en tiempo de ejecución por Docker).
my-asp-app es la imagen que queremos que Docker ejecute. Esta es la

imagen de contenedor generada como la culminación del proceso de docker


build .

3. Abra un explorador web y vaya a http://localhost:5000 para ver la aplicación en


contenedor.

Pasos siguientes
1. El siguiente paso consiste en publicar la aplicación web ASP.NET contenedorizada
en un registro privado mediante Azure Container Registry. Esto le permite
implementarlo en la organización.

Crear un registro de contenedor privado

Cuando llegue a la sección donde la imagen de contenedor se inserta en el


registro, especifique el nombre de la aplicación ASP.NET que acaba de empaquetar
( my-asp-app ) junto con el registro de contenedor (por ejemplo: contoso-container-
registry ):

PowerShell

docker tag my-asp-app contoso-container-registry.azurecr.io/my-asp-


app:v1

Para ver más ejemplos de aplicaciones y sus dockerfiles asociados, consulte


ejemplos adicionales de contenedores.
2. Una vez publicada la aplicación en el registro de contenedor, el siguiente paso es
implementar la aplicación en un clúster de Kubernetes que cree con Azure
Kubernetes Service.

Creación de un clúster de Kubernetes

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Uso de contenedores de Windows para
"incluir en contenedores" aplicaciones
existentes
Artículo • 22/01/2025

Se aplica a: Windows Server 2025, Windows Server 2022, Windows Server 2019,
Windows Server 2016

Los contenedores de Windows proporcionan un excelente mecanismo para modernizar


las aplicaciones tradicionales o heredadas. Aunque es posible que vea que a este
enfoque se le denomina "migración mediante lift-and-shift a contenedores", la metáfora
de "migración mediante lift-and-shift" se origina por el traslado de cargas de trabajo de
máquinas físicas a máquinas virtuales y se utiliza cuando se habla de mover cargas de
trabajo a la nube. En la actualidad, este término se aplica más adecuadamente a la
migración de máquinas virtuales (VM). Sin embargo, los contenedores no son máquinas
virtuales y pensar en ellos como máquinas virtuales puede provocar confusión sobre
cómo se contenediza una aplicación, o si puede o debe ser contenedizada.

En este tema se proporcionan instrucciones prácticas sobre cómo mover aplicaciones


tradicionales a contenedores de Windows. Tiene como objetivo ayudarle a priorizar qué
aplicaciones deben incluirse en contenedores, al explicar consideraciones especiales por
adelantado.

Introducción

Qué son los contenedores de Windows y cuáles no son


El término genérico contenedor hace referencia a una tecnología que virtualiza el
sistema operativo (SO). Esta virtualización proporciona un nivel de aislamiento del
sistema operativo del propio servidor o host, lo que a su vez permite más agilidad para
los desarrolladores de aplicaciones y los equipos de operaciones.

Los contenedores de Windows son una implementación específica de la tecnología de


contenedores. Proporcionan instancias de sistemas operativos virtualizados que están
aislados del sistema operativo Windows. Pero la interdependencia total entre el
contenedor y el host es imposible: un contenedor de Windows debe coordinar su
demanda de recursos y funciones con el sistema operativo Windows. ¿Por qué es
importante? Dado que un contenedor de Windows no es un servidor virtualizado
completo y algunas de las cosas que puede querer hacer con una aplicación no se
pueden hacer solo con un sistema operativo virtualizado.

Puede obtener más información sobre este tema en Contenedores frente a máquinas
virtuales. Pero algunos puntos buenos que le ayudan a recordar la distinción entre el
contenedor y la máquina virtual son:

Los contenedores no son una solución equivalente a la virtualización de


aplicaciones de escritorio. Solo admiten aplicaciones del lado servidor que no
requieren una sesión interactiva. Dado que se ejecutan en imágenes de
contenedor especializadas, solo admiten aquellas aplicaciones que no necesitan un
front-end gráfico.
Los contenedores son efímeros por naturaleza. Esto significa que, de forma
predeterminada, no hay ningún mecanismo para guardar el estado de una
instancia de contenedor. Si se produce un error en una instancia, otra instancia
tendrá su lugar.

La tecnología de contenedores comenzó en Linux, con Docker emergente como


estándar. Microsoft ha trabajado estrechamente con Docker para asegurarse de que la
funcionalidad del contenedor sea la misma en Windows que sea razonablemente
posible. Las diferencias inherentes entre Linux y Windows pueden aparecer de maneras
que parecen ser limitaciones de los contenedores de Windows cuando, de hecho, son
solo las diferencias de Linux frente a Windows. Por otro lado, los contenedores de
Windows proporcionan algunas implementaciones únicas, como Hyper-V aislamiento,
que se tratarán más adelante. Este tema le ayuda a comprender esas diferencias y a
adaptarlas.

Ventajas del uso de contenedores


Al igual que ejecutar varias máquinas virtuales en un único host físico, puede ejecutar
varios contenedores en un único host físico o virtual. Pero a diferencia de las máquinas
virtuales, no es necesario administrar el sistema operativo de un contenedor, lo que le
ofrece la flexibilidad de centrarse en el desarrollo de aplicaciones y la infraestructura
subyacente. También significa que puede aislar una aplicación para que no se vea
afectada por cualquier otro proceso compatible con el sistema operativo.

Los contenedores proporcionan un método ligero para crear y detener dinámicamente


los recursos necesarios para una aplicación en funcionamiento. Aunque es posible crear
e implementar máquinas virtuales a medida que aumenta la demanda de aplicaciones,
es más rápido usar contenedores para el escalado horizontal. Con los contenedores,
también puede reiniciarse rápidamente en caso de bloqueo o interrupción de hardware.
Los contenedores permiten tomar cualquier aplicación de desarrollo a producción con
poco o ningún cambio de código, ya que "contienen" dependencias de aplicación para
que funcionen en entornos. La capacidad de incluir en contenedores una aplicación
existente con cambios mínimos de código, debido a la integración de Docker en las
herramientas de desarrollo de Microsoft, también es un factor eficaz en el desarrollo y el
mantenimiento de aplicaciones.

Por último, una de las ventajas más importantes de usar contenedores es la agilidad que
se obtiene para el desarrollo de aplicaciones, ya que puede tener versiones diferentes
de una aplicación que se ejecuta en el mismo host sin conflictos de recursos.

Puede encontrar una lista más completa de ventajas para usar contenedores para
aplicaciones existentes en la página de documentación de Microsoft .NET.

Concepto importante del nivel de aislamiento


Los contenedores de Windows proporcionan aislamiento del sistema operativo
Windows, aislamiento que es ventajoso al compilar, probar y promover una aplicación a
producción. Pero la manera en que se logra el aislamiento es importante comprender
cuándo está pensando en la contenedorización de una aplicación.

Los contenedores de Windows ofrecen dos modos distintos de aislamiento de tiempo


de ejecución: proceso y Hyper-V. Los contenedores de ambos modos se crean y
administran de forma idéntica y funcionan de forma idéntica. Entonces, ¿cuáles son las
diferencias y por qué debe preocuparse?

En el aislamiento de procesos, varios contenedores se ejecutan simultáneamente en un


único host con aislamiento proporcionado mediante el espacio de nombres, el control
de recursos y otras características. Los contenedores en modo de aislamiento de
proceso comparten el mismo kernel con el host y entre sí. Esto es aproximadamente
igual que la forma en que se ejecutan los contenedores de Linux.

En el aislamiento de Hyper-V, varios contenedores también se ejecutan


simultáneamente en un único host, pero lo hacen dentro de máquinas virtuales
altamente optimizadas, y cada uno de ellos obtiene de forma eficaz su propio kernel. La
presencia de esta máquina virtual, de hecho una máquina virtual de "utilidad",
proporciona aislamiento de nivel de hardware entre cada contenedor y el host de
contenedor.

De alguna manera, el modo de aislamiento de Hyper-V es una especie de híbrido entre


una máquina virtual y un contenedor, lo que proporciona una capa adicional de
seguridad especialmente útil si la aplicación necesita varios inquilinos. Pero las posibles
ventajas del uso del modo de aislamiento de Hyper-V incluyen las siguientes:
Tiempo de inicio más largo para el contenedor y un impacto probable en el
rendimiento general de la aplicación.
No todas las herramientas funcionan de forma nativa con el aislamiento de Hyper-
V.
Ni Azure Kubernetes Service (AKS) ni AKS en Azure Stack HCI admiten el
aislamiento Hyper-V actualmente.

Puede obtener más información sobre cómo se implementan los dos modos de
aislamiento en el tema Modos de aislamiento. Cuando contenerizas una aplicación por
primera vez, deberás elegir entre los dos modos. Afortunadamente, es muy fácil cambiar
de un modo a otro más adelante, ya que no requiere ningún cambio en la aplicación o
en el contenedor. Pero tenga en cuenta que, al incluir una aplicación en contenedores,
elegir entre los dos modos es una de las primeras cosas que tendrá que hacer.

Orquestación de contenedores
La capacidad de ejecutar varios contenedores en un solo host o varios hosts sin
preocuparse por la administración del sistema operativo le ofrece una gran flexibilidad,
lo que le ayuda a avanzar hacia una arquitectura basada en microservicios. Sin embargo,
una compensación por esa flexibilidad es que un entorno basado en contenedores y
microservicios puede expandirse rápidamente en muchas partes móviles, demasiadas
para realizar un seguimiento. Afortunadamente, administrar el equilibrio de carga, la alta
disponibilidad, la programación de contenedores, la administración de recursos y
mucho más, es el rol de un orquestador de contenedores.

Quizás los orquestadores tienen un nombre erróneo; son más como los directores de
una orquesta en el sentido de que coordinan la actividad de varios contenedores para
que la música siga sonando. En cierto sentido, controlan la programación y la asignación
de recursos para los contenedores de forma similar al funcionamiento de un sistema
operativo. Por lo tanto, a medida que pase a incluir en contenedores las aplicaciones,
deberá elegir entre los orquestadores que admiten contenedores de Windows. Algunos
de los más comunes son Kubernetes y Docker Swarm.

Lo que no se puede mover a contenedores de


Windows
Cuando se considera si una aplicación se puede incluir en contenedores o no, es
probable que sea más fácil empezar con la lista de factores que descartan
completamente los contenedores de Windows como una opción.
En la tabla siguiente se resumen los tipos de aplicaciones que no se pueden mover a
contenedores de Windows y por qué no. Las razones se explican más por completo en
las subsecciones después de la tabla. Comprender las razones de estas limitaciones
puede proporcionarle una idea más clara de lo que realmente son los contenedores,
incluido cómo difieren de las máquinas virtuales. Esto, a su vez, te ayudará a evaluar
mejor las funcionalidades de los contenedores de Windows que puedes aprovechar con
las aplicaciones existentes que puedes incluir en contenedores.

Nota: La lista siguiente no es una lista completa. En su lugar, es una compilación de


aplicaciones que los clientes intentan incluir en contenedores, según Microsoft.

ノ Expandir tabla

Aplicaciones o ¿Por qué no es compatible? ¿Puedes solucionar esto?


características no
compatibles

Aplicaciones que Los contenedores no admiten Si la aplicación solo requiere una GUI
requieren un la interfaz gráfica de usuario para instalarla, cambiarla a una
escritorio (GUI) instalación silenciosa podría ser una
solución.

Aplicaciones que RDP es para sesiones Puede usar Windows Admin Center
usan el protocolo de interactivas, por lo que el (WAC) o PowerShell remoto como
escritorio remoto principio anterior también se alternativa para la administración
(RDP) aplica aquí. remota.

Aplicaciones con Los contenedores son Sí, es posible que algunas aplicaciones
estado efímeros requieran un cambio mínimo, por lo que
no almacenan datos ni estado dentro
del contenedor.

Aplicaciones de base Los contenedores son Sí, es posible que algunas aplicaciones
de datos efímeros requieran un cambio mínimo, por lo que
no almacenan datos ni estado dentro
del contenedor.

Active Directory El diseño y el propósito de No. Sin embargo, las aplicaciones que
Active Directory impiden la dependen de Active Directory pueden
ejecución en un contenedor. usar cuentas de servicio administradas
de grupo (gMSA). A continuación se
proporciona más información sobre
gMSA.

Versiones anteriores Solo se admite Windows No. Sin embargo, la compatibilidad de


de Windows Server Server 2016 o posterior aplicaciones podría ser una opción: la
mayoría de windows Server 2008/R2 y
las aplicaciones anteriores se ejecutan
Aplicaciones o ¿Por qué no es compatible? ¿Puedes solucionar esto?
características no
compatibles

en versiones más recientes de Windows


Server

Aplicaciones que Se requieren imágenes de Las versiones anteriores a la versión 2.0


usan .NET Framework contenedor específicas para no se admiten en absoluto, pero
versión 2.0 o anterior admitir .NET Framework y solo consulte a continuación las imágenes de
se admiten versiones más contenedor necesarias para versiones
recientes. posteriores.

Aplicaciones que Microsoft no certifica ni Consulte con el proveedor del marco


usan otros marcos de admite específicamente el uso específico o la aplicación la directiva de
terceros de marcos que no son de soporte técnico para contenedores de
Microsoft en contenedores de Windows. Consulte a continuación para
Windows obtener más información.

Vamos a considerar cada una de estas limitaciones a su vez.

Aplicaciones que requieren un escritorio


Los contenedores son ideales para funciones efímeras que se invocan desde otras
aplicaciones, incluidas las que tienen interacciones del usuario. Pero no se pueden usar
para las aplicaciones que tienen GUIs por sí mismos. Esto es cierto incluso si la propia
aplicación no tiene una GUI, pero tiene un instalador que se basa en una GUI. En
general, Se puede invocar Windows Installer mediante PowerShell, pero si la aplicación
requiere la instalación a través de una GUI, ese requisito lo elimina como candidato para
la inclusión en contenedores.

Esto no es un problema con la forma en que se han implementado los contenedores de


Windows, sino un concepto fundamental de cómo funcionan los contenedores.

Es diferente si una aplicación necesita API de GUI. Se admiten API, aunque no la GUI que
sirven esas API. Esto se explica más detalladamente en el tema Nano Server x Server
Core x Server: ¿Qué imagen base es la adecuada para usted?

Aplicaciones que usan RDP


Dado que todo el propósito del Protocolo de escritorio remoto (RDP) es establecer una
sesión visual interactiva, la limitación de gui descrita también se aplica. Una aplicación
que usa RDP no se puede incluir en contenedores as-is.
Sin embargo, una buena alternativa es una herramienta de administración remota como
Windows Admin Center. Puedes usar Windows Admin Center para administrar hosts de
contenedores de Windows y los contenedores en sí mismos, sin necesidad de usar RDP
en ellos. También puede abrir una sesión remota de PowerShell en el host o
contenedores para administrarlos.

Aplicaciones con estado


Las aplicaciones que necesitan conservar los datos de estado solo se pueden incluir en
contenedores si se aíslan los datos necesarios de una sesión a la siguiente y se
almacenan en el almacenamiento persistente. Esto puede requerir una "rediseño", que
puede ser o no trivial, pero continuar con ella eliminará esta barrera para la
contenedorización.

Un ejemplo de estado es una aplicación web que almacena imágenes o archivos de


música en una carpeta local. En un entorno tradicional de Windows, un archivo se
guarda al disco en el momento en que finaliza la operación de escritura, por lo que si se
produce un fallo en la instancia, en este caso, una máquina virtual, simplemente la
reinicia y el archivo seguirá allí. Por el contrario, si se produce un error en una instancia
de contenedor que realiza una operación de escritura, la nueva instancia de contenedor
no incluirá ese archivo. Por este motivo, debe considerar la posibilidad de usar el
almacenamiento persistente para que todas las instancias de contenedor puedan
almacenar datos de estado o archivos en una ubicación centralizada y duradera. Este
tipo de rediseño no requiere que cambies el código de la aplicación, solo el tipo de
almacenamiento usado por la instancia de Windows. Para obtener más información,
consulte la documentación del contenedor de Windows sobre el almacenamiento.

Sin embargo, esto trae otro tema relacionado...

Aplicaciones de base de datos


Como regla general, las aplicaciones de base de datos no son excelentes candidatas
para la contenedorización. Aunque puede ejecutar una base de datos dentro de un
contenedor, la contenedorización de una base de datos existente no suele ser ideal, por
dos motivos.

En primer lugar, el rendimiento necesario para una base de datos podría requerir todos
los recursos de hardware disponibles para el host, lo que devalora la ventaja de la
consolidación. En segundo lugar, varias instancias de un nivel de base de datos único
necesitan coordinación para sus operaciones de escritura. La orquestación de
contenedores puede resolverlo, pero para las bases de datos existentes, la orquestación
puede convertirse en una sobrecarga. La mayoría de las bases de datos, como Microsoft
SQL Server, tienen un equilibrio de carga integrado y un mecanismo de alta
disponibilidad.

Roles de infraestructura en Windows Server


Los roles de infraestructura de Windows Server controlan principalmente las funciones
más cercanas al sistema operativo (por ejemplo, AD, DHCP y Servidor de archivos). Por
tanto, no están disponibles para ejecutar contenedores. Por lo tanto, las aplicaciones
que necesitan estos roles siempre serán difíciles de incluir en contenedores.

Hay algunas áreas grises. Por ejemplo, algunas características como DNS pueden
funcionar en contenedores de Windows aunque realmente no estén diseñadas para
usarse en contenedores. Otros roles de infraestructura simplemente se quitan de la
imagen de contenedor base y no se pueden instalar, como Active Directory, DHCP y
otros.

Active Directory (AD)


Active Directory se lanzó hace más de veinte años a lo largo de Windows 2000 Server.
Usa un mecanismo en el que cada dispositivo o usuario está representado por un objeto
almacenado en su base de datos. Esta relación está estrechamente acoplada y los
objetos se mantienen en la base de datos incluso si el usuario o el dispositivo reales ya
no están en juego. Ese enfoque para Active Directory contradiga directamente la
naturaleza efímera de los contenedores, que se espera que sean de corta duración o se
eliminen cuando se desactiven. Mantener esta relación uno a uno con Active Directory
no es ideal para esos escenarios.

Por ese motivo, los contenedores de Windows no pueden estar unidos a un dominio.
Como efecto, no se puede ejecutar Active Directory Domain Services como rol de
infraestructura en contenedores de Windows. Puede ejecutar el módulo de PowerShell
para administrar controladores de dominio de forma remota dentro de un contenedor
de Windows.

En el caso de las aplicaciones que se ejecutan en contenedores de Windows


dependientes de Active Directory, use cuentas de servicio administradas de grupo
(gMSA), que se explicarán más adelante.

Aplicaciones que usan .NET Framework versión 2.0 o


anterior
Si la aplicación requiere .NET, la capacidad de incluir en contenedores depende
completamente de la versión de .NET Framework que usa. No se admite ninguna
versión anterior a .NET Framework 2.0; las versiones posteriores requieren el uso de
imágenes específicas, como se describe más adelante.

Aplicaciones que usan marcos de terceros (que no son de


Microsoft)
Por lo general, Microsoft no puede certificar plataformas o aplicaciones de terceros, ni
admitir su ejecución en contenedores de Windows, o máquinas físicas y virtuales para el
caso. Sin embargo, Microsoft realiza sus propias pruebas internas para la facilidad de
uso de varios marcos y herramientas de terceros, como Apache, Cassandra, Chocolatey,
Datadog, Django, Flask, Git, Golang, JBoss, Jenkins, Rust, Nodejs, Pearl, Python, Ruby,
Tomcat y muchos otros.

Para cualquier marco o software de terceros, valide su compatibilidad en contenedores


de Windows con el proveedor que lo proporciona.

Candidatos ideales para la contenedorización


Ahora que hemos considerado las limitaciones difíciles de incluir aplicaciones en
contenedores, es más fácil ver qué tipos de aplicaciones se prestan más fácilmente a los
contenedores de Windows. Los candidatos ideales para los contenedores de Windows y
las consideraciones especiales para incluirlos en contenedores se encuentran en la tabla
siguiente.

ノ Expandir tabla

Tipo de ¿Por qué son buenos candidatos? Consideraciones especiales


aplicación

Aplicaciones de Sin limitaciones de GUI, las Use la imagen de contenedor base


consola aplicaciones de consola son adecuada en función de las
candidatas ideales para necesidades de la aplicación.
contenedores.

Servicios de Dado que se trata de procesos en Use la imagen de contenedor base


Windows segundo plano que no requieren adecuada en función de las
ninguna interacción directa del necesidades de la aplicación. Debe
usuario crear un proceso en primer plano para
mantener funcionando cualquier
proceso en segundo plano
containerizado. Consulte la sección
Tipo de ¿Por qué son buenos candidatos? Consideraciones especiales
aplicación

sobre los servicios en segundo plano a


continuación.

Servicios de Dado que son aplicaciones Use la imagen de contenedor base


Windows orientadas al servicio que también adecuada en función de las
Communication se ejecutan en segundo plano necesidades de la aplicación. Es
Foundation (WCF) posible que tenga que crear un
proceso en primer plano para
mantener en ejecución cualquier
proceso en segundo plano en
contenedor. Consulte la sección sobre
los servicios en segundo plano a
continuación.

Aplicaciones web Las aplicaciones web son Use la imagen de contenedor base
esencialmente servicios en adecuada en función de las
segundo plano que escuchan en necesidades de la aplicación.
un puerto específico y, por tanto,
son excelentes candidatos para la
contenedorización, ya que
aprovechan la escalabilidad que
ofrecen los contenedores.

Nota: incluso estos candidatos ideales para la contenedorización pueden depender


de las características y componentes principales de Windows que deban controlarse
de forma diferente en contenedores de Windows. La siguiente sección, que incluye
más detalles sobre estas consideraciones prácticas, le preparará mejor para
aprovechar la funcionalidad de los contenedores de Windows.

Consideraciones prácticas para las aplicaciones


que se pueden incluir en contenedores
Normalmente, los proyectos de renovación de aplicaciones tienen en cuenta si una
aplicación determinada se puede incluir en contenedores a través de la perspectiva de la
función empresarial de la aplicación. Pero la funcionalidad empresarial no es el factor
que determina si técnicamente es posible. Lo que es importante es la arquitectura de la
aplicación, es decir, qué componentes técnicos se basan. Por lo tanto, no hay respuesta
fácil a una pregunta como "¿Puedo incluir en contenedores mi aplicación de RR. HH?",
porque no es lo que hace la aplicación, es cómo (y qué componentes o servicios de
Windows usa) que marca la diferencia.
Se trata de una distinción importante, ya que si tu aplicación no se construyó con una
arquitectura de microservicios desde el principio, es probable que sea más difícil
containerizarla. A medida que lleve a cabo la inclusión en contenedores, es posible que
ciertas características necesiten una administración especial. Algunos pueden deberse al
uso de la aplicación de componentes y marcos principales de Windows que no se
admiten en contenedores de Windows. Otros, como el registro de eventos y la
supervisión, se deben a diferencias inherentes entre Linux y Windows que se vuelven
aparentes solo cuando se incluye la aplicación en contenedores. Otros, como las tareas
programadas y los servicios en segundo plano, deben entenderse desde la perspectiva
de que un contenedor no es una máquina virtual, pero es efímero y, por lo tanto,
necesita un control especial.

En la tabla siguiente se presenta un resumen rápido de los componentes o


características de las aplicaciones que necesitan una consideración especial al pensar en
la contenedorización. Las subsecciones siguientes proporcionan más detalles, incluidos
ejemplos que muestran técnicas para controlar cada escenario. Aunque en la lista
siguiente se describen los escenarios que se admiten en contenedores de Windows,
estos escenarios siguen teniendo que respetar las instrucciones del capítulo anterior. Por
ejemplo, aunque se admiten servicios en segundo plano, no se admite la ejecución de
un servicio en segundo plano en .NET Framework 1.1.

ノ Expandir tabla

Características o Razón
componentes de Windows
que requieren un control
especial

Microsoft Messaging MSMQ se originó mucho antes de que los contenedores y no


Queueing (MSMQ) todos sus modelos de implementación para las colas de
mensajes sean compatibles con la arquitectura de contenedor.

Coordinador de transacciones La resolución de nombres entre MSDTC y el contenedor necesita


distribuidas de Microsoft una consideración especial.
(MSDTC)

IIS IIS es el mismo que en una máquina virtual, pero hay


consideraciones importantes al ejecutarlo en un entorno de
contenedor, como la administración de certificados, las cadenas
de conexión de base de datos, etc.

Tareas programadas Los contenedores de Windows pueden ejecutar tareas


programadas, al igual que cualquier instancia de Windows. Sin
embargo, es posible que tenga que ejecutar una tarea en primer
plano para mantener la instancia de contenedor en ejecución. En
Características o Razón
componentes de Windows
que requieren un control
especial

función de la aplicación, es posible que desee considerar un


enfoque controlado por eventos.

Servicios en segundo plano Como los contenedores se ejecutan como procesos efímeros,
necesitará un control adicional para mantener el contenedor en
ejecución.

.NET Framework y .NET Asegúrese de usar la imagen correcta para garantizar la


(anteriormente .Net Core) compatibilidad, como se explica en la subsección siguiente.

Otros componentes auxiliares

ノ Expandir tabla

Componente que Razón Enfoque alternativo


requiere un
control especial

Registro y Dado que la forma en que Use la nueva herramienta Log


supervisión de Windows escribe eventos y Monitor para normalizar los datos y
eventos registros es inherentemente combinarlos desde Linux y Windows.
diferente de Stdout de Linux

Seguridad de Aunque muchas prácticas de Empleo de una herramienta de


contenedores de seguridad siguen siendo las análisis de imágenes y registro
Windows mismas, los contenedores diseñada específicamente: más
requieren medidas de seguridad detalles más adelante.
adicionales.

Copia de seguridad Los contenedores no deben tener Realice una copia de seguridad de
de contenedores datos ni estado cualquier almacenamiento
de Windows persistente que usen los
contenedores, así como las imágenes
de contenedor.

Componentes y características de Windows


Ahora vamos a profundizar en los detalles de las aplicaciones y componentes que se
pueden incluir en contenedores, pero que requieren un control adicional.

MSMQ
Si la aplicación depende de MSMQ, si puede incluirla en contenedores depende de su
escenario de implementación de MSMQ. MSMQ incluye varias opciones de
implementación. Los factores de colas privadas frente a públicas, transaccionales o no, y
el tipo de autenticación forman una matriz de escenarios que MSMQ se diseñó
originalmente para admitir. No todos estos se pueden mover fácilmente a contenedores
de Windows. En la tabla siguiente se enumeran los escenarios admitidos:

ノ Expandir tabla

Alcance ¿Transaccional? Ubicación de la cola Tipo de ¿Enviar y


autenticación recibir?

Privado Sí Mismo contenedor Anónimo Sí


(contenedor único)

Privado Sí Volumen persistente Anónimo Sí

Privado Sí Controlador de dominio Anónimo Sí

Privado Sí Host único (dos Anónimo Sí


contenedores)

Público No Dos anfitriones Anónimo Sí

Público Sí Dos anfitriones Anónimo Sí

Algunas notas sobre estos escenarios admitidos, que han sido validados por los equipos
de desarrollo internos de Microsoft:

Modo de aislamiento: Tanto el modo de proceso como el modo Hyper-V


funcionan para el aislamiento en los escenarios enumerados anteriormente.
Imagen mínima del sistema operativo y del contenedor: la versión mínima del
sistema operativo recomendada para usar con MSMQ es Windows Server 2019.
Volúmenes persistentes: los escenarios anteriores se validaron ejecutando MSMQ
en Azure Kubernetes Service (AKS) mediante Azure Files para el almacenamiento
persistente.

Cuando se colocan estas consideraciones junto con la tabla anterior, puede ver que el
único escenario que no se admite es para las colas que requieren autenticación con
Active Directory. La integración de gMSA (cuentas de servicio administradas de grupo)
con MSMQ no se admite actualmente, ya que MSMQ tiene dependencias en Active
Directory que aún no están en vigor.

Como alternativa, use Azure Service Bus en lugar de MSMQ. Azure Service Bus es un
agente de mensajes empresarial totalmente administrado con colas de mensajes y
temas de publicación y suscripción (en un espacio de nombres). El cambio de MSMQ a
Azure Service Bus requiere cambios de código y la nueva arquitectura de la aplicación,
pero le proporcionará la agilidad para pasar a una plataforma moderna.

MSDTC

El Coordinador de transacciones distribuidas de Microsoft (MSDTC) se usa en gran


medida en aplicaciones heredadas de Windows entre grandes empresas. MSDTC se
puede instalar en contenedores de Windows, pero hay ciertos escenarios que no
funcionan y no se pueden reproducir en contenedores de Windows.

Al crear el contenedor, asegúrese de pasar el parámetro --name al comando


docker run. Este parámetro name es lo que permite a los contenedores
comunicarse a través de la red de Docker. Si usa gMSA, el nombre debe coincidir
con el nombre de host que debe coincidir con el nombre de la cuenta de gMSA.
Este es un ejemplo del comando run con gMSA:

PowerShell

docker run -d --security-opt "credentialspec=file://contoso_webapp01.json" -


-hostname webapp01 -- name webapp01
mcr.microsoft.com/windows/servercore:ltsc2022

Los contenedores se deben poder resolver entre sí mediante el nombre NETBIOS.


Si hay alguna dificultad con esto, la mejor manera de resolver es agregar el
nombre y la dirección IP de los contenedores a los archivos host entre sí.
El uuid para msdtc en ambos contenedores debe ser único. El UUID se puede
encontrar ejecutando "Get-Dtc" en el PowerShell dentro de los contenedores. Si no
son únicos, una manera de resolver es desinstalar y reinstalar msdtc en uno de los
contenedores. Se pueden usar estos comandos de PowerShell: "uninstall-dtc",
"install-dtc".
Actualmente, MSDTC no se admite en Azure Kubernetes Services. Si tiene una
necesidad específica de ejecutar MSDTC en AKS, informe al equipo de
contenedores de Windows abriendo el problema en el repositorio de
contenedores de Windows en GitHub.

Funcionamiento de IIS en un contenedor frente a una máquina


virtual
IIS funciona igual en un contenedor de Windows que en una máquina virtual. Sin
embargo, hay algunos aspectos de la ejecución de una instancia de IIS que se deben
tener en cuenta al ejecutarse en un entorno de contenedor:
Almacenamiento persistente para datos locales: carpetas en las que la aplicación
escribe o lee archivos hacia o desde son un excelente ejemplo de algo que se
mantendría en una máquina virtual para una instancia de IIS. Con los
contenedores, no quieres que ningún dato se escriba directamente en el
contenedor. Los contenedores usan un "espacio temporal" para el almacenamiento
local y cuando aparece un nuevo contenedor para la misma aplicación, no tiene
acceso a esa área desde un contenedor anterior. Por ese motivo, use el
almacenamiento persistente para los datos que deben ser accesibles para la
aplicación web, de modo que cualquier instancia de contenedor pueda tener
acceso a ese almacenamiento.
Certificados: aunque puede tener certificados locales en instancias de contenedor,
evite hacerlo, ya que si es necesario actualizar un certificado, debe volver a generar
la imagen de contenedor. Como alternativa, puede usar un orquestador de
contenedores con control de entrada. Los controladores de ingreso pueden aplicar
políticas de red y también gestionar el manejo de certificados para el sitio web
alojado detrás de ellos. La ventaja es desacoplar la administración del ciclo de vida
de los certificados de la administración del sitio web.
Cadenas de conexión de base de datos: para la implementación tradicional de IIS,
puede pasar la cadena de conexión de base de datos como parte de la
implementación de la aplicación. Aunque los contenedores de Windows permiten
seguir ese modelo, es posible que quiera considerar la posibilidad de desacoplar la
cadena de conexión de base de datos del contenedor a una configuración
centralizada proporcionada por el orquestador de contenedores, desde la que la
aplicación puede leer. Esto le permite administrar y actualizar la cadena de
conexión de base de datos independientemente de la aplicación. Si la base de
datos cambia (para casos de "Lift and Shift" a la nube, por ejemplo), puede
cambiar fácilmente la cadena de conexión sin volver a generar la imagen del
contenedor. Este enfoque también permite mantener secretos (como el nombre de
usuario y la contraseña para conectarse a la base de datos) en un almacén de
secretos.
Escalado automático horizontal: cuando aumenta la carga, los sistemas de proceso
tienden a ralentizar el rendimiento percibido al intentar procesar las solicitudes
simultáneas. Por lo general, hay dos maneras de evitar el impacto en el
rendimiento: escala vertical o horizontal. La escala vertical aumenta los recursos
disponibles para las instancias de proceso existentes (más CPU, memoria, etc.). La
escala horizontal aumenta el número de instancias que admiten las solicitudes
(más hosts físicos, máquinas virtuales o contenedores). En el caso de los niveles
web como IIS, la escala horizontal tiende a ser más eficaz que la vertical, pero los
entornos locales pueden encontrar limitaciones de recursos y problemas de
equilibrio de carga. Con los entornos de nube, la escala horizontal es mucho más
fácil, ya que los recursos están disponibles (por un costo adicional) y el proveedor
de nube normalmente diseña su mecanismo de equilibrio de carga teniendo en
cuenta la escala horizontal. Los contenedores de Windows pueden aprovechar la
escala horizontal para IIS, pero el aspecto efímero de los contenedores desempeña
un papel importante. Es imperativo que los contenedores tengan la misma
configuración y que no se almacene ningún estado o datos para permitir el
escalado o reducción vertical del número de instancias que admiten la aplicación
web.

Tareas programadas

Las tareas programadas se usan para llamar a un programa, servicio o script en


cualquier momento en un entorno de Windows. Tradicionalmente, usted tiene una
instancia de Windows en funcionamiento en todo momento y cuando se cumple una
condición, se ejecuta la tarea. Esto es posible con contenedores de Windows y, aparte
del hecho de que necesita configurar y administrar tareas programadas a través de
Azure PowerShell, funcionan exactamente igual.

Sin embargo, con un enfoque de microservicios, tiene algunas opciones para evitar
mantener un contenedor en ejecución a la espera de un desencadenante:

Use un PaaS basado en eventos (plataforma como servicio), como Azure Functions,
para almacenar el código y definir un desencadenador para esa aplicación.
Azure Functions admite incluso la ejecución de imágenes de contenedor de
Windows cuando se encuentra un desencadenador.
Use contenedores de Windows junto con un orquestador de contenedores. El
contenedor solo se puede ejecutar cuando se encuentra el desencadenador y se
llama desde otras partes de la aplicación. En este caso, el orquestador de
contenedores controlará la programación y el desencadenador de la aplicación.
Por último, mantenga un contenedor de Windows en ejecución para ejecutar una
tarea programada. Necesitará un servicio en primer plano (como Service Monitor)
para mantener el contenedor en ejecución.

Servicios en segundo plano


Aunque los contenedores suelen ser para procesos efímeros, puede contenerizar una
aplicación en segundo plano y de larga duración, siempre que cree un proceso en
primer plano para lanzarla y mantenerla en ejecución.

Un buen ejemplo de esto es ServiceMonitor, que es un ejecutable de Windows diseñado


para usarse como un proceso de punto de entrada al ejecutar IIS en contenedores.
Aunque se creó para IIS, la herramienta ServiceMonitor ofrece un modelo que también
se puede usar para supervisar otros servicios, con algunas limitaciones.
Para más información sobre ServiceMonitor, consulte la documentación de en Github .

.NET Framework y .NET


Los contenedores de Windows admiten .NET Framework y .NET (anteriormente, .NET
Core). El equipo de .NET crea sus propias imágenes oficiales para ambos frameworks a
partir de las imágenes base del contenedor de Windows. Elegir la imagen adecuada es
fundamental para garantizar la compatibilidad. El equipo de .NET proporciona imágenes
de .NET Framework sobre la imagen de contenedor base de Server Core e imágenes de
.NET sobre las imágenes de contenedor base de Server Core y Nano Server. Server Core
tiene un conjunto de API mayor que Nano Server, lo que permite una mayor
compatibilidad, pero también un tamaño de imagen mayor. Nano Server tiene una
superficie de API muy reducida, pero un tamaño de imagen mucho menor.

En algunos casos, es posible que tenga que crear una imagen propia de .NET Framework
o .NET sobre las imágenes de contenedor base de Server o Windows. Esto puede ser
necesario si la aplicación no solo tiene una dependencia de marco, sino una
dependencia del sistema operativo. Podrá detectar estas dependencias probando la
aplicación con una imagen de contenedor base determinada.

Por ejemplo, las imágenes de contenedor base de Server Core y Nano Server solo tienen
un tipo de letra disponible con el fin de reducir el tamaño de la imagen. Si la aplicación
necesita otra fuente, tendrá que instalar esa fuente o usar las imágenes de Server o
Windows, que tienen un conjunto de API más grande e incluyen todas las fuentes
predeterminadas de Windows. Desde el punto de vista de la compatibilidad, esto
permite que prácticamente cualquier aplicación (siempre que respete la naturaleza de
los contenedores, como la ausencia de interfaz gráfica) se pueda contenerizar. Sin
embargo, serán mucho más grandes, lo que puede afectar el rendimiento.

Al validar si la aplicación que se va a incluir en contenedores funciona en contenedores


de Windows, Microsoft recomienda lo siguiente:

ノ Expandir tabla

Para este marco Prueba con esta Recurre a esta imagen de Imagen base
imagen de contenedor si la primera no
contenedor primero funciona

Versiones 2.X y .NET Framework 4.x .NET Framework 3.5 Windows


3.X de .NET Server Core
Framework

Versiones de .NET Framework 4.x Compilación de la imagen de Windows


.NET Framework contenedor de .NET Framework Server Core
Para este marco Prueba con esta Recurre a esta imagen de Imagen base
imagen de contenedor si la primera no
contenedor primero funciona

4.x con imágenes de Server o


Windows

.NET 6 o 7 .NET 6 o 7 Construye tu imagen de Windows


respectivamente contenedor de .NET con Nano Server o
imágenes base de Windows o Server Core
servidor.

Otros componentes auxiliares


Los componentes y temas siguientes proporcionan instrucciones adicionales para los
elementos que van junto a o que proporcionan una mayor claridad en los contenedores
de Windows.

Registro de eventos

Windows y Linux usan diferentes métodos para almacenar y presentar registros y


eventos a sus usuarios. Tradicionalmente, Windows ha usado el formato EVT, que se
puede ver de forma estructurada en el Visor de eventos. Linux, por el contrario, ha
proporcionado un enfoque simplificado con la salida estándar (stdout) en la que se
basan otras herramientas, como Docker.

Docker siempre ha tenido un mecanismo para extraer registros de contenedores de


Linux. Con el comando "docker logs" con una configuración predeterminada de stdout,
Docker cierra los registros de la aplicación del contenedor sin abrir el contenedor de
forma interactiva. Sin embargo, hasta el lanzamiento de la herramienta Monitor de
registro, la misma técnica no funcionó en Windows.

La herramienta Monitor de registro presenta los registros de Windows en el formato


stdout para que otras herramientas, como Docker, puedan recopilar la información
necesaria para mostrarla. Entre las ventajas adicionales para usar el Monitor de registro
se incluyen las siguientes:

Poder filtrar qué tipos de eventos o registros desea exponer en stdout. Por
ejemplo, puede filtrar el registro de la aplicación por mensajes de "error" y
"advertencia" solo si no le interesan los eventos de "información".
La capacidad de elegir entre registros de eventos, archivos de registro
personalizados o seguimiento de eventos para Windows (ETW). Esto resulta
especialmente útil si la aplicación está escribiendo en un origen de registro
diferente. Un ejemplo de esto es los registros de IIS ubicados en la carpeta
"C:\inetpub".
El hecho de que Log Monitor hace que los contenedores de Windows se
comporten de manera muy similar a los contenedores de Linux permite que las
herramientas que buscan stdout e interactúan con el entorno de ejecución del
contenedor funcionen según lo esperado. Por ejemplo, si se mueve de Docker a
ContainerD como entorno de ejecución de contenedores, los logs deberían seguir
siendo visibles desde el host del contenedor a través de (por ejemplo) "crictl logs".

Puede obtener más información sobre la herramienta Monitor de registros en esta


entrada de blog .

Seguridad de contenedores de Windows


Los contenedores de Windows se basan en la misma base que las instancias de
Windows que se ejecutan en máquinas físicas o virtuales. Comprender los detalles de
cómo se implementan los contenedores, especialmente su naturaleza de kernel
compartido, le ayuda a proteger una aplicación en contenedor:

Componentes compartidos. Los contenedores de Windows comparten algunos de


los componentes del host con fines de seguridad. Esto incluye el Firewall de
Windows, Windows Defender (Antivirus) y otras limitaciones de acceso a recursos.
No es necesario configurar estos componentes en el contenedor directamente
porque el host del contenedor realiza los ajustes necesarios en función de la carga
de trabajo del contenedor. Por ejemplo, si el contenedor realiza una solicitud web,
el host del contenedor reenvía el tráfico necesario a través de su firewall para que
el contenedor pueda acceder a la web.
Modo de aislamiento. Como se explicó, los contenedores de Windows se pueden
implementar en modo de aislamiento de procesos o modo de aislamiento de
Hyper-V, con Hyper-V proporcionando el aislamiento más seguro. En aislamiento
de procesos, el contenedor comparte su kernel, sistema de archivos y registro con
el host, lo que permite que un proceso elevado (administrador) interactúe con los
procesos y servicios del contenedor. Es importante elegir el modo de aislamiento
correcto para la aplicación para garantizar el modelo de seguridad adecuado.
Actualizaciones de Windows. Como la pila de mantenimiento no está presente en
contenedores de Windows, los contenedores de Windows no reciben
actualizaciones como las instancias generales de Windows. En su lugar, debe
reconstruir los contenedores de Windows utilizando la imagen de contenedor base
disponible más reciente. Los clientes pueden aprovechar las canalizaciones de
DevOps para ese propósito. Microsoft actualiza las imágenes de contenedor base
para todas sus imágenes oficiales mensualmente siguiendo la cadencia de Patch
Tuesday.
Cuenta de usuario de contenedor. De forma predeterminada, las aplicaciones
dentro de contenedores de Windows se ejecutan con privilegios elevados en la
cuenta de usuario ContainerAdmin. Esto resulta útil para instalar y configurar los
componentes necesarios dentro de la imagen de contenedor. Sin embargo, debe
considerar la posibilidad de cambiar la cuenta de usuario a ContainerUser al
ejecutar una aplicación que no requiera los privilegios elevados. En escenarios
específicos, también puede crear una cuenta con los privilegios adecuados.
Examen de imágenes y runtime. Los contenedores necesitan que las imágenes de
los repositorios y las instancias de contenedores sean seguras. Microsoft
recomienda usar Microsoft Defender para contenedores para el examen de
imágenes y el examen en tiempo de ejecución. Defender for Containers admite
contenedores de Windows para la evaluación de vulnerabilidades con el examen
del registro y la protección en tiempo de ejecución con detección de amenazas.

Puede encontrar más información sobre los temas anteriores en la página de


documentación de contenedores de Windows .

Copia de seguridad de contenedores de Windows

Debe pensar en las copias de seguridad de forma diferente al usar contenedores. Como
se explicó anteriormente, un contenedor no debe usarse para almacenar el estado ni los
datos dada su naturaleza efímera. Si separa el estado y los datos de la instancia de
contenedor, los problemas de copia de seguridad están fuera del entorno de ejecución
de la instancia de contenedor, que se puede reemplazar por uno nuevo al que seguirá
estando disponible todo el almacenamiento persistente necesario.

Todavía hay componentes que usted es responsable de realizar copias de seguridad, sin
embargo; incluida la aplicación, la imagen de contenedor y el dockerfile que compila la
imagen de contenedor. La mayoría de estas operaciones se controlan mediante la
plataforma en la que se ejecutan las cargas de trabajo de producción y desarrollo. Al
adoptar un enfoque de DevOps, tenga en cuenta los casos más comunes:

Aplicación: la aplicación probablemente reside en un repositorio de origen, como


GitHub o Azure DevOps. Estos repositorios proporcionan control de versiones, lo
que permite volver a una versión específica de la aplicación. Si posee el repositorio
de origen, asegúrese de seguir sus recomendaciones de copia de seguridad y
administración.
Imagen de contenedor: para entornos de producción, la imagen de contenedor
debe residir en un repositorio de imágenes centralizado, como Azure Container
Registry (ACR). Puede insertar las imágenes de contenedor en ACR para que estén
disponible y otros hosts puedan extraerlas. ACR controla la disponibilidad de las
imágenes de contenedor y actúa como opción de copia de seguridad; sin
embargo, tenga en cuenta que, aunque ACR controla la disponibilidad de la
imagen, no impide que se elimine o sobrescriba una imagen. Para cualquier otro
repositorio de imágenes local o en las instalaciones, siga la recomendación del
proveedor para hacer copias de seguridad de los registros existentes.
Dockerfile: Dockerfiles compila nuevas imágenes de contenedor y normalmente se
almacenan junto con el origen de la aplicación. Dado que es posible que el
dockerfile no se haya creado con la aplicación, especialmente si se trata de una
aplicación existente que se está contenedorizando, usted es responsable de
garantizar que el dockerfile se almacene en una ubicación segura y respaldada.
También debe asegurarse de que se realice una copia de seguridad de los demás
recursos necesarios para que la aplicación funcione en un contenedor; por
ejemplo: los archivos YAML y JSON para Kubernetes, Docker Swarm y las plantillas
de Azure ARM siguen las mismas directrices que anteriormente.

Planificación del proceso de migrar mediante


lift-and-shift
Después de evaluar la preparación de la aplicación para la contenedorización, use las
siguientes instrucciones generales para planear el proceso:

1. Determine la imagen base del sistema operativo Windows que necesita: windows
Server Core , Nano Server , Windows o Server imágenes.
2. Determine el tipo de modo de aislamiento para el contenedor: elija entre los
modos de proceso o de aislamiento Hyper-V. Nota: Actualmente, AKS y AKS en
Azure Stack HCI solo admiten contenedores aislados de procesos. En una versión
futura, AKS y AKS en Azure Stack HCI también admitirán contenedores aislados de
Hyper-V. Para obtener más información, vea Modos de aislamiento.
3. Elija la versión correcta de Windows Server para la aplicación con fines de
compatibilidad de la aplicación. La versión mínima de Windows Server para
contenedores es Windows Server 2016, pero Windows Server 2019 y Windows
Server 2022 son los únicos sistemas operativos host de contenedor compatibles
con AKS y AKS en Azure Stack HCI.
4. Asegúrese de que las directivas de seguridad de la empresa están en vigor para el
entorno de contenedor. Esto incluye la adaptación a requisitos específicos del
contenedor, como el examen del registro y la detección de amenazas.
5. Considere las necesidades de equilibrio de carga. Los contenedores no se mueven;
Puede usar un orquestador en su lugar para iniciar o detener automáticamente los
contenedores en los nodos del clúster, o para administrar los cambios de carga y
disponibilidad con escala horizontal automática.
6. Considere las necesidades de orquestación. Una vez en contenedores, es probable
que la aplicación necesite administración automatizada disponible con
herramientas como Kubernetes, AKS o AKS en Azure Stack HCI. Vea Información
general sobre la orquestación de contenedores de Windows para obtener una
explicación completa y una guía para elegir entre las herramientas.
7. Incluya la aplicación en contenedores.
8. Inserte la aplicación en un repositorio de imágenes. Esto permitirá que los hosts de
contenedor descarguen la imagen en cualquier entorno, incluido el desarrollo, la
prueba y la producción.

Azure Migrate puede proporcionar un proceso guiado para detectar, evaluar y migrar la
aplicación de Windows existente a Azure Kubernetes Service. Para más información,
consulte la página de documentación de Azure Migrate.

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Dockerfile en Windows
Artículo • 05/02/2025

El motor de Docker incluye herramientas que automatizan la creación de imágenes de


contenedor. Aunque puede crear imágenes de contenedor manualmente mediante la
ejecución del comando docker commit , la adopción de un proceso de creación de
imágenes automatizada tiene muchas ventajas, entre las que se incluyen:

Almacenamiento de imágenes de contenedor como código.


Recreación rápida y precisa de imágenes de contenedor con fines de
mantenimiento y actualización.
Integración continua entre imágenes de contenedor y el ciclo de desarrollo.

Los componentes de Docker que controlan esta automatización son dockerfile y el


comando docker build .

Dockerfile es un archivo de texto que contiene las instrucciones necesarias para crear
una nueva imagen de contenedor. Estas instrucciones incluyen la identificación de una
imagen existente que se usará como base, los comandos que se ejecutarán durante el
proceso de creación de imágenes y un comando que se ejecutará cuando se
implementen nuevas instancias de la imagen de contenedor.

Docker build es el comando del motor de Docker que consume un Dockerfile y


desencadena el proceso de creación de una imagen.

En este tema se muestra cómo usar Dockerfiles con contenedores de Windows,


comprender su sintaxis básica y cuáles son las instrucciones de Dockerfile más comunes.

En este documento se describe el concepto de imágenes de contenedor y capas de


imagen de contenedor. Si quiere obtener más información sobre imágenes y capas de
imágenes, veaImágenes base de contenedores.

Para tener una visión completa de los Dockerfiles, vea Referencia de Dockerfile .

Sintaxis básica
En su forma más básica, un Dockerfile puede ser muy sencillo. En el ejemplo siguiente se
crea una nueva imagen, que incluye IIS y un sitio "hola mundo". En este ejemplo se
incluyen comentarios (indicados con un # ), que explican cada paso. En las secciones
posteriores de este artículo se detallarán las reglas de sintaxis de Dockerfile y las
instrucciones de Dockerfile.
7 Nota

Se debe crear un Dockerfile sin extensión. Para ello en Windows, cree el archivo con
el editor que prefiera y guárdelo con la notación "Dockerfile" (incluidas las
comillas).

Dockerfile

# Sample Dockerfile

# Indicates that the windowsservercore image will be used as the base image.
FROM mcr.microsoft.com/windows/servercore:ltsc2019

# Metadata indicating an image maintainer.


LABEL maintainer="[email protected]"

# Uses dism.exe to install the IIS role.


RUN dism.exe /online /enable-feature /all /featurename:iis-webserver
/NoRestart

# Creates an HTML file and adds content to this file.


RUN echo "Hello World - Dockerfile" > c:\inetpub\wwwroot\index.html

# Sets a command or process that will run each time a container is run from
the new image.
CMD [ "cmd" ]

A fin de obtener ejemplos adicionales de Dockerfiles para Windows, vea el repositorio


de Dockerfile para Windows .

Instrucciones
Las instrucciones de Dockerfile proporcionan al motor de Docker las instrucciones que
necesita para crear una imagen de contenedor. Estas instrucciones se realizan uno a uno
y en orden. Los ejemplos siguientes son las instrucciones más usadas en Dockerfiles.
Para obtener una lista completa de las instrucciones de Dockerfile, consulte la referencia
de Dockerfile .

FROM
La FROM instrucción establece la imagen de contenedor que se usará durante el nuevo
proceso de creación de imágenes. Por ejemplo, cuando se usa la instrucción FROM
mcr.microsoft.com/windows/servercore , la imagen resultante se deriva de y tiene una

dependencia de , la imagen del sistema operativo base de Windows Server Core. Si la


imagen especificada no está presente en el sistema donde se ejecuta el proceso de
compilación de Docker, el motor de Docker intentará descargar la imagen de un registro
de imágenes público o privado.

El formato de la instrucción FROM es similar al siguiente:

Dockerfile

FROM <image>

Este es un ejemplo del comando FROM:

Para descargar la versión ltsc2019 de Windows Server Core desde Microsoft Container
Registry (MCR):

FROM mcr.microsoft.com/windows/servercore:ltsc2019

Para más información, vea la referencia de FROM .

RUN
La instrucción RUN especifica los comandos que se van a ejecutar y que se capturarán en
la nueva imagen del contenedor. Estos comandos pueden incluir elementos como
instalar software, crear archivos y directorios y crear la configuración del entorno.

La instrucción RUN es similar a la siguiente:

Dockerfile

# exec form

RUN ["<executable>", "<param 1>", "<param 2>"]

# shell form

RUN <command>

La diferencia entre el formulario exec y shell es en cómo se ejecuta la instrucción RUN . Al


usar el formulario exec, el programa especificado se ejecuta explícitamente.

Este es un ejemplo del formulario exec:


FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN ["powershell", "New-Item", "c:/test"]

La imagen resultante ejecuta el comando powershell New-Item c:/test :

Dockerfile

docker history doc-exe-method

IMAGE CREATED CREATED BY SIZE


COMMENT
b3452b13e472 2 minutes ago powershell New-Item c:/test 30.76
MB

Por el contrario, en el ejemplo siguiente se ejecuta la misma operación en formato de


shell:

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell New-Item c:\test

La imagen resultante tiene una instrucción de ejecución de cmd /S /C powershell New-


Item c:\test .

Dockerfile

docker history doc-shell-method

IMAGE CREATED CREATED BY


SIZE COMMENT
062a543374fc 19 seconds ago cmd /S /C powershell New-Item
c:\test 30.76 MB

Consideraciones para usar RUN con Windows


En Windows, al usar la instrucción RUN con el formato exec, se debe aplicar escape a las
barras diagonales.

Dockerfile

RUN ["powershell", "New-Item", "c:\\test"]


Cuando el programa de destino sea un instalador de Windows, deberá extraer la
configuración a través de la marca /x:<directory> para poder iniciar el procedimiento
de instalación real (silencioso). También debe esperar a que el comando termine antes
de realizar cualquier otra operación. De lo contrario, el proceso finalizará
prematuramente sin instalar nada. Para obtener más información, consulte el ejemplo
siguiente.

Ejemplos de uso de RUN con Windows


En el ejemplo siguiente dockerfile se usa DISM para instalar IIS en la imagen de
contenedor:

Dockerfile

RUN dism.exe /online /enable-feature /all /featurename:iis-webserver


/NoRestart

En este ejemplo se instala el paquete redistribuible de Visual Studio. Start-Process y el


parámetro -Wait se usan para ejecutar el instalador. Esto garantiza que la instalación se
complete antes de pasar a la siguiente instrucción en el Dockerfile.

Dockerfile

RUN powershell.exe -Command Start-Process c:\vcredist_x86.exe -ArgumentList


'/quiet' -Wait

Para obtener información detallada sobre la instrucción RUN, consulte la referencia


RUN .

COPY
La instrucción COPY copia archivos y directorios en el sistema de archivos del
contenedor. Los archivos y directorios deben estar en una ruta de acceso relativa al
Dockerfile.

El formato de la instrucción COPY es similar al siguiente:

Dockerfile

COPY <source> <destination>


Si el origen o el destino incluyen espacios en blanco, incluya la ruta de acceso entre
corchetes y comillas dobles, como se muestra en el ejemplo siguiente:

Dockerfile

COPY ["<source>", "<destination>"]

Consideraciones para usar COPY con Windows

En Windows, el formato de destino debe usar barras diagonales. Por ejemplo, estas son
instrucciones COPY válidas:

Dockerfile

COPY test1.txt /temp/


COPY test1.txt c:/temp/

Por tanto, el siguiente formato con barras diagonales inversas no funcionará:

Dockerfile

COPY test1.txt c:\temp\

Ejemplos de uso de COPY con Windows

En el ejemplo siguiente se agrega el contenido del directorio de origen a un directorio


denominado sqllite en la imagen del contenedor:

Dockerfile

COPY source /sqlite/

En el ejemplo siguiente se agregarán todos los archivos que comienzan con la


configuración al directorio c:\temp de la imagen de contenedor:

Dockerfile

COPY config* c:/temp/

Para obtener información más detallada sobre la instrucción de COPY , consulte la


referencia de COPY .
AGREGAR
La instrucción ADD es como la instrucción COPY, pero con aún más funcionalidades.
Además de copiar archivos del host en la imagen de contenedor, la instrucción ADD
también puede copiar archivos desde una ubicación remota con una especificación de
dirección URL.

El formato de la instrucción ADD es similar al siguiente:

Dockerfile

ADD <source> <destination>

Si el origen o el destino incluyen espacios en blanco, incluya la ruta entre corchetes y


comillas dobles:

Dockerfile

ADD ["<source>", "<destination>"]

Consideraciones para ejecutar ADD con Windows

En Windows, el formato de destino debe usar barras diagonales. Por ejemplo, estas son
instrucciones ADD válidas:

Dockerfile

ADD test1.txt /temp/


ADD test1.txt c:/temp/

Por tanto, el siguiente formato con barras diagonales inversas no funcionará:

Dockerfile

ADD test1.txt c:\temp\

Además, en Linux, la instrucción ADD expandirá los paquetes comprimidos al copiar. Esta
funcionalidad no está disponible en Windows.

Ejemplos de uso de ADD con Windows


En el ejemplo siguiente se agrega el contenido del directorio de origen a un directorio
denominado sqllite en la imagen del contenedor:

Dockerfile

ADD source /sqlite/

En el ejemplo siguiente se agregarán todos los archivos que comienzan por "config" al
directorio c:\temp de la imagen de contenedor.

Dockerfile

ADD config* c:/temp/

En el ejemplo siguiente se descargará Python para Windows en el directorio c:\temp de


la imagen de contenedor.

Dockerfile

ADD https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe /temp/python-


3.5.1.exe

Para más información sobre la instrucción ADD , vea la referencia de ADD .

WORKDIR
La instrucción WORKDIR establece un directorio de trabajo para otras instrucciones de
Dockerfile, como RUN , CMD y también el directorio de trabajo para ejecutar instancias de
la imagen de contenedor.

El formato de la instrucción WORKDIR es similar al siguiente:

Dockerfile

WORKDIR <path to working directory>

Consideraciones para usar WORKDIR con Windows

En Windows, si el directorio de trabajo incluye una barra diagonal inversa, se le debe


aplicar escape.

Dockerfile
WORKDIR c:\\windows

Ejemplos

Dockerfile

WORKDIR c:\\Apache24\\bin

Para obtener información detallada sobre la instrucción WORKDIR , consulte la referencia


de WORKDIR .

CMD
La instrucción CMD establece que se ejecute el comando predeterminado al implementar
una instancia de la imagen de contenedor. Por ejemplo, si el contenedor hospedará un
servidor web NGINX, el CMD podría incluir instrucciones para iniciar el servidor web con
un comando como nginx.exe . Si se especifican varias instrucciones CMD en un
Dockerfile, solo se evalúa la última.

El formato de la instrucción CMD es similar al siguiente:

Dockerfile

# exec form

CMD ["<executable", "<param>"]

# shell form

CMD <command>

Consideraciones para usar CMD con Windows

En Windows, las rutas de acceso de archivo especificadas en la instrucción CMD deben


usar barras diagonales o tener barras diagonales inversas con escape \\ . A
continuación se muestran instrucciones CMD válidas:

Dockerfile

# exec form

CMD ["c:\\Apache24\\bin\\httpd.exe", "-w"]


# shell form

CMD c:\\Apache24\\bin\\httpd.exe -w

Sin embargo, el siguiente formato sin las barras diagonales adecuadas no funcionará:

Dockerfile

CMD c:\Apache24\bin\httpd.exe -w

Para obtener información más detallada sobre la instrucción CMD , consulte la referencia
de CMD de .

Carácter de escape
En muchos casos, una instrucción Dockerfile tendrá que abarcar varias líneas. Para ello,
puede usar un carácter de escape. El carácter de escape predeterminado de Dockerfile
es una barra diagonal inversa \ . Sin embargo, dado que la barra diagonal inversa
también es un separador de rutas de acceso de archivos en Windows, el hecho de usarla
para abarcar varias líneas puede causar problemas. Para solucionar este problema,
puede usar una directiva de analizador para cambiar el carácter de escape
predeterminado. Para obtener más información sobre las directivas de analizador,
consulte directivas de analizador .

En el ejemplo siguiente se muestra una única instrucción RUN que abarca varias líneas
mediante el carácter de escape predeterminado:

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell.exe -Command \


$ErrorActionPreference = 'Stop'; \
wget https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe -OutFile
c:\python-3.5.1.exe ; \
Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet
InstallAllUsers=1 PrependPath=1' -Wait ; \
Remove-Item c:\python-3.5.1.exe -Force

Para modificar el carácter de escape, coloque una directiva del analizador de escape en
la primera línea del Dockerfile. Esto se puede ver en el ejemplo siguiente.

7 Nota
Solo se pueden usar dos valores como caracteres de escape: \ y ` .

Dockerfile

# escape=`

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell.exe -Command `


$ErrorActionPreference = 'Stop'; `
wget https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe -OutFile
c:\python-3.5.1.exe ; `
Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet
InstallAllUsers=1 PrependPath=1' -Wait ; `
Remove-Item c:\python-3.5.1.exe -Force

Para más información sobre la directiva del analizador de escape, vea Directiva del
analizador de escape .

PowerShell en Dockerfile

Cmdlets de PowerShell
Los cmdlets de PowerShell se pueden ejecutar en un Dockerfile con la operación RUN .

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell -command Expand-Archive -Path c:\apache.zip -DestinationPath


c:\

Llamadas REST
El cmdlet Invoke-WebRequest de PowerShell puede ser útil al recopilar información o
archivos de un servicio web. Por ejemplo, si crea una imagen que incluye Python, puede
establecer $ProgressPreference en SilentlyContinue para lograr descargas más rápidas,
como se muestra en el ejemplo siguiente.

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell.exe -Command \


$ErrorActionPreference = 'Stop'; \
$ProgressPreference = 'SilentlyContinue'; \
Invoke-WebRequest https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe
-OutFile c:\python-3.5.1.exe ; \
Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1
PrependPath=1' -Wait ; \
Remove-Item c:\python-3.5.1.exe -Force

7 Nota

Invoke-WebRequest también funciona en Nano Server.

Otra opción para usar PowerShell para descargar archivos durante el proceso de
creación de imágenes es usar la biblioteca WebClient de .NET. Esto puede aumentar el
rendimiento de la descarga. En el ejemplo siguiente se descarga el software de Python
mediante la biblioteca WebClient.

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell.exe -Command \


$ErrorActionPreference = 'Stop'; \
(New-Object
System.Net.WebClient).DownloadFile('https://www.python.org/ftp/python/3.5.1/
python-3.5.1.exe','c:\python-3.5.1.exe') ; \
Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1
PrependPath=1' -Wait ; \
Remove-Item c:\python-3.5.1.exe -Force

7 Nota

Nano Server no admite actualmente WebClient.

Scripts de PowerShell
En algunos casos, puede resultar útil copiar un script en los contenedores que use
durante el proceso de creación de imágenes y, a continuación, ejecutar el script desde
dentro del contenedor.

7 Nota
Esto limitará el almacenamiento en caché de cualquier capa de imagen y reducirá la
legibilidad de Dockerfile.

En este ejemplo se copia un script de la máquina de compilación en el contenedor


mediante la instrucción ADD . A continuación, este script se ejecuta mediante la
instrucción RUN.

FROM mcr.microsoft.com/windows/servercore:ltsc2019
ADD script.ps1 /windows/temp/script.ps1
RUN powershell.exe -executionpolicy bypass c:\windows\temp\script.ps1

Compilación de Docker
Una vez creado y guardado un Dockerfile en el disco, puede ejecutar docker build para
crear la nueva imagen. El comando docker build toma varios parámetros opcionales y
una ruta de acceso al Dockerfile. Para obtener documentación completa sobre La
compilación de Docker, incluida una lista de todas las opciones de compilación, consulte
la referencia de compilación .

El formato del comando docker build es similar al siguiente:

Dockerfile

docker build [OPTIONS] PATH

Por ejemplo, el siguiente comando creará una imagen denominada "iis".

Dockerfile

docker build -t iis .

Cuando se haya iniciado el proceso de compilación, la salida indicará el estado y


devolverá los errores producidos.

Dockerfile

C:\> docker build -t iis .

Sending build context to Docker daemon 2.048 kB


Step 1 : FROM mcr.microsoft.com/windows/servercore:ltsc2019
---> 6801d964fda5
Step 2 : RUN dism /online /enable-feature /all /featurename:iis-webserver
/NoRestart
---> Running in ae8759fb47db

Deployment Image Servicing and Management tool


Version: 10.0.10586.0

Image Version: 10.0.10586.0

Enabling feature(s)
The operation completed successfully.

---> 4cd675d35444
Removing intermediate container ae8759fb47db

Step 3 : RUN echo "Hello World - Dockerfile" > c:\inetpub\wwwroot\index.html


---> Running in 9a26b8bcaa3a
---> e2aafdfbe392
Removing intermediate container 9a26b8bcaa3a

Successfully built e2aafdfbe392

El resultado es una nueva imagen de contenedor, que en este ejemplo se denomina


"iis".

Dockerfile

docker images

REPOSITORY TAG IMAGE ID CREATED


VIRTUAL SIZE
iis latest e2aafdfbe392 About a minute
ago 207.8 MB
windowsservercore latest 6801d964fda5 4 months ago
0 B

Lectura y referencias adicionales


Optimizar dockerfiles y la compilación de Docker para Windows
Referencia de Dockerfile

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Optimizar Dockerfiles de Windows
Artículo • 23/01/2025

Existen varias maneras de optimizar el proceso de compilación de Docker y las


imágenes de Docker resultantes. En este artículo se explica cómo funciona el proceso de
compilación de Docker y cómo crear imágenes óptimamente para contenedores de
Windows.

Capas de imagen en la compilación de Docker


Antes de poder optimizar la compilación de Docker, debe saber cómo funciona la
compilación de Docker. Durante el proceso de compilación de Docker se usa un
Dockerfile y cada instrucción accionable se ejecuta, de una en una, en su propio
contenedor temporal. El resultado es una nueva capa de imagen para cada instrucción
accionable.

Por ejemplo, en el siguiente ejemplo de Dockerfile se usa la imagen de sistema


operativo base mcr.microsoft.com/windows/servercore:ltsc2019 , se instala IIS y, a
continuación, se crea un sitio web sencillo.

Dockerfile

# Sample Dockerfile

FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN dism /online /enable-feature /all /featurename:iis-webserver /NoRestart
RUN echo "Hello World - Dockerfile" > c:\inetpub\wwwroot\index.html
CMD [ "cmd" ]

Podría esperar que este Dockerfile genere una imagen con dos capas, una para la
imagen del sistema operativo del contenedor y otra que incluye IIS y el sitio web. Sin
embargo, la imagen real tiene muchas capas y cada capa depende de la anterior.

Para que esto quede más claro, vamos a ejecutar el comando docker history en la
imagen que se ha creado en el ejemplo de Dockerfile.

Dockerfile

docker history iis

IMAGE CREATED CREATED BY


SIZE COMMENT
f4caf476e909 16 seconds ago cmd /S /C REM (nop) CMD ["cmd"]
41.84 kB
f0e017e5b088 21 seconds ago cmd /S /C echo "Hello World -
Dockerfile" > c 6.816 MB
88438e174b7c About a minute ago cmd /S /C dism /online /enable-
feature /all / 162.7 MB
6801d964fda5 4 months ago
0 B

La salida muestra que esta imagen tiene cuatro capas: la capa base y tres capas
adicionales que se asignan a cada instrucción de Dockerfile. La capa inferior
( 6801d964fda5 en este ejemplo) representa la imagen base del sistema operativo. Una
capa más arriba está la instalación de IIS. La siguiente capa incluye el nuevo sitio web y
así sucesivamente.

Se pueden escribir Dockerfiles para minimizar las capas de imagen, optimizar el


rendimiento de la compilación y optimizar la accesibilidad a través de la legibilidad. En
última instancia, hay muchas formas de realizar la misma tarea de compilación de la
imagen. La comprensión de cómo afecta el formato de Dockerfile al tiempo de
compilación y a la imagen que crea mejora la experiencia de automatización.

Optimización del tamaño de la imagen


En función de los requisitos de espacio, el tamaño de la imagen puede ser un factor
importante a la hora de crear imágenes de contenedor de Docker. Las imágenes de
contenedor se mueven entre registros y host, se exportan e importan y, en última
instancia, usan espacio. En esta sección se explica cómo minimizar el tamaño de la
imagen durante el proceso de compilación de Docker para contenedores de Windows.

Para obtener información adicional sobre los procedimientos recomendados de


Dockerfile, consulta Procedimientos recomendados para escribir Dockerfiles .

Acciones relacionadas con grupos


Dado que cada instrucción RUN crea una nueva capa en la imagen del contenedor, la
agrupación de acciones en una instrucción RUN puede reducir el número de capas en
una instancia de Dockerfile. Aunque la minimización de capas puede no afectar mucho
al tamaño de la imagen, la agrupación de acciones relacionadas sí, lo que se verá en los
ejemplos siguientes.

En esta sección, se compararán dos ejemplos de Dockerfile que hacen lo mismo. Sin
embargo, una instancia de Dockerfile contiene una instrucción por acción, mientras que
en el otro se han agrupado sus acciones relacionadas.
En el siguiente ejemplo de Dockerfile desagrupado se descarga Python para Windows,
se instala y se quita el archivo de instalación descargado una vez finalizada. En este
Dockerfile, cada acción recibe su propia instrucción RUN .

Dockerfile

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell.exe -Command Invoke-WebRequest


"https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe" -OutFile
c:\python-3.5.1.exe
RUN powershell.exe -Command Start-Process c:\python-3.5.1.exe -ArgumentList
'/quiet InstallAllUsers=1 PrependPath=1' -Wait
RUN powershell.exe -Command Remove-Item c:\python-3.5.1.exe -Force

La imagen resultante se compone de tres capas adicionales, una para cada instrucción
RUN .

Dockerfile

docker history doc-example-1

IMAGE CREATED CREATED BY


SIZE COMMENT
a395ca26777f 15 seconds ago cmd /S /C powershell.exe -Command
Remove-Item 24.56 MB
6c137f466d28 28 seconds ago cmd /S /C powershell.exe -Command
Start-Proce 178.6 MB
957147160e8d 3 minutes ago cmd /S /C powershell.exe -Command
Invoke-WebR 125.7 MB

El segundo ejemplo es una instancia de Dockerfile que realiza la misma operación


exacta. Sin embargo, todas las acciones relacionadas se han agrupado en una sola
instrucción RUN . Cada paso de la instrucción RUN está en una nueva línea de Dockerfile y
se usa el carácter "\" para el ajuste de línea.

Dockerfile

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell.exe -Command \


$ErrorActionPreference = 'Stop'; \
Invoke-WebRequest https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe
-OutFile c:\python-3.5.1.exe ; \
Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1
PrependPath=1' -Wait ; \
Remove-Item c:\python-3.5.1.exe -Force
La imagen resultante solo tiene una capa adicional para la instrucción RUN .

Dockerfile

docker history doc-example-2

IMAGE CREATED CREATED BY


SIZE COMMENT
69e44f37c748 54 seconds ago cmd /S /C powershell.exe -Command
$ErrorAct 216.3 MB

Quitar archivos sobrantes


Si hay un archivo en Dockerfile, como un instalador, que no necesitas después de usarlo,
puedes quitarlo para reducir el tamaño de la imagen. Esto debe hacerse en el mismo
paso en el que se copia el archivo en la capa de imagen. Esto evita que el archivo se
conserve en una capa de la imagen de nivel inferior.

En el siguiente ejemplo de Dockerfile, se descarga, ejecuta y se quita el paquete de


Python. Todo se realiza en una operación RUN y da lugar a una única capa de imagen.

Dockerfile

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell.exe -Command \


$ErrorActionPreference = 'Stop'; \
Invoke-WebRequest https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe
-OutFile c:\python-3.5.1.exe ; \
Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1
PrependPath=1' -Wait ; \
Remove-Item c:\python-3.5.1.exe -Force

Optimización de la velocidad de compilación

Varias líneas
Puedes dividir las operaciones en varias instrucciones individuales para optimizar la
velocidad de compilación de Docker. Varias operaciones RUN aumentan la eficacia del
almacenamiento en caché porque se crean capas individuales para cada instrucción RUN .
Si ya se ha ejecutado una instrucción idéntica en una operación de compilación de
Docker diferente, se reutiliza esta operación almacenada en caché (capa de imagen), lo
que disminuye el tiempo de ejecución de compilación de Docker.
En el ejemplo siguiente, se descargan los paquetes de redistribución de Apache y Visual
Studio, se instalan y luego se limpian quitando los archivos que ya no se necesitan. Todo
se hace con una única instrucción RUN . Si alguna de estas acciones se actualiza, se
vuelven a ejecutar todas.

Dockerfile

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell -Command \

# Download software ; \

wget https://www.apachelounge.com/download/VC11/binaries/httpd-2.4.18-
win32-VC11.zip -OutFile c:\apache.zip ; \
wget "https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-
B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe" -OutFile c:\vcredist.exe ; \
wget -Uri http://windows.php.net/downloads/releases/php-5.5.33-Win32-VC11-
x86.zip -OutFile c:\php.zip ; \

# Install Software ; \

Expand-Archive -Path c:\php.zip -DestinationPath c:\php ; \


Expand-Archive -Path c:\apache.zip -DestinationPath c:\ ; \
Start-Process c:\vcredist.exe -ArgumentList '/quiet' -Wait ; \

# Remove unneeded files ; \

Remove-Item c:\apache.zip -Force; \


Remove-Item c:\vcredist.exe -Force; \
Remove-Item c:\php.zip

La imagen resultante consta de dos capas, una para la imagen base del sistema
operativo y otra que contiene todas las operaciones de la instrucción única RUN .

Dockerfile

docker history doc-sample-1

IMAGE CREATED CREATED BY


SIZE COMMENT
9bdf3a21fd41 8 minutes ago cmd /S /C powershell -Command
Invoke-WebR 205.8 MB
6801d964fda5 5 months ago
0 B

Para comparar, aquí están las mismas acciones divididas en tres instrucciones RUN . En
este caso, cada instrucción RUN se almacena en caché en una capa de imagen de
contenedor y solo es necesario volver a ejecutar aquellas que han cambiado en
posteriores compilaciones del Dockerfile.

Dockerfile

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell -Command \


$ErrorActionPreference = 'Stop'; \
wget https://www.apachelounge.com/download/VC11/binaries/httpd-2.4.18-
win32-VC11.zip -OutFile c:\apache.zip ; \
Expand-Archive -Path c:\apache.zip -DestinationPath c:\ ; \
Remove-Item c:\apache.zip -Force

RUN powershell -Command \


$ErrorActionPreference = 'Stop'; \
wget "https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-
B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe" -OutFile c:\vcredist.exe ; \
Start-Process c:\vcredist.exe -ArgumentList '/quiet' -Wait ; \
Remove-Item c:\vcredist.exe -Force

RUN powershell -Command \


$ErrorActionPreference = 'Stop'; \
wget http://windows.php.net/downloads/releases/php-5.5.33-Win32-VC11-
x86.zip -OutFile c:\php.zip ; \
Expand-Archive -Path c:\php.zip -DestinationPath c:\php ; \
Remove-Item c:\php.zip -Force

La imagen resultante se compone de cuatro capas: una capa para la imagen base del
sistema operativo y tres para cada una de las instrucciones RUN . Dado que cada
instrucción RUN se ejecutó en su propia capa, todas las ejecuciones posteriores de este
Dockerfile o de un conjunto idéntico de instrucciones de un Dockerfile diferente usarán
la capa de imagen almacenada en caché, lo que disminuirá el tiempo de compilación.

Dockerfile

docker history doc-sample-2

IMAGE CREATED CREATED BY


SIZE COMMENT
ddf43b1f3751 6 days ago cmd /S /C powershell -Command Sleep
2 ; Inv 127.2 MB
d43abb81204a 7 days ago cmd /S /C powershell -Command Sleep
2 ; Inv 66.46 MB
7a21073861a1 7 days ago cmd /S /C powershell -Command Sleep
2 ; Inv 115.8 MB
6801d964fda5 5 months ago
La forma de ordenar las instrucciones es importante cuando se trabaja con cachés de
imágenes, como se verá en la sección siguiente.

Clasificación de instrucciones
Un Dockerfile se procesa de arriba a abajo y cada instrucción se compara con las capas
almacenadas en caché. Cuando se encuentra una instrucción sin una capa en caché, esta
instrucción y todas las siguientes se procesan en nuevas capas de la imagen del
contenedor. Por este motivo, es importante el orden en que se colocan las instrucciones.
Coloque las instrucciones que se van a mantener constantes hacia la parte superior del
Dockerfile. Coloque las que pueden cambiar hacia la parte inferior del Dockerfile. Al
hacerlo, se reduce la probabilidad de que se niegue la caché existente.

En los siguientes ejemplos se muestra cómo puede afectar la clasificación de las


instrucciones de Dockerfile a la eficacia del almacenamiento en caché. Este sencillo
ejemplo de Dockerfile tiene cuatro carpetas numeradas.

Dockerfile

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN mkdir test-1


RUN mkdir test-2
RUN mkdir test-3
RUN mkdir test-4

La imagen resultante tiene cinco capas, una para la imagen base del sistema operativo y
una para cada instrucción RUN .

Dockerfile

docker history doc-sample-1

IMAGE CREATED CREATED BY SIZE


COMMENT
afba1a3def0a 38 seconds ago cmd /S /C mkdir test-4 42.46 MB
86f1fe772d5c 49 seconds ago cmd /S /C mkdir test-3 42.35 MB
68fda53ce682 About a minute ago cmd /S /C mkdir test-2 6.745 MB
5e5aa8ba1bc2 About a minute ago cmd /S /C mkdir test-1 7.12 MB
6801d964fda5 5 months ago 0 B

El Dockerfile siguiente se ha modificado ligeramente, ya que se ha cambiado la tercera


instrucción RUN a un archivo nuevo. Cuando se ejecuta la compilación de Docker en este
Dockerfile, las tres primeras instrucciones, que son idénticas a las del último ejemplo,
usan las capas de la imagen almacenadas en caché. Sin embargo, dado que la
instrucción RUN modificada no se ha almacenado en caché, se crea una nueva capa para
ella y todas las instrucciones posteriores.

Dockerfile

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN mkdir test-1


RUN mkdir test-2
RUN mkdir test-5
RUN mkdir test-4

Cuando se comparan los id. de imagen de la nueva imagen con los del primer ejemplo
de esta sección, observarás que las tres primeras capas de abajo a arriba están
compartidas, pero la cuarta y la quinta son únicas.

Dockerfile

docker history doc-sample-2

IMAGE CREATED CREATED BY SIZE


COMMENT
c92cc95632fb 28 seconds ago cmd /S /C mkdir test-4 5.644 MB
2f05e6f5c523 37 seconds ago cmd /S /C mkdir test-5 5.01 MB
68fda53ce682 3 minutes ago cmd /S /C mkdir test-2 6.745 MB
5e5aa8ba1bc2 4 minutes ago cmd /S /C mkdir test-1 7.12 MB
6801d964fda5 5 months ago 0 B

Optimización cosmética

Mayúsculas y minúsculas de las instrucciones


La instrucciones de Dockerfile no distinguen mayúsculas de minúsculas, pero la
convención es usar mayúsculas. Esto mejora la legibilidad al diferenciar entre la llamada
y la operación de la instrucción. En los dos ejemplos siguientes se compara un
Dockerfile con mayúsculas y sin mayúsculas.

A continuación, se muestra un Dockerfile sin mayúsculas:

Dockerfile

# Sample Dockerfile

from mcr.microsoft.com/windows/servercore:ltsc2019
run dism /online /enable-feature /all /featurename:iis-webserver /NoRestart
run echo "Hello World - Dockerfile" > c:\inetpub\wwwroot\index.html
cmd [ "cmd" ]

El siguiente es el mismo Dockerfile usando mayúsculas:

Dockerfile

# Sample Dockerfile

FROM mcr.microsoft.com/windows/servercore:ltsc2019
RUN dism /online /enable-feature /all /featurename:iis-webserver /NoRestart
RUN echo "Hello World - Dockerfile" > c:\inetpub\wwwroot\index.html
CMD [ "cmd" ]

Ajuste de línea
Las operaciones largas y complejas pueden dividirse en varias líneas por el carácter de
barra diagonal inversa \ . El Dockerfile siguiente instala el paquete redistribuible de
Visual Studio, quita los archivos del instalador y luego crea un archivo de configuración.
Estas tres operaciones se especifican en una sola línea.

Dockerfile

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell -Command c:\vcredist_x86.exe /quiet ; Remove-Item


c:\vcredist_x86.exe -Force ; New-Item c:\config.ini

El comando se puede dividir con barras inclinadas inversas para que cada operación de
la instrucción RUN se especifique en su propia línea.

Dockerfile

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell -Command \


$ErrorActionPreference = 'Stop'; \
Start-Process c:\vcredist_x86.exe -ArgumentList '/quiet' -Wait ; \
Remove-Item c:\vcredist_x86.exe -Force ; \
New-Item c:\config.ini

Lecturas y referencias adicionales


Dockerfile en Windows
Best practices for writing Dockerfiles (Procedimientos recomendados para escribir
Dockerfiles) en Docker.com

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Implementación de aplicaciones Windows
Artículo • 17/04/2025

Se aplica a: AKS en Windows Server

En este tutorial se describe cómo implementar una aplicación de ejemplo de ASP.NET en un


contenedor de Windows Server en el clúster de Azure Kubernetes Service (AKS) en AKS en
Windows Server y, a continuación, probar y escalar la aplicación. También aprenderá a unir un
nodo de Windows a un dominio de Active Directory.

En este tutorial se da por supuesto que tiene un conocimiento básico de los conceptos de
Kubernetes. Para obtener más información, consulte Conceptos básicos de Kubernetes para
AKS en Windows Server.

Antes de empezar
Asegúrese de cumplir los siguientes requisitos:

Un clúster de Azure Kubernetes Service con al menos un nodo de trabajo de Windows en


ejecución.
Un archivo kubeconfig para obtener acceso al clúster.
El módulo de PowerShell de AksHci está instalado.

Al seguir los procedimientos:

Ejecute los comandos en una ventana de administrador de PowerShell.


Asegúrese de que las cargas de trabajo específicas del SO se encuentran en el host de
contenedor adecuado. Si el clúster de Kubernetes tiene una combinación de nodos de
trabajo de Linux y Windows, puede usar selectores de nodos o intolerancias y tolerancias.
Para obtener más información, consulte Uso de los selectores de nodo y la opción para
rechazar o aceptarlos.

Implementación de la aplicación
Un archivo de manifiesto de Kubernetes define un estado deseado del clúster, por ejemplo,
qué imágenes de contenedor se van a ejecutar. En estos procedimientos, se usa un manifiesto
para crear todos los objetos necesarios para ejecutar la aplicación de ejemplo ASP.NET en un
contenedor de Windows Server. Este manifiesto incluye una implementación de Kubernetes
para la aplicación de ejemplo de ASP.NET y un servicio de Kubernetes externo para acceder a la
aplicación desde Internet.
La aplicación de ejemplo ASP.NET se proporciona como parte de los ejemplos de .NET
Framework y se ejecuta en un contenedor de Windows Server. AKS Arc requiere que los
contenedores de Windows Server se basen en imágenes de Windows Server 2019.

El archivo de manifiesto de Kubernetes también debe definir un selector de nodos para indicar
al clúster que ejecute el pod de la aplicación de ejemplo de ASP.NET en un nodo que pueda
ejecutar contenedores de Windows Server.

Cree un archivo denominado sample.yaml y copie o pegue la siguiente definición de YAML:

YAML

apiVersion: apps/v1
kind: Deployment
metadata:
name: sample
labels:
app: sample
spec:
replicas: 1
template:
metadata:
name: sample
labels:
app: sample
spec:
nodeSelector:
"beta.kubernetes.io/os": windows
containers:
- name: sample
image: mcr.microsoft.com/dotnet/framework/samples:aspnetapp
resources:
limits:
cpu: 1
memory: 800M
requests:
cpu: .1
memory: 300M
ports:
- containerPort: 80
selector:
matchLabels:
app: sample
---
apiVersion: v1
kind: Service
metadata:
name: sample
spec:
type: LoadBalancer
ports:
- protocol: TCP
port: 80
selector:
app: sample

Implemente la aplicación con el kubectl apply comando y especifique el nombre del


manifiesto de YAML:

PowerShell

kubectl apply -f sample.yaml

En la salida de ejemplo siguiente se muestra que la implementación y el servicio se crearon


correctamente:

Resultados

deployment.apps/sample created
service/sample created

Prueba de la aplicación
Cuando se ejecuta la aplicación, un servicio de Kubernetes expone el front-end de la aplicación
a Internet. Este proceso puede tardar unos minutos en completarse. En ocasiones, el servicio
puede tardar más de algunos minutos en provisionarse. Espere hasta 10 minutos en estos
casos.

Para supervisar el progreso, use el kubectl get service comando con el --watch argumento :

PowerShell

kubectl get service sample --watch

Inicialmente, el EXTERNAL-IP para el servicio de ejemplo se muestra como pendiente:

Resultados

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE


sample LoadBalancer 10.0.37.27 <pending> 80:30572/TCP 6s

Cuando la dirección EXTERNAL-IP cambie de pendiente a una dirección IP pública real, use
CTRL-C para detener el proceso de inspección de kubectl . En la salida del ejemplo siguiente se

muestra una dirección IP pública válida asignada al servicio:


Resultados

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE


sample LoadBalancer 10.0.37.27 52.179.23.131 80:30572/TCP 2m

Para ver la aplicación de ejemplo en acción, abra un explorador web en la dirección IP externa
del servicio.

Si la conexión agota el tiempo de espera al intentar cargar la página, compruebe si la


aplicación de ejemplo está lista ejecutando el kubectl get pods --watch comando . A veces, la
dirección IP externa está disponible antes de que se inicie el contenedor de Windows.

Escalado de pods de la aplicación


Hemos creado una sola réplica del front-end de la aplicación. Para ver el número y el estado de
los pods del clúster, use el comando kubectl get tal como se indica a continuación:

PowerShell

kubectl get pods -n default


Para cambiar el número de pods en la implementación de ejemplo, use el comando kubectl
scale . El ejemplo siguiente aumenta el número de pods de front-end a 3:

PowerShell

kubectl scale --replicas=3 deployment/sample

Vuelva a ejecutar kubectl get pods para verificar que los pods se han creado. Tras un minuto
aproximadamente, los pods adicionales están disponibles en el clúster:

PowerShell

kubectl get pods -n default

Pasos siguientes
Uso de Azure Monitor para supervisar el clúster y la aplicación
Uso de volúmenes persistentes en un clúster de Kubernetes
Implementación de un contenedor de
Windows Server en un clúster de
Azure Kubernetes Service (AKS) mediante
la CLI de Azure
14/04/2025

Azure Kubernetes Service (AKS) es un servicio de Kubernetes administrado que le permite


implementar y administrar clústeres rápidamente. En este artículo, usará la CLI de Azure para
implementar un clúster de AKS que ejecute contenedores de Windows Server. También
implementará una aplicación de ejemplo de ASP.NET en un contenedor de Windows Server en
el clúster.

7 Nota

Para empezar a aprovisionar rápidamente un clúster de AKS, en este artículo se incluyen


los pasos para implementar un clúster con la configuración predeterminada solo con fines
de evaluación. Antes de implementar un clúster listo para producción, se recomienda
familiarizarse con nuestra arquitectura de referencia de línea de base para considerar
cómo se alinea con sus requisitos empresariales.

Antes de empezar
En esta guía rápida se presupone un conocimiento básico de los conceptos de Kubernetes.
Para más información, consulte Conceptos básicos de Kubernetes de Azure Kubernetes Service
(AKS).

Si no tiene una cuenta de Azure, cree una cuenta gratuita antes de comenzar.

Use el entorno de Bash en Azure Cloud Shell. Para más información, consulte
Introducción a Azure Cloud Shell.

Si prefiere ejecutar comandos de referencia de la CLI localmente, instale la CLI de Azure.


Si utiliza Windows o macOS, considere la posibilidad de ejecutar la CLI de Azure en un
contenedor Docker. Para más información, vea Ejecución de la CLI de Azure en un
contenedor de Docker.
Si usa una instalación local, inicie sesión en la CLI de Azure mediante el comando az
login. Siga los pasos que se muestran en el terminal para completar el proceso de
autenticación. Para ver otras opciones de inicio de sesión, consulte Autenticación en
Azure mediante la CLI de Azure.

En caso de que se le solicite, instale las extensiones de la CLI de Azure la primera vez
que la use. Para obtener más información sobre las extensiones, consulte Uso y
administración de extensiones con la CLI de Azure.

Ejecute az version para buscar cuál es la versión y las bibliotecas dependientes que
están instaladas. Para realizar la actualización a la versión más reciente, ejecute az
upgrade.

En este artículo se necesita la versión 2.0.64 de la CLI de Azure, o cualquier versión


posterior. Si usa Azure Cloud Shell, ya está instalada allí la versión más reciente.
Asegúrese de que la identidad que usará para crear el clúster tenga los permisos mínimos
adecuados. Para más información sobre el acceso y la identidad en AKS, consulte
Opciones de acceso e identidad en Azure Kubernetes Service (AKS).
Si tiene varias suscripciones de Azure, seleccione el identificador de suscripción adecuado
en el que se deben facturar los recursos con el comando az account set. Para más
información, consulte Cómo administrar suscripciones de Azure: CLI de Azure.

Crear un grupo de recursos


Un grupo de recursos de Azure es un grupo lógico en el que se implementan y administran
recursos de Azure. Cuando se crea un grupo de recursos, se le pide que especifique una
ubicación. Esta ubicación es donde se almacenan los metadatos del grupo de recursos y el
lugar en el que los recursos se ejecutan en Azure si no se especifica otra región al crearlos.

Cree un grupo de recursos con el comando az group create. En el ejemplo siguiente se


crea un grupo de recursos denominado myResourceGroup en la ubicación WestUS2 .
Utilice este comando y otros comandos de este artículo en un shell de BASH:

Bash

export RANDOM_SUFFIX=$(openssl rand -hex 3)


export REGION="canadacentral"
export MY_RESOURCE_GROUP_NAME="myAKSResourceGroup$RANDOM_SUFFIX"
az group create --name $MY_RESOURCE_GROUP_NAME --location $REGION

Resultados:

JSON
{
"id": "/subscriptions/xxxxx-xxxxx-xxxxx-
xxxxx/resourceGroups/myResourceGroupxxxxx",
"location": "WestUS2",
"managedBy": null,
"name": "myResourceGroupxxxxx",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": "Microsoft.Resources/resourceGroups"
}

Creación de un clúster de AKS


En esta sección, se crea un clúster de AKS con la siguiente configuración:

El clúster se configura con dos nodos para asegurarse de que funciona de forma
confiable. Un nodo es una máquina virtual de Azure que ejecuta los componentes de
nodo de Kubernetes y el entorno de ejecución del contenedor.
Los parámetros --windows-admin-password y --windows-admin-username establecen las
credenciales de administrador para los nodos de Windows Server del clúster y deben
satisfacer los requisitos de contraseña de Windows Server.
El grupo de nodos usa VirtualMachineScaleSets .

Para crear el clúster de AKS con la CLI de Azure, siga estos pasos:

1. Cree un nombre de usuario para usarlo como credenciales de administrador para los
nodos de Windows Server en el clúster. (En el ejemplo original se solicita la entrada; en
este documento exec, la variable de entorno se establece de forma no interactiva).

Bash

export WINDOWS_USERNAME="winadmin"

2. Cree una contraseña para el nombre de usuario de administrador que creó en el paso
anterior. La contraseña debe tener un mínimo de 14 caracteres y cumplir los requisitos de
complejidad de contraseña de Windows Server.

Bash

export WINDOWS_PASSWORD=$(echo "P@ssw0rd$(openssl rand -base64 10 | tr -dc 'A-Za-


z0-9!@#$%^&*()' | cut -c1-6)")
3. Utilice el comando az aks create para crear un clúster y especifique los parámetros --
windows-admin-username y --windows-admin-password . El siguiente comando de ejemplo

crea un clúster con los valores de WINDOWS_USERNAME y WINDOWS_PASSWORD


establece en los comandos anteriores. Se anexa un sufijo aleatorio al nombre del clúster
para la unicidad.

Bash

export MY_AKS_CLUSTER="myAKSCluster$RANDOM_SUFFIX"
az aks create \
--resource-group $MY_RESOURCE_GROUP_NAME \
--name $MY_AKS_CLUSTER \
--node-count 2 \
--enable-addons monitoring \
--generate-ssh-keys \
--windows-admin-username $WINDOWS_USERNAME \
--windows-admin-password $WINDOWS_PASSWORD \
--vm-set-type VirtualMachineScaleSets \
--network-plugin azure

Transcurridos unos minutos, el comando se completa y devuelve información en formato JSON


sobre el clúster. En ocasiones, el clúster puede tardar más de unos minutos en aprovisionarse.
Espere hasta 10 minutos para que se produzca el aprovisionamiento.

Si recibe un error de validación de contraseña y la contraseña que estableció cumple los


requisitos de longitud y complejidad, pruebe a crear el grupo de recursos en otra región. A
continuación, intente crear el clúster con el nuevo grupo de recursos.

Si no especifica un nombre de usuario y una contraseña de administrador al crear el grupo de


nodos, el nombre de usuario se establece en azureuser y la contraseña se establece en un valor
aleatorio. Para obtener más información, consulte las preguntas más frecuentes de Windows
Server

El nombre de usuario del administrador no se puede cambiar, pero la contraseña de


administrador que el clúster de AKS usa para los nodos de Windows Server mediante az aks
update sí que se puede cambiar. Para obtener más información, consulte las preguntas más

frecuentes de Windows Server.

Para ejecutar un clúster de AKS que admita grupos de nodos para contenedores de
Windows Server, el clúster debe utilizar una directiva de red que use el complemento de red de
Azure CNI (avanzado) . El parámetro --network-plugin azure especifica Azure CNI.

Adición de un grupo de nodos


De forma predeterminada, se crea un clúster de AKS con un grupo de nodos que puede
ejecutar contenedores de Linux. Debe agregar otro grupo de nodos que pueda ejecutar
contenedores de Windows Server en combinación con el grupo de nodos de Linux.

Windows Server 2022 es el sistema operativo predeterminado para Kubernetes versiones 1.25.0
y posteriores. Windows Server 2019 es el sistema operativo predeterminado para versiones
anteriores. Si no especifica una SKU de sistema operativo determinada, Azure crea el grupo de
nodos con la SKU predeterminada de la versión de Kubernetes que usa el clúster.

Grupo de nodos de Windows (SKU predeterminada)

Para usar la SKU predeterminada del sistema operativo, cree el grupo de nodos sin
especificar ninguna SKU de sistema operativo. El grupo de nodos está configurado para el
sistema operativo predeterminado en función de la versión de Kubernetes del clúster.

Agregue un grupo de nodos de Windows con el comando az aks nodepool add . El


siguiente comando crea un nuevo grupo de nodos denominado npwin y lo agrega a
myAKSCluster. El comando también usa la subred predeterminada en la red virtual
predeterminada que se crea al ejecutar az aks create . No se especificó ninguna SKU del
sistema operativo, por lo que el grupo de nodos se establece en el sistema operativo
predeterminado en función de la versión de Kubernetes del clúster.

text

az aks nodepool add \


--resource-group $MY_RESOURCE_GROUP_NAME \
--cluster-name $MY_AKS_CLUSTER \
--os-type Windows \
--name npwin \
--node-count 1

Conectarse al clúster
Para administrar un clúster de Kubernetes, usará kubectl , el cliente de línea de comandos de
Kubernetes. Si usa Azure Cloud Shell, kubectl ya está instalado. Si desea instalar y ejecutar
kubectl localmente, llame al comando az aks install-cli.

1. Para configurar kubectl para conectarse a su clúster de Kubernetes, use el comando az


aks get-credentials. Con este comando se descargan las credenciales y se configura la CLI
de Kubernetes para usarlas.

Bash
az aks get-credentials --resource-group $MY_RESOURCE_GROUP_NAME --name
$MY_AKS_CLUSTER

2. Compruebe la conexión al clúster, para lo que debe usar el comando kubectl get , que
devuelve una lista de los nodos del clúster.

Bash

kubectl get nodes -o wide

La siguiente salida de ejemplo muestra todos los nodos del clúster. Asegúrese de que el estado
de todos los nodos sea Listo:

text

NAME STATUS ROLES AGE VERSION INTERNAL-IP


EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-
RUNTIME
aks-nodepool1-20786768-vmss000000 Ready agent 22h v1.27.7 10.224.0.4
<none> Ubuntu 22.04.3 LTS 5.15.0-1052-azure
containerd://1.7.5-1
aks-nodepool1-20786768-vmss000001 Ready agent 22h v1.27.7 10.224.0.33
<none> Ubuntu 22.04.3 LTS 5.15.0-1052-azure
containerd://1.7.5-1
aksnpwin000000 Ready agent 20h v1.27.7 10.224.0.62
<none> Windows Server 2022 Datacenter 10.0.20348.2159
containerd://1.6.21+azure

7 Nota

El entorno de ejecución de contenedor para cada grupo de nodos se muestra en


CONTAINER-RUNTIME. Los valores del runtime del contenedor comienzan por
containerd:// , lo que significa que usan containerd para el runtime del contenedor.

Implementación de la aplicación
Un archivo de manifiesto de Kubernetes define un estado deseado del clúster, por ejemplo,
qué imágenes de contenedor se van a ejecutar. En este artículo, usará un manifiesto para crear
todos los objetos necesarios para ejecutar la aplicación de ejemplo de ASP.NET en un
contenedor de Windows Server. Este manifiesto incluye una implementación de Kubernetes
para la aplicación de ejemplo de ASP.NET y un servicio de Kubernetes externo para acceder a la
aplicación desde Internet.
La aplicación de ejemplo de ASP.NET se proporciona como parte de los ejemplos de .NET
Framework y se ejecuta en un contenedor de Windows Server. AKS requiere contenedores
de Windows Server que se basen en imágenes de Windows Server 2019 o una versión
posterior. El archivo de manifiesto de Kubernetes también debe definir un selector de nodos
que le indique al clúster de AKS que ejecute el pod de la aplicación de ejemplo de ASP.NET en
un nodo que pueda ejecutar contenedores de Windows Server.

1. Cree un archivo denominado sample.yaml y cópielo en la siguiente definición de código


YAML.

YAML

apiVersion: apps/v1
kind: Deployment
metadata:
name: sample
labels:
app: sample
spec:
replicas: 1
template:
metadata:
name: sample
labels:
app: sample
spec:
nodeSelector:
"kubernetes.io/os": windows
containers:
- name: sample
image: mcr.microsoft.com/dotnet/framework/samples:aspnetapp
resources:
limits:
cpu: 1
memory: 800M
ports:
- containerPort: 80
selector:
matchLabels:
app: sample
---
apiVersion: v1
kind: Service
metadata:
name: sample
spec:
type: LoadBalancer
ports:
- protocol: TCP
port: 80
selector:
app: sample

Para obtener un desglose de los archivos de manifiesto de YAML, consulte Implementaciones y


manifiestos de YAML.

Si crea y guarda el archivo YAML localmente, para cargar el archivo de manifiesto en el


directorio predeterminado de CloudShell, seleccione el botón Cargar y descargar archivos y
elija el archivo en el sistema de archivos local.

2. Implemente la aplicación mediante el comando kubectl apply y especifique el nombre


del manifiesto de YAML:

Bash

kubectl apply -f sample.yaml

En la salida de ejemplo siguiente se muestran la implementación y el servicio que se crearon


correctamente:

text

{
"deployment.apps/sample": "created",
"service/sample": "created"
}

Prueba de la aplicación
Cuando se ejecuta la aplicación, un servicio de Kubernetes expone el front-end de la aplicación
a Internet. Este proceso puede tardar unos minutos en completarse. En ocasiones, el servicio
puede tardar más de unos minutos en activarse. Espere hasta 10 minutos para que se produzca
el aprovisionamiento.

1. Compruebe el estado de los pods implementados con el comando kubectl get pods .
Asegúrate de que todos los pods tengan el estado Running antes de continuar.

Bash

kubectl get pods

2. Para supervisar el progreso, utilice el comando kubectl get service con el argumento --
watch .
Bash

while true; do
export EXTERNAL_IP=$(kubectl get service sample -o jsonpath="
{.status.loadBalancer.ingress[0].ip}" 2>/dev/null)
if [[ -n "$EXTERNAL_IP" && "$EXTERNAL_IP" != "<pending>" ]]; then
kubectl get service sample
break
fi
echo "Still waiting for external IP assignment..."
sleep 5
done

Inicialmente, la salida muestra el parámetro EXTERNAL-IP del servicio de ejemplo como


pendiente:

text

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE


sample LoadBalancer xx.xx.xx.xx pending xx:xxxx/TCP 2m

Cuando la dirección EXTERNAL-IP cambie de pendiente a una dirección IP pública real, use
CTRL-C para detener el proceso de inspección de kubectl . En la salida del ejemplo siguiente se

muestra una dirección IP pública válida asignada al servicio:

JSON

{
"NAME": "sample",
"TYPE": "LoadBalancer",
"CLUSTER-IP": "10.0.37.27",
"EXTERNAL-IP": "52.179.23.131",
"PORT(S)": "80:30572/TCP",
"AGE": "2m"
}

Para ver la aplicación de ejemplo en acción, abra un explorador web en la dirección IP externa
del servicio después de unos minutos.

Pasos siguientes
En este inicio rápido, ha implementado un clúster de Kubernetes y luego ha desplegado una
aplicación de ejemplo de ASP.NET en un contenedor de Windows Server. Esta aplicación de
ejemplo es solo para fines de demostración y no representa todos los procedimientos
recomendados para las aplicaciones de Kubernetes. Para instrucciones sobre cómo crear
soluciones completas con AKS para producción, consulte Guía de soluciones de AKS.

Para más información sobre AKS y obtener un ejemplo completo desde el código hasta la
implementación, continúe con el tutorial del clúster de Kubernetes.

Tutorial de AKS
Preguntas más frecuentes sobre Windows
Server en AKS
En este artículo se proporcionan respuestas a algunas de las preguntas más comunes sobre el
uso de contenedores de Windows Server en Azure Kubernetes Service (AKS).

¿Qué tipo de discos se admiten en


Windows?
Azure Disks y Azure Files son los tipos de volumen admitidos y se accede a ellos como
volúmenes del Sistema de archivos de nueva tecnología (NTFS) en el contenedor de Windows
Server.

¿Admite Windows máquinas virtuales de


generación 2?
Las máquinas virtuales de Generación 2 solo se admiten en Windows para WS2022.

Para más información, consulte Compatibilidad para máquinas virtuales de generación 2 en


Azure.

¿Cómo se aplica una revisión a los nodos


de Windows?
Para obtener las revisiones más recientes de los nodos de Windows, puede actualizar el grupo
de nodos o actualizar la imagen de los nodos.

¿Se admite la conservación de la IP de


origen del cliente?
En este momento, la conservación de la IP de origen del cliente no es compatible con los
nodos de Windows.

¿Se puede cambiar el número máximo de


pods por nodo?
Sí. Para más información, consulte Número máximo de pods.

¿Cuál es el tiempo de espera


predeterminado del protocolo de control
de transmisión (TCP) en el sistema
operativo Windows?
El tiempo de espera de TCP predeterminado en el sistema operativo Windows es de cuatro
minutos. Este valor no se puede configurar. Cuando una aplicación usa un tiempo de espera
más largo, las conexiones TCP entre distintos contenedores del mismo nodo se cierran después
de cuatro minutos.

¿Por qué se muestra un error al tratar de


crear un nuevo grupo de agentes de
Windows?
Si creó el clúster antes de febrero de 2020 y no ha hecho ninguna operación de actualización,
el clúster sigue usando una imagen antigua de Windows. Es posible que vea un error similar al
ejemplo siguiente:

"No se encuentra la siguiente lista de imágenes a las que se hace referencia desde la plantilla
de implementación: Publicador: MicrosoftWindowsServer, Oferta WindowsServer, Sku: 2019-
datacenter-core-smalldisk-2004, Versión: más raciente. Vea Búsqueda y uso de imágenes de
máquina virtual de Azure Marketplace con Azure PowerShell para obtener instrucciones para
encontrar imágenes disponibles."

Para corregir este problema, debe realizar los pasos siguientes:

1. Actualice el plano de control del clúster a fin de actualizar la oferta y el publicador de la


imagen.
2. Cree nuevos grupos de agentes de Windows.
3. Mueva los pods de Windows de los grupos de agentes de Windows existentes a los
nuevos.
4. Elimine los grupos de agentes de Windows anteriores.
¿Por qué se muestra un error al tratar de
implementar pods de Windows?
Si especifica un valor en --max-pods menor que el número de pods que desea crear, es posible
que vea el error No available addresses .

Para corregir este error, use el comando az aks nodepool add con un valor --max-pods
suficientemente alto. Por ejemplo:

Azure CLI

az aks nodepool add \


--cluster-name $CLUSTER_NAME \
--resource-group $RESOURCE_GROUP \
--name $NODEPOOL_NAME \
--max-pods 3

Para más información, consulte la --max-pods documentación.

¿Por qué hay un usuario inesperado


denominado "sshd" en mi nodo de
máquina virtual?
AKS agrega un usuario denominado "sshd" al instalar el servicio OpenSSH. Este usuario no es
malintencionado. Se recomienda que los clientes actualicen sus alertas para omitir esta cuenta
de usuario inesperada.

¿Cómo se realiza la rotación de la entidad


de servicio para el grupo de nodos de
Windows?
Los grupos de nodos de Windows no admiten la rotación de la entidad de servicio. Para
actualizar la entidad de servicio, cree un nuevo grupo de nodos de Windows y migre los pods
del grupo anterior al nuevo. Después de migrar los pods al nuevo grupo, elimine el grupo de
nodos anterior.

En lugar de las entidades de servicio, puede usar identidades administradas. Para más
información, consulte Uso de identidades administradas en AKS.
¿Cómo cambio la contraseña de
administrador de los nodos de Windows
Server en el clúster?
Para cambiar la contraseña de administrador mediante la CLI de Azure, use el comando az aks
update con el parámetro --admin-password . Por ejemplo:

Azure CLI

az aks update \
--resource-group $RESOURCE_GROUP \
--name $CLUSTER_NAME \
--admin-password <new-password>

Para cambiar la contraseña mediante Azure PowerShell, use el cmdlet Set-AzAksCluster con el
parámetro -AdminPassword . Por ejemplo:

Azure PowerShell

Set-AzAksCluster `
-ResourceGroupName $RESOURCE_GROUP `
-Name $CLUSTER_NAME `
-AdminPassword <new-password>

Tenga en cuenta que realizar una actualización del clúster provoca un reinicio y solo actualiza
los grupos de nodos de Windows Server. Para obtener información sobre los requisitos de
contraseña de Windows Server, consulte Requisitos de contraseña de Windows Server.

¿Cuántos grupos de nodos puedo crear?


Los clústeres de AKS con grupos de nodos de Windows tienen los mismos límites de recursos
que los límites predeterminados especificados para el servicio AKS. Consulte Cuotas,
restricciones de tamaño de máquinas virtuales y disponibilidad de regiones en Azure
Kubernetes Service (AKS).

¿Puedo ejecutar controladores de entrada


en los nodos de Windows?
Sí, puede ejecutar controladores de entrada que admitan contenedores de Windows Server.
¿Pueden usar gMSA los contenedores de
Windows Server?
Sí. La compatibilidad con la cuenta de servicio administrada por grupo (gMSA) está disponible
con carácter general (GA) para Windows en AKS. Para más información, consulte Habilitación
de cuentas de servicio administradas de grupo (GMSA) para los nodos de Windows Server en
el clúster de Azure Kubernetes Service (AKS)

¿Existe alguna limitación en el número de


servicios que puede haber en un clúster
con nodos de Windows?
Un clúster con nodos de Windows puede tener aproximadamente 500 servicios (algunas veces
menos) antes de que se agote el puerto. Esta limitación se aplica a un servicio de Kubernetes
con la directiva de tráfico externo establecida en "Clúster".

Cuando la directiva de tráfico externo en un servicio está configurada como un clúster, el


tráfico se somete a una NAT de origen adicional en el nodo. Este proceso también da como
resultado la reserva de un puerto del grupo de puertos dinámicos TCPIP. Este grupo de puertos
es un recurso limitado (unos 16 000 puertos de forma predeterminada) y muchas conexiones
activas a un servicio pueden dar lugar a un agotamiento dinámico del grupo de puertos, lo que
provoca caídas de conexión.

Si Kubernetes Service está configurado con la directiva de tráfico externo establecida en


"Local", es probable que los problemas de agotamiento de puertos no se produzcan en 500
servicios.

¿Cómo se cambia la zona horaria de un


contenedor en ejecución?
Para cambiar la zona horaria de un contenedor de Windows Server en ejecución, conéctese al
contenedor en ejecución con una sesión de PowerShell. Por ejemplo:

Azure CLI

kubectl exec -it CONTAINER-NAME -- powershell


En el contenedor en ejecución, use Set-TimeZone para establecer la zona horaria del
contenedor en ejecución. Por ejemplo:

Azure PowerShell

Set-TimeZone -Id "Russian Standard Time"

Para ver la zona horaria actual del contenedor en ejecución o una lista disponible de zonas
horarias, use Get-TimeZone.
Inicio rápido: Ejecución de un contenedor
personalizado en Azure
Artículo • 03/03/2025

Azure App Serviceen Linux proporciona pilas de aplicaciones predefinidas en Linux compatibles
con lenguajes como .NET, Java, Node.js y PHP. También puede usar una imagen personalizada
de Docker para ejecutar la aplicación web en una pila de aplicaciones aún sin definir en Azure.
En este inicio rápido se muestra cómo implementar una imagen desde Azure Container
Registry (ACR) en App Service.

Para obtener más información sobre las aplicaciones en contenedores en un entorno sin
servidor, consulte Container Apps.

Requisitos previos
Una cuenta de Azure .
Docker .
Visual Studio Code .
La extensión de Azure App Service para VS Code . Puede usar esta extensión para crear,
administrar e implementar Web Apps de Linux en la Plataforma como servicio (PaaS) de
Azure.
La extensión de Docker para VS Code . Puede usar esta extensión para simplificar la
administración de imágenes y comandos locales de Docker e implementar imágenes de
aplicaciones compiladas en Azure.

Creación de un Registro de contenedor


En este inicio rápido se usa Azure Container Registry como registro. Puede usar otros registros,
pero los pasos pueden diferir ligeramente.

Cree un registro de contenedor según las instrucciones que se indican en Inicio rápido:
Creación de un instancia de Azure Container Registry mediante Azure Portal.

) Importante

Asegúrese de establecer la opción Usuario administrador en Habilitar al crear el registro


de contenedor de Azure. También puede establecerla en la sección Claves de acceso de la
página de registro en Azure Portal. Esta opción de configuración es necesaria para el
acceso a App Service. Para obtener información sobre la identidad administrada, consulte
Implementación desde el tutorial de ACR.

Iniciar sesión
1. Inicie Visual Studio Code.

2. Seleccione el logotipo de Azure en la barra de actividades y vaya a CUENTAS e


INQUILINOS. Seleccione Iniciar sesión en Azure y siga las instrucciones.

3. En la barra de estado de la parte inferior, compruebe la dirección de correo electrónico


de la cuenta de Azure. Se debe mostrar la suscripción en el explorador APP SERVICE.

4. En la barra de actividades, seleccione el logotipo de Docker. En el explorador REGISTROS,


compruebe que aparece el registro de contenedor que ha creado.

Comprobación de los requisitos previos


Compruebe que Docker está instalado y en ejecución. El comando siguiente muestra la versión
de Docker si se está ejecutando.

Bash

docker --version

Creación y compilación de una imagen


1. En Visual Studio Code, abra una carpeta vacía y agregue un archivo denominado
Dockerfile. En Dockerfile, pegue el contenido en función del marco de lenguaje deseado:

.NET

En este archivo Dockerfile, la imagen primaria es uno de los contenedores de .NET


integrados de App Service.

Dockerfile

FROM mcr.microsoft.com/appsvc/dotnetcore:lts

ENV PORT 8080


EXPOSE 8080

ENV ASPNETCORE_URLS "http://*:${PORT}"

ENTRYPOINT ["dotnet", "/defaulthome/hostingstart/hostingstart.dll"]

2. Abra la paleta de comandos y escriba Docker Images: Build Image (Imágenes de


Docker: compilar imagen). Seleccione Entrar para ejecutar el comando.

3. En el cuadro de etiqueta de imagen, especifique la etiqueta que desee en el formato


siguiente: <acr-name>.azurecr.io/<image-name>:<tag> , donde <acr-name> es el nombre
del registro de contenedor que ha creado. Seleccione Entrar.

4. Cuando la imagen termine de compilarse, seleccione Actualizar en la parte superior del


explorador IMAGES y compruebe que la imagen se ha compilado correctamente.
Implementación en el registro de contenedor
1. En la barra de actividades, seleccione el icono de Docker. En el explorador IMÁGENES,
busque la imagen compiló.

2. Expanda la imagen, haga clic con el botón derecho en la etiqueta que desee y seleccione
Insertar.

3. Asegúrese de que la etiqueta de imagen comienza por <acr-name>.azurecr.io y pulse


Entrar.

4. Cuando Visual Studio Code finalice la inserción de la imagen en el registro de


contenedor, seleccione Actualizar en la parte superior del explorador REGISTROS y
compruebe que la imagen se ha insertado correctamente.

Implementación en App Service


1. En el explorador REGISTROS, expanda la imagen, haga clic derecho en la etiqueta y
seleccione Implementar imagen en Azure App Service.
2. Siga las indicaciones para elegir una suscripción, un nombre de aplicación globalmente
único, un grupo de recursos y un plan de App Service. Elija B1 Básico como plan de tarifa
y una región cercana.

Después de la implementación, la aplicación está disponible en http://<app-


name>.azurewebsites.net .

Un grupo de recursos es una colección con nombre de todos los recursos de la aplicación en
Azure. Por ejemplo, un grupo de recursos puede contener una referencia a un sitio web, una
base de datos y una función de Azure.

Un plan de App Service define los recursos físicos que se usarán para hospedar el sitio web. En
este inicio rápido se usa un plan de hospedaje de Básico en infraestructura de Linux, lo que
significa que el sitio se hospeda en una máquina Linux junto con otros sitios web. Si empieza
con el plan básico, puede usar Azure Portal para escalar verticalmente de modo que el suyo
sea el único sitio que se ejecute en una máquina. Para conocer los precios, consulte Precios de
App Service .

Exploración del sitio web


El panel Salida muestra el estado de las operaciones de implementación. Cuando finalice la
operación, seleccione Abrir sitio en la notificación emergente para abrir el sitio en el
explorador.

He tenido un problema

Limpieza de recursos
En los pasos anteriores, creó recursos de Azure en un grupo de recursos. Si no cree que vaya a
necesitar estos recursos en el futuro, puede eliminarlos mediante la eliminación del grupo de
recursos.

En el menú de Azure Portal o la página Inicio, seleccione Grupos de recursos. En la página


Grupos de recursos, seleccione myResourceGroup.

En la página myResourceGroup, asegúrese de que los recursos enumerados sean los que
desea eliminar.

Seleccione Eliminar grupo de recursos, escriba myResourceGroup en el cuadro de texto para


confirmar y, después, seleccione Eliminar.
Contenido relacionado
Enhorabuena, ha completado correctamente este inicio rápido

La aplicación de App Service extrae del registro de contenedor cada vez que se inicia. Si
recompila la imagen, solo tiene que insertarla en el registro de contenedor y la aplicación
extrae la imagen actualizada cuando se reinicia. Para indicar a la aplicación que extraiga la
imagen actualizada inmediatamente, reiníciela.

Protección con un certificado y dominio personalizado


Migrar al contenedor de Windows en Azure
Integración de su aplicación con una instancia de Azure Virtual Network
Puntos de conexión privados para aplicaciones de App Service
Introducción a Azure Monitor
Información general sobre la supervisión de aplicaciones para Azure App Service
Cómo usar identidades administradas para App Service y Azure Functions
Configuración de un contenedor personalizado
Tutorial del contenedor Sidecar

Otras extensiones de Azure:

Azure Cosmos DB
Funciones de Azure
Herramientas de la CLI de Azure
Herramientas de Azure Resource Manager
Paquete de extensiones de Azure Tools incluye todas las extensiones de esta lista.
Migración de software personalizado a
Azure App Service mediante un contenedor
personalizado
Artículo • 04/09/2024

Azure App Service usa la tecnología de contenedores de Docker para hospedar imágenes
integradas e imágenes personalizadas. Para ver una lista de imágenes integradas, ejecute el
comando de la CLI de Azure 'az webapp list-runtimes --os linux'. Si esas imágenes no
satisfacen sus necesidades, puede crear e implementar una imagen personalizada.

7 Nota

El contenedor debe tener como destino la arquitectura x86-64. No se admite ARM64.

En este tutorial, aprenderá a:

" Inserte una imagen personalizada de Docker en Azure Container Registry.


" Implemente la imagen personalizada en App Service.
" Configure variables de entorno.
" Extraiga la imagen en App Service mediante una identidad administrada.
" Acceda a los registros de diagnóstico.
" Habilite CI/CD desde Azure Container Registry en App Service.
" Conéctese al contenedor mediante SSH.

Al completar este tutorial, se incurre en un pequeño gasto en la cuenta de Azure para el


registro de contenedor y puede suponer costos adicionales si hospeda el contenedor durante
más de un mes.

Configuración del entorno inicial


En este tutorial se necesita la versión 2.0.80, o versiones posteriores, de la CLI de Azure. Si usa
Azure Cloud Shell, ya está instalada la versión más reciente.

Disponga de una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita .

Use el entorno de Bash en Azure Cloud Shell. Para más información, consulte Inicio rápido
para Bash en Azure Cloud Shell.
Si prefiere ejecutar comandos de referencia de la CLI localmente, instale la CLI de Azure.
Si utiliza Windows o macOS, considere la posibilidad de ejecutar la CLI de Azure en un
contenedor Docker. Para más información, vea Ejecución de la CLI de Azure en un
contenedor de Docker.

Si usa una instalación local, inicie sesión en la CLI de Azure mediante el comando az
login. Siga los pasos que se muestran en el terminal para completar el proceso de
autenticación. Para ver otras opciones de inicio de sesión, consulte Inicio de sesión con
la CLI de Azure.

En caso de que se le solicite, instale las extensiones de la CLI de Azure la primera vez
que la use. Para más información sobre las extensiones, consulte Uso de extensiones
con la CLI de Azure.

Ejecute az version para buscar cuál es la versión y las bibliotecas dependientes que
están instaladas. Para realizar la actualización a la versión más reciente, ejecute az
upgrade.

Instale Docker , el cual se usará para compilar imágenes de Docker. La instalación de


Docker puede requerir reiniciar el equipo.

Después de instalar Docker, abra una ventana de terminal y compruebe que Docker está
instalado:

Bash

docker --version

Clonación o descarga de la aplicación de ejemplo


Puede obtener el ejemplo de este tutorial a través de Git Clone o mediante descarga.

Clonación con Git


Clone el repositorio de ejemplo:

terminal

git clone https://github.com/Azure-Samples/docker-django-webapp-linux.git --config


core.autocrlf=input

Asegúrese de incluir el argumento --config core.autocrlf=input para garantizar los finales de


línea correctos en los archivos que se usan en el contenedor de Linux.
Después, vaya a la carpeta:

terminal

cd docker-django-webapp-linux

Descargar desde GitHub


En lugar de usar git clone, puede visitar https://github.com/Azure-Samples/docker-django-
webapp-linux y seleccionar Código>Local>Descargar ZIP.

Descomprima el archivo ZIP en una carpeta denominada docker-django-webapp-linux.

Después, abra una ventana de terminal en la carpeta docker-django-webapp-linux.

(Opcional) Examen del archivo de Docker


Este es el archivo del ejemplo denominado Dockerfile. Describe la imagen de Docker y contiene
instrucciones de configuración.

Dockerfile

FROM tiangolo/uwsgi-nginx-flask:python3.6

RUN mkdir /code


WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt --no-cache-dir
ADD . /code/

# ssh
ENV SSH_PASSWD "root:Docker!"
RUN apt-get update \
&& apt-get install -y --no-install-recommends dialog \
&& apt-get update \
&& apt-get install -y --no-install-recommends openssh-server \
&& echo "$SSH_PASSWD" | chpasswd

COPY sshd_config /etc/ssh/


COPY init.sh /usr/local/bin/

RUN chmod u+x /usr/local/bin/init.sh


EXPOSE 8000 2222

#CMD ["python", "/code/manage.py", "runserver", "0.0.0.0:8000"]


ENTRYPOINT ["init.sh"]
El primer grupo de comandos instala los requisitos de la aplicación en el entorno.
El segundo grupo de comandos crea un servidor SSH para ofrecer comunicación
segura y mejorada entre el contenedor y el host.
La última línea del archivo, ENTRYPOINT ["init.sh"] , invoca a init.sh para iniciar el
servicio SSH y el servidor de Python.

Compilación y prueba de la imagen de forma local

7 Nota

Docker Hub tiene cuotas para el número de extracciones anónimas por IP y el número
de extracciones autenticadas por usuario gratuito. Si observa que las extracciones de
Docker Hub están limitadas, pruebe docker login si aún no ha iniciado sesión.

1. Ejecute el siguiente comando para compilar la imagen:

Bash

docker build --tag appsvc-tutorial-custom-image .

2. Ejecute el contenedor de Docker de forma local para comprobar que la compilación


funciona:

Bash

docker run -it -p 8000:8000 appsvc-tutorial-custom-image

Este comando docker run especifica el puerto con el argumento -p e incluye el


nombre de la imagen. -it le permite detenerlo con Ctrl+C.

 Sugerencia

Si ejecuta Windows y ve el error standard_init_linux.go:211: exec user process caused


"no such file or directory" (el proceso de usuario ejecutado provocó el error "no existe
dicho archivo o directorio"), el archivo init.sh contiene los finales de línea CRLF en
lugar de los finales LF esperados. Este error se produce si ha usado Git para clonar el
repositorio de ejemplo, pero ha omitido el parámetro --config core.autocrlf=input .
En este caso, vuelva a clonar el repositorio con el argumento --config . También
puede ver el error si editó init.sh y lo guardó con finales CR o LF. En este caso,
guarde el archivo de nuevo solo con los finales LF.

3. Vaya a http://localhost:8000 para comprobar que la aplicación web y el contenedor


funcionan correctamente.

I. Crear una identidad administrada asignada por el


usuario
App Service puede usar una identidad administrada predeterminada o una identidad
administrada asignada por el usuario para autenticarse con un registro de contenedor. En este
tutorial, usará una identidad administrada asignada por el usuario.

CLI de Azure

1. Ejecute el comando az group create para crear un grupo de recursos:

Azure CLI

az group create --name msdocs-custom-container-tutorial --location


westeurope
Puede cambiar el valor de --location para especificar una región cercana.

2. Cree una identidad administrada en el grupo de recursos:

Azure CLI

az identity create --name myID --resource-group msdocs-custom-container-


tutorial

II. Creación de un Registro de contenedor


CLI de Azure

1. Cree un registro de contenedor mediante el comando az acr create siguiente.


Reemplace <registry-name> por un nombre único para el registro. El nombre debe
contener solo letras y números, y debe ser único en todo Azure.

Azure CLI

az acr create --name <registry-name> --resource-group msdocs-custom-


container-tutorial --sku Basic --admin-enabled true

El parámetro --admin-enabled le permite insertar imágenes en el registro mediante


credenciales administrativas.

2. Para recuperar las credenciales administrativas, ejecute el comando az credential acr


show:

Azure CLI

az acr credential show --resource-group msdocs-custom-container-tutorial


--name <registry-name>

La salida JSON de este comando proporciona dos contraseñas junto con el nombre
de usuario del registro.

III. Inserción de la imagen de ejemplo en Azure


Container Registry
En esta sección, va a insertar en Azure Container Registry la imagen que App Service usará más
adelante.

1. Desde el terminal local donde creó la imagen de ejemplo, use el comando docker login
para iniciar sesión en el registro de contenedor:

Bash

docker login <registry-name>.azurecr.io --username <registry-username>

Reemplace <registry-name> y <registry-username> por los valores de los pasos


anteriores. Cuando se le solicite, escriba una de las contraseñas de la sección anterior.

Use el mismo nombre de registro en el resto de pasos de esta sección.

2. Cuando el inicio de sesión se haya realizado correctamente, etiquete la imagen de Docker


local en el registro:

Bash

docker tag appsvc-tutorial-custom-image <registry-name>.azurecr.io/appsvc-


tutorial-custom-image:latest

3. Use el comando docker push para enviar la imagen al registro:

Bash

docker push <registry-name>.azurecr.io/appsvc-tutorial-custom-image:latest

La primera vez que la imagen se carga puede tardar unos minutos, ya que incluye la
imagen base. Las cargas posteriores suelen ser más rápidas.

Mientras espera, puede completar los pasos de la sección siguiente para configurar App
Service de modo que la implementación se haga desde el registro.

IV. Autorización de la identidad administrada para


el registro
La identidad administrada que ha creado aún no tiene autorización para extraer datos del
registro de contenedor. En este paso, habilitará la autorización.

CLI de Azure
1. Recupere el identificador de entidad de seguridad de la identidad administrada:

Azure CLI

principalId=$(az identity show --resource-group msdocs-custom-container-


tutorial --name myID --query principalId --output tsv)

2. Recupere el identificador de recurso del registro de contenedor:

Azure CLI

registryId=$(az acr show --resource-group msdocs-custom-container-


tutorial --name <registry-name> --query id --output tsv)

3. Conceda permiso a la identidad administrada para acceder al registro de contenedor:

Azure CLI

az role assignment create --assignee $principalId --scope $registryId --


role "AcrPull"

Para más información sobre estos permisos, vea ¿Qué es el control de acceso basado
en rol de Azure?.

V. Creación de la aplicación web


CLI de Azure

1. Cree un plan de App Service mediante el comando az appservice plan create:

Azure CLI

az appservice plan create --name myAppServicePlan --resource-group


msdocs-custom-container-tutorial --is-linux

Un plan de App Service corresponde a la máquina virtual que hospeda la aplicación


web. De manera predeterminada, el comando anterior usa un plan de tarifa B1
económico que es gratuito durante el primer mes. Puede especificar el nivel
mediante el parámetro --sku .
2. Cree la aplicación web con el comando az webapp create:

Azure CLI

az webapp create --resource-group msdocs-custom-container-tutorial --plan


myAppServicePlan --name <app-name> --deployment-container-image-name
<registry-name>.azurecr.io/appsvc-tutorial-custom-image:latest

Reemplace <app-name> por un nombre para la aplicación web. El nombre debe ser
único en todo Azure. Reemplace también <registry-name> por el nombre del
registro de la sección anterior.

 Sugerencia

Puede recuperar la configuración del contenedor de la aplicación web en


cualquier momento con el comando az webapp config container show --name
<app-name> --resource-group msdocs-custom-container-tutorial . La imagen se

especifica en la propiedad DOCKER_CUSTOM_IMAGE_NAME . Cuando la aplicación web


se implementa con Azure DevOps o con las plantillas de Azure Resource
Manager, la imagen también puede aparecer en una propiedad denominada
LinuxFxVersion . Ambas propiedades tienen el mismo propósito. Si ambas están

presentes en la configuración de la aplicación web, LinuxFxVersion tiene


prioridad.

VI. Configuración de la aplicación web


En este paso, configurará la aplicación web de la siguiente manera:

Configure la aplicación para enviar solicitudes al puerto 8000. El contenedor de ejemplo


escucha las solicitudes web en el puerto 8000.
Indique a la aplicación que use la identidad administrada para extraer imágenes del
registro de contenedor.
Configure la implementación continua desde el registro de contenedor (cada inserción de
imagen en el registro provocará que la aplicación extraiga la nueva imagen). Este
elemento no es necesario para que la aplicación web extraiga del registro de contenedor,
pero puede permitir que la aplicación web sepa cuándo se inserta una nueva imagen en
el registro. Sin ella, debe desencadenar manualmente una extracción de imágenes
reiniciando la aplicación web.
CLI de Azure

1. Use az webapp config appsettings set para establecer la variable de entorno


WEBSITES_PORT según lo esperado por el código de la aplicación:

Azure CLI

az webapp config appsettings set --resource-group msdocs-custom-


container-tutorial --name <app-name> --settings WEBSITES_PORT=8000

Reemplace <app-name> por el valor que usó en el paso anterior.

2. Habilite la identidad administrada asignada por el usuario en la aplicación web con el


comando az webapp identity assign:

Azure CLI

id=$(az identity show --resource-group msdocs-custom-container-tutorial -


-name myID --query id --output tsv)
az webapp identity assign --resource-group msdocs-custom-container-
tutorial --name <app-name> --identities $id

Reemplace <app-name> por el valor que usó en el paso anterior.

3. Configure la aplicación para extraer de Azure Container Registry mediante


identidades administradas.

Azure CLI

appConfig=$(az webapp config show --resource-group msdocs-custom-


container-tutorial --name <app-name> --query id --output tsv)
az resource update --ids $appConfig --set
properties.acrUseManagedIdentityCreds=True

Reemplace <app-name> por el valor que usó en el paso anterior.

4. Establezca el identificador de cliente que usa la aplicación web para extraer de Azure
Container Registry. Este paso no es necesario si usa la identidad administrada
asignada por el sistema.

Azure CLI

clientId=$(az identity show --resource-group msdocs-custom-container-


tutorial --name myID --query clientId --output tsv)
az resource update --ids $appConfig --set
properties.AcrUserManagedIdentityID=$clientId

5. Habilite CI/CD en App Service.

Azure CLI

cicdUrl=$(az webapp deployment container config --enable-cd true --name


<app-name> --resource-group msdocs-custom-container-tutorial --query
CI_CD_URL --output tsv)

CI_CD_URL es una dirección URL que App Service genera automáticamente. El

registro debe usar esta dirección URL para notificar a App Service que se ha
producido una inserción de imagen. En realidad, no crea el webhook
automáticamente.

6. Cree un webhook en el registro de contenedor mediante la dirección CI_CD_URL que


obtuvo en el último paso.

Azure CLI

az acr webhook create --name appserviceCD --registry <registry-name> --


uri $cicdUrl --actions push --scope appsvc-tutorial-custom-image:latest

7. Para probar si el webhook está configurado correctamente, haga ping en el webhook


y compruebe si obtiene una respuesta 200 OK.

Azure CLI

eventId=$(az acr webhook ping --name appserviceCD --registry <registry-


name> --query id --output tsv)
az acr webhook list-events --name appserviceCD --registry <registry-name>
--query "[?id=='$eventId'].eventResponseMessage"

 Sugerencia

Para ver toda la información sobre todos los eventos de webhook, quite el
parámetro --query .

Si transmite el registro de contenedor, debería ver un mensaje Starting


container for site después del ping en el webhook porque el webhook

desencadena el reinicio de la aplicación.


VII. Navegación hasta la aplicación web
CLI de Azure

Para probar la aplicación, vaya a https://<app-name>.azurewebsites.net . Reemplace <app-


name> por el nombre de la aplicación web.

La primera vez que intente acceder a la aplicación, es posible que tarde algún tiempo en
responder porque App Service debe extraer toda la imagen del registro. Si el tiempo del
explorador se agota, simplemente actualice la página. Una vez que se extraiga la imagen inicial,
las pruebas posteriores se ejecutarán mucho más rápido.

VIII. Acceso a los registros de diagnóstico


CLI de Azure

Mientras espera a que App Service extraiga la imagen, resulta útil para ver exactamente lo
que hace App Service transmitiendo los registros del contenedor al terminal.

1. Active el registro de contenedor:


Azure CLI

az webapp log config --name <app-name> --resource-group msdocs-custom-


container-tutorial --docker-container-logging filesystem

2. Habilite el streaming de registro:

Azure CLI

az webapp log tail --name <app-name> --resource-group msdocs-custom-


container-tutorial

Si no ve los registros de la consola de inmediato, vuelve a comprobarlo en 30


segundos.

También puede inspeccionar los archivos de registro desde el explorador en


https://<app-name>.scm.azurewebsites.net/api/logs/docker .

3. Para detener el streaming de registro en cualquier momento, presione Ctrl+C.

IX. Modificación del código de la aplicación y


nueva implementación
En esta sección, realizará un cambio en el código de la aplicación web, reconstruirá la imagen
y, a continuación, lo enviará al registro de contenedor. A continuación, App Service extrae
automáticamente la imagen actualizada del registro para actualizar la aplicación web en
ejecución.

1. En la carpeta local docker-django-webapp-linux, abra el archivo


app/templates/app/index.html.

2. Cambie el primer elemento HTML para que coincida con el código siguiente.

HTML

<nav class="navbar navbar-inverse navbar-fixed-top">


<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="#">Azure App Service - Updated Here!</a>
</div>
</div>
</nav>
3. Guarde los cambios.

4. Cambie a la carpeta docker-django-webapp-linux y vuelva a generar la imagen:

Bash

docker build --tag appsvc-tutorial-custom-image .

5. Actualice la etiqueta de la imagen a latest :

Bash

docker tag appsvc-tutorial-custom-image <registry-name>.azurecr.io/appsvc-


tutorial-custom-image:latest

Reemplace <registry-name> por el nombre del registro.

6. Inserte la imagen en el registro:

Bash

docker push <registry-name>.azurecr.io/appsvc-tutorial-custom-image:latest

7. Una vez que se complete la inserción de la imagen, el webhook notifica a App Service la
inserción y App Service intenta extraer la imagen actualizada. Espere unos minutos y, a
continuación, compruebe que la actualización se ha implementado. Para ello, vaya a
https://<app-name>.azurewebsites.net .

X. Conexión al contenedor con SSH


SSH habilita la comunicación segura mejorada entre un contenedor y un cliente. Para habilitar
una conexión SSH al contenedor, debe configurar la imagen personalizada para ello. Una vez
que el contenedor esté en ejecución, puede abrir una conexión SSH.

Configuración del contenedor para SSH


La aplicación de ejemplo que se usa en este tutorial ya tiene la configuración necesaria en el
archivo Dockerfile que instala el servidor SSH y que también establece las credenciales de inicio
de sesión. Esta sección solo es meramente informativa. Para conectarse al contenedor, vaya a la
sección siguiente.

Dockerfile
ENV SSH_PASSWD "root:Docker!"
RUN apt-get update \
&& apt-get install -y --no-install-recommends dialog \
&& apt-get update \
&& apt-get install -y --no-install-recommends openssh-server \
&& echo "$SSH_PASSWD" | chpasswd

7 Nota

Esta configuración no permite realizar conexiones externas al contenedor. SSH solo está
disponible en el sitio de Kudu/SCM. El sitio de Kudu/SCM se autentica con la cuenta de
Azure. root:Docker! no se debe modificar al usar SSH. SCM/KUDU usará las credenciales
de Azure Portal. Al cambiar este valor, se producirá un error al usar SSH.

El archivo Dockerfile también copia el archivo sshd_config en la carpeta /etc/ssh/ y expone el


puerto 2222 en el contenedor:

Dockerfile

COPY sshd_config /etc/ssh/

# ...

EXPOSE 8000 2222

Se trata de un puerto interno al que solo pueden acceder los contenedores que se encuentren
en la red puente de una red privada virtual.

Por último, el script de entrada, init.sh, inicia el servidor SSH.

Bash

#!/bin/bash
service ssh start

Apertura de la conexión SSH al contenedor

CLI de Azure

1. Vaya a https://<app-name>.scm.azurewebsites.net/webssh/host e inicie sesión con su


cuenta de Azure. Reemplace <app-name> por el nombre de la aplicación web.
2. Una vez que haya iniciado sesión, se le redirigirá a una página de información de la
aplicación web. Seleccione SSH en la parte superior de la página para abrir el shell y
usar los comandos.

Por ejemplo, puede examinar los procesos que se ejecutan dentro de la aplicación
mediante el comando top .

XI. Limpieza de recursos


CLI de Azure

Los recursos que creó en este artículo pueden incurrir en costos continuos. Para limpiar los
recursos, solo tiene que eliminar el grupo de recursos que los contiene:

Azure CLI

az group delete --name msdocs-custom-container-tutorial

Pasos siguientes
¿Qué ha aprendido?

" Inserte una imagen personalizada de Docker en Azure Container Registry.


" Implemente la imagen personalizada en App Service.
" Configure variables de entorno.
" Extraiga la imagen en App Service mediante una identidad administrada.
" Acceda a los registros de diagnóstico.
" Habilite CI/CD desde Azure Container Registry en App Service.
" Conéctese al contenedor mediante SSH.

En el tutorial siguiente, aprenderá a proporcionar seguridad para la aplicación con un dominio


personalizado y un certificado.

Protección con un certificado y dominio personalizado

O bien, eche un vistazo a otros recursos:

Configurar un contenedor personalizado


Tutorial: Configuración de un contenedor sidecar para un contenedor personalizado en
Azure App Service (versión preliminar)
Soluciones de contenedor de Windows
Artículo • 23/01/2025

Microsoft proporciona soluciones para contenedores de Windows con las imágenes


base de Windows Server 2022 más recientes para ayudar a nuestros consumidores a
empezar. Se trata de una colección de ejemplos en torno a marcos de aplicaciones,
lenguajes de programación, bases de datos e herramientas de integración continua (CI)
e infraestructura. Estos ejemplos se proporcionan tal cual y sin garantías ni garantías
realizadas. No dude en contribuir a ejemplos adicionales o enviar una solicitud de
incorporación de cambios para ayudar a mejorar el repositorio actual.

¿Qué son los contenedores de Windows?


Los contenedores son una tecnología para empaquetar y ejecutar aplicaciones de
Windows y Linux en diversos entornos locales y en la nube. Los contenedores
proporcionan un entorno ligero y aislado que facilita el desarrollo, implementación y
administración de las aplicaciones. Los contenedores se inician y detienen rápidamente,
por lo que son ideales para las aplicaciones que necesitan adaptarse rápidamente a la
demanda cambiante.

Todos los contenedores se crean a partir de imágenes de contenedor. Una imagen de


contenedor es un conjunto de archivos organizados en una pila de capas que se
hospeda en el equipo local o en un registro de contenedor remoto. Las imágenes de
contenedor usadas en los ejemplos descritos en este tema son imágenes basadas en
Windows Server, Windows Server Core y Nano Server:

Windows Server contiene el conjunto completo de API de Windows y servicios del


sistema.
Windows Server Core es una imagen más pequeña que contiene un subconjunto
de las API de Windows Server, es decir, el marco completo de .NET. También
incluye la mayoría, pero no todos, los roles de servidor (por ejemplo, el servidor de
fax no está incluido).
Nano Server es la imagen de Windows Server más pequeña e incluye
compatibilidad con las API de .NET Core y algunos roles de servidor.

Las imágenes base de Windows usadas para los ejemplos de contenedor son Windows
Server 2022, que se publicó en agosto de 2021. Los ejemplos le ayudan a empezar a
usar contenedores de Windows, por ejemplo, uno de los ejemplos le ayuda a instalar
bits de Python dentro de un contenedor de Windows.
Soluciones de contenedor
Use las pestañas de categorías siguientes para obtener información sobre cómo
aprovechar los contenedores de Windows con las imágenes base de Windows Server
más recientes en el desarrollo de aplicaciones. Los ejemplos proporcionados se ajustan
a seis categorías y se actualizan para reflejar los cambios de versión recientes, así como
la siguiente imagen de contenedor del sistema operativo base de Windows Server en
Docker Hub:

Windows Server
Windows Server Core
Nano Server

7 Nota

También puede usar guías de implementación paso a paso para ayudarle a


implementar una solución de ejemplo. Cada guía también puede hacer referencia a
un ejemplo de código complementario.

Marcos de trabajo de aplicaciones

aspnet

iis

iis-arr

iis-https

iis-php

Django

apache-http

apache-http-php

nginx

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Configuración de contenedores de Linux
en Windows
Artículo • 05/02/2025

Los contenedores de Linux constituyen un gran porcentaje del ecosistema de


contenedores general y son fundamentales para las experiencias de desarrollo y los
entornos de producción. Dado que los contenedores comparten un kernel con el host
de contenedor, la ejecución de contenedores de Linux directamente en Windows no es
una opción. Aquí es donde la virtualización entra en la imagen.

El ejercicio le guía por la creación y ejecución de contenedores de Linux en Windows 10


y Windows 11.

En este inicio rápido, harás lo siguiente:

1. Instalación de Docker Desktop


2. Ejecución de un contenedor de Linux sencillo

Prerrequisitos
Asegúrese de cumplir los siguientes requisitos:

Un sistema de equipo físico que ejecuta Windows 10 Professional, Windows 10


Enterprise o posterior. O Windows Server 2019, versión 1809 o posterior
Asegúrese de que Hyper-V está habilitado.

Instalación de Docker Desktop


Instale Docker Desktop en Windows.

Ejecución del primer contenedor de Linux


Para ejecutar contenedores de Linux, debe asegurarse de que Docker tiene como
destino el demonio correcto. Para alternar esto, seleccione Switch to Linux Containers
en el menú de acciones al hacer clic en el icono de ballena de Docker en la bandeja del
sistema. Si ve Switch to Windows Containers , entonces ya apunta al demonio de Linux.
Una vez que haya confirmado que tiene como destino el demonio correcto, ejecute el
contenedor con el siguiente comando:

Consola

docker run --rm busybox echo hello_world

El contenedor se ejecuta, imprime "hello_world" y, a continuación, se cierra.

Al consultar docker images , verá la imagen de contenedor de Linux que acaba de


extraer y ejecutar:

Consola

docker images

REPOSITORY TAG IMAGE ID CREATED


SIZE
busybox latest 59788edf1f3e 4 weeks ago
3.41MB

Pasos siguientes
Aprenda a compilar una aplicación de ejemplo

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Usar contenedores con el Programa
Windows Insider
Artículo • 23/01/2025

En este tema recorrerás el proceso de implementación y el uso de la función de


contenedor de Windows en la última compilación para Insider de Windows Server desde
el programa Windows Insider Preview. Durante este ejercicio, instalarás el rol de
contenedor e implementará una edición de vista previa de las imágenes de sistema
operativo base. Si necesitas familiarizarte con los contenedores, encontrarás esta
información en Acerca de los contenedores.

Únase al Programa Windows Insider


Para ejecutar la versión de Insider de los contenedores de Windows, debes tener un
host que ejecute la última compilación de Windows Server del Programa Windows
Insider o la compilación más reciente de Windows 10 del Programa Windows Insider.
Únete al Programa Windows Insider y revisa los términos de uso.

) Importante

Para poder usar la imagen base que se describe a continuación, tienes que usar una
compilación de Windows Server del programa Windows Server Insider Preview, o
una compilación de Windows 10 del programa Windows Insider Preview. Si no usas
alguna de estas compilaciones, el estas imágenes base no permitirán iniciar un
contenedor.

Instalar Docker
Si aún no tienes Docker instalado, sigue la guía de introducción para instalar Docker.

Extracción de una imagen de contenedor de


Insider
Al formar parte del Programa Windows Insider, también puedes usar nuestras
compilaciones más recientes para las imágenes base. Especifica la imagen de
compilación de Insider que quieres usar en el comando docker pull , por ejemplo,
mcr.microsoft.com/windows/server/insider:10.0.{build}.{revision} .
Para recuperar la imagen base de Insider de Windows Server, ejecute lo siguiente:

Consola

docker pull mcr.microsoft.com/windows/server/insider:10.0.20348.1

Para recuperar la imagen base de Insider de Nano Server, ejecute lo siguiente:

Consola

docker pull mcr.microsoft.com/windows/nanoserver/insider:10.0.20348.1

Para recuperar la imagen base de Core Insider de Windows Server, ejecute lo siguiente:

Consola

docker pull mcr.microsoft.com/windows/servercore/insider:10.0.20348.1

Para ver todas las imágenes base de Insider disponibles, consulta Imágenes base para
usuarios de Windows Insider.

) Importante

Se recomienda leer CLUF de la imagen base del SO Windows y los Términos de


uso del Programa Windows Insider.

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Administrador de trabajos de impresión
en contenedores de Windows
Artículo • 05/02/2025

Las aplicaciones con una dependencia de los servicios de impresión se pueden incluir
correctamente en contenedores de Windows. Hay requisitos especiales que deben
cumplirse para habilitar correctamente la funcionalidad del servicio de impresora. En
esta guía se explica cómo configurar correctamente la implementación.

) Importante

Aunque obtener acceso a los servicios de impresión correctamente en


contenedores funciona, la funcionalidad está limitada en forma; Es posible que
algunas acciones relacionadas con la impresión no funcionen. Por ejemplo, las
aplicaciones que dependen de la instalación de controladores de impresora en el
host no se pueden incluir en contenedores porque no se admite la instalación de
controladores desde dentro de un contenedor. Abra un comentario a
continuación si encuentra una característica de impresión no compatible que
quiera admitir en los contenedores.

Configuración
El host debe ser Windows Server 2019 o Windows 10 Pro/Enterprise, actualización
de octubre de 2018 o posterior.
Use la imagen base de para contenedores de Windows o la imagen base de para
contenedores de Windows Server . Otras imágenes base de contenedor de
Windows (como Nano Server y Windows Server Core) no llevan el rol de servidor
de impresión.

Hyper-V Aislamiento
Se recomienda ejecutar el contenedor con aislamiento de Hyper-V. Cuando se ejecuta
en este modo, puede tener tantos contenedores como quiera ejecutar con acceso a los
servicios de impresión. No es necesario modificar el servicio de administrador de
trabajos en cola en el servidor host.

Puede comprobar la funcionalidad con la siguiente consulta de PowerShell:


PowerShell

PS C:\Users\Administrator> docker run -it --isolation hyperv


mcr.microsoft.com/windows:1809 powershell.exe
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\> Get-Service spooler

Status Name DisplayName


------ ---- -----------
Running spooler Print Spooler

PS C:\> Get-Printer

Name ComputerName Type DriverName


PortName Shared Published
---- ------------ ---- ----------
-------- ------ --------
Microsoft XPS Document Writer Local Microsoft XPS
Document... PORTPROMPT: False False
Microsoft Print to PDF Local Microsoft Print
To PDF PORTPROMPT: False False
Fax Local Microsoft Shared
Fax D... SHRFAX: False False

PS C:\>

Aislamiento de procesos
Debido a la naturaleza del kernel compartido de los contenedores con aislamiento de
procesos, el comportamiento actual limita al usuario a ejecutar solo una instancia del
servicio de administrador de trabajos en cola de impresora en todo el host y todos sus
contenedores secundarios. Si el host tiene el administrador de trabajos en cola de la
impresora en ejecución, debe detener el servicio en el host antes de intentar iniciar el
servicio de impresora en el invitado.

 Sugerencia

Si inicia un contenedor y consulta el servicio de administrador de trabajos en cola


tanto en el contenedor como en el host simultáneamente, ambos informarán que
su estado es "en ejecución". Pero no se engaña: el contenedor no podrá consultar
una lista de impresoras disponibles. El servicio de administrador de trabajos en cola
del host no se debe ejecutar.
Para comprobar si el host ejecuta el servicio de impresora, use la consulta en PowerShell
siguiente:

PowerShell

PS C:\Users\Administrator> Get-Service spooler

Status Name DisplayName


------ ---- -----------
Running spooler Print Spooler

PS C:\Users\Administrator>

Para detener el servicio de administrador de trabajos en cola en el host, use los


siguientes comandos en PowerShell:

PowerShell

Stop-Service spooler
Set-Service spooler -StartupType Disabled

Inicie el contenedor y compruebe el acceso a las impresoras.

PowerShell

PS C:\Users\Administrator> docker run -it --isolation process


mcr.microsoft.com/windows:1809 powershell.exe
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\> Get-Service spooler

Status Name DisplayName


------ ---- -----------
Running spooler Print Spooler

PS C:\> Get-Printer

Name ComputerName Type DriverName


PortName Shared Published
---- ------------ ---- ----------
-------- ------ --------
Microsoft XPS Document Writer Local Microsoft XPS
Document... PORTPROMPT: False False
Microsoft Print to PDF Local Microsoft Print
To PDF PORTPROMPT: False False
Fax Local Microsoft Shared
Fax D... SHRFAX: False False
PS C:\>

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Adición de paquetes de fuentes
opcionales a contenedores de Windows
Artículo • 23/01/2025

En un esfuerzo por mejorar el rendimiento general de los contenedores de Windows,


hemos quitado muchos componentes de las imágenes de contenedor base de
Windows, incluidos componentes como fuentes, que en la mayoría de los casos no son
relevantes. Sin embargo, es posible que algunos escenarios necesiten estas fuentes para
que las aplicaciones funcionen correctamente.

Preparación del entorno


Cuando se quitan las fuentes de la imagen de contenedor base de Server Core, también
se ha quitado la característica que instala nuevas fuentes. A medida que compila la
imagen de contenedor, debe incorporar los pasos siguientes para volver a agregar la
característica necesaria a los contenedores de Windows. En primer lugar, necesita un
host o máquina virtual de Windows Server 2019 o 2022 actualizado como host de
contenedor. La restauración de características eliminadas requiere medios actualizados.

7 Nota

Hay varias maneras de adquirir medios de instalación actualizados, pero lo más


sencillo es tomar una máquina virtual de Windows Server 2019 o 2022 y dejar que
Windows Update lo ponga al día. También necesita una ISO del medio original de
Windows Server 2019 o 2022 RTM. Esta imagen se puede adquirir a través de una
suscripción de Visual Studio o un Centro de servicios de licencias por
volumen .

Para preparar el entorno, necesita un host de contenedor de Windows configurado


correctamente y compartir el directorio %windir%\WinSxS. También debe compartir el
directorio %windir%\WinSxS. En este ejemplo, creamos un usuario local con una
contraseña generada aleatoriamente:

Para el símbolo del sistema:

Consola

net user ShareUser <password> /ADD


net share WinSxS=%windir%\WinSxS /grant:ShareUser,READ
Para PowerShell:

PowerShell

net user ShareUser ‘<password>’ /ADD


net share WinSxS=${env:windir}\WinSxS /grant:ShareUser,READ

A continuación, monte el medio RTM.

Para el símbolo del sistema:

Consola

set imagePath=<path to RTM ISO>


powershell Mount-DiskImage -ImagePath %imagePath%
set driveLetter=<drive letter of the mounted ISO>
set repairMountDir=%SystemDrive%\repair
mkdir repairMountDir
dism /mount-image /imagefile:"%driveLetter%\sources\install.wim" /index:1
/mountdir:%repairMountDir%
net share RTM=%repairMountDir% /grant:ShareUser,READ

Para PowerShell:

PowerShell

$imagePath = <path to RTM ISO>


Mount-DiskImage -ImagePath $imagePath
# Find the drive letter of the mounted ISO
$driveLetter = <drive letter of mounted ISO>
$repairMountDir = "${env:systemdrive}\repair"
mkdir $repairMountDir
dism /mount-image /imagefile:"$driveLetter\sources\install.wim" /index:1
/mountdir:$repairMountDir
net share RTM=$repairMountDir /grant:ShareUser,READ

7 Nota

Asegúrese de que se especifica el índice de imagen 1 al montar el medio RTM.

A continuación, cree un archivo denominado InstallFonts.cmd y agregue el siguiente


contenido:

Consola

REM Connect to the WinSxS share on the container host


for /f "tokens=3 delims=: " %%g in ('netsh interface ip show address ^|
findstr /c:"Default Gateway"') do set GATEWAY=%%g
net use o: \\%GATEWAY%\WinSxS /user:ShareUser %SHARE_PW%
net use r: \\%GATEWAY%\RTM /user:ShareUser %SHARE_PW%if errorlevel 1 goto
:eof

dism /online /enable-feature /featurename:ServerCoreFonts-NonCritical-Fonts-


MinConsoleFonts /Source:O:\ /Source:R:\ /LimitAccess
dism /online /enable-feature /featurename:ServerCoreFonts-NonCritical-Fonts-
Support /Source:O:\ /Source:R:\ /LimitAccess
dism /online /enable-feature /featurename:ServerCoreFonts-NonCritical-Fonts-
BitmapFonts /Source:O:\ /Source:R:\ /LimitAccess
dism /online /enable-feature /featurename:ServerCoreFonts-NonCritical-Fonts-
TrueType /Source:O:\ /Source:R:\ /LimitAccess
dism /online /enable-feature /featurename:ServerCoreFonts-NonCritical-Fonts-
UAPFonts /Source:O:\ /Source:R:\ /LimitAccess

Ahora puede agregar el contexto al dockerfile. A continuación se muestra un ejemplo:

Dockerfile

FROM mcr.microsoft.com/windows/servercore:ltsc2022
ARG SHARE_PW=
WORKDIR /install
COPY InstallFonts.cmd .
RUN InstallFonts.cmd

Con un dockerfile en su lugar, puede compilar y etiquetar la imagen de contenedor


mediante:

Consola

docker build -t <newname:tag> --build-arg SHARE_PW=<password> .

Obtiene SHARE_PW en el seguimiento de compilación, pero, si lo configura como una


cadena generada aleatoriamente para cada compilación, no está filtrando un secreto
real. Además, una vez completada la compilación, puede limpiar el recurso compartido y
el usuario mediante:

Consola

net share WinSxS /delete


net user ShareUser /delete

Ejecución de la carga de trabajo


Debido a una limitación en el modo en que los contenedores de Server Core controlan
las fuentes, es preciso indicar específicamente a Windows las nuevas fuentes disponibles
en el contenedor. Debe ejecutar un script de PowerShell después de iniciar el
contenedor y antes de ejecutar la carga de trabajo. Se recomienda llamarlo
LoadFonts.ps1:

PowerShell

$fontCSharpCode = @'
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;
namespace FontResource
{
public class AddRemoveFonts
{
[DllImport("gdi32.dll")]
static extern int AddFontResource(string lpFilename);
public static int AddFont(string fontFilePath) {
try
{
return AddFontResource(fontFilePath);
}
catch
{
return 0;
}
}
}
}
'@

Add-Type $fontCSharpCode

foreach($font in $(gci C:\Windows\Fonts))


{

Write-Output "Loading $($font.FullName)"


[FontResource.AddRemoveFonts]::AddFont($font.FullName) | Out-Null

Microsoft espera eliminar esta limitación en una versión futura de Windows, pero el
script es necesario para las versiones actuales de Windows Server 2019 y 2022. Una vez
que haya compilado el contenedor como se describe aquí y ejecute este script dentro
del contenedor, todas las fuentes presentes en Windows Server Core están disponibles
para la carga de trabajo en contenedor.
Problemas al agregar fuentes
Si tiene problemas al habilitar fuentes en imágenes de contenedor de Server Core,
háganoslo saber en la sección Problemas de nuestro repositorio de GitHub .

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Configuración de la extensión de
contenedores en Windows Admin
Center
Artículo • 23/01/2025

En este tema se describe cómo configurar la extensión Containers en Windows Admin


Center. Para obtener más información sobre cómo instalar y configurar Windows Admin
Center, así como cómo dirigirse a servidores remotos, consulte la documentación de
Windows Admin Center.

Instalación de la extensión Containers en


Windows Admin Center
1. En la instancia de Windows Admin Center, seleccione el botón Configuración en la
parte superior derecha y, a continuación, en el panel izquierdo, en Puerta de
enlace, seleccione Extensiones.

2. En la pestaña Extensiones disponibles , seleccione la extensión Containers de la


lista.

3. Haga clic en Instalar para instalar la extensión.

Windows Admin Center se actualizará y, una vez completada, la extensión aparecerá en


la pestaña Extensiones instaladas.
Pasos siguientes
Administración de imágenes de contenedor en Windows Admin Center

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Administración de imágenes de
contenedor en Windows Admin Center
Artículo • 23/01/2025

En este tema se describe cómo administrar imágenes de contenedor en Windows


Admin Center. Las imágenes de contenedor se usan para crear nuevos contenedores en
máquinas Windows u otros servicios en la nube, como Azure Kubernetes Service. Para
obtener más información sobre las imágenes de Windows, consulte Introducción a las
imágenes de contenedor.

Extracción de imágenes de contenedor


Después de implementar un host de contenedor, el siguiente paso consiste en extraer (o
descargar) imágenes de contenedor para que se puedan crear nuevos contenedores a
partir de las imágenes. Puede usar Windows Admin Center para extraer nuevas
imágenes de contenedor seleccionando la extensión Containers en el host de
contenedor de destino. A continuación, seleccione la pestaña Imágenes dentro de la
extensión Contenedor en Host de contenedor y seleccione la opción Extracción .
En la configuración De imagen de contenedor de extracción, proporcione la dirección
URL de la imagen y la etiqueta de la imagen que desea extraer. También puede
seleccionar la opción para extraer todas las imágenes etiquetadas en ese repositorio.

Si la imagen que desea extraer está en un repositorio privado, proporcione el nombre


de usuario y la contraseña para autenticarse en ese repositorio. Si el repositorio se
hospeda en Azure Container Registry, use la autenticación nativa de Azure en Windows
Admin Center para acceder a la imagen. Esto requiere que la instancia de Windows
Admin Center se conecte a Azure y se autentique con su cuenta de Azure. Para más
información sobre cómo conectar una instancia de Windows Admin Center a Azure,
consulte Configuración de la integración de Azure.

Si no está seguro de la imagen que se va a extraer, Windows Admin Center proporciona


una lista de imágenes comunes de Microsoft. Seleccione la lista desplegable Imágenes
comunes de Windows para ver una lista de imágenes base que se extraen
normalmente. Seleccione la imagen que desea extraer y Windows Admin Center
rellenará los campos de repositorio y etiqueta.

Insertar imágenes de contenedor


Una vez creada la imagen de contenedor, se recomienda insertar esa imagen en un
repositorio centralizado para permitir que otros hosts de contenedor o servicios en la
nube extraigan la imagen.

En la pestaña Imágenes de la extensión Contenedores de Windows Admin Center,


seleccione la imagen que desea insertar y haga clic en Insertar.
En la configuración insertar imagen de contenedor , puede cambiar el nombre y la
etiqueta de la imagen antes de insertarla (cargarla). También puede elegir si insertarlo
en un repositorio genérico o en un repositorio en Azure Container Registry. Para un
repositorio genérico, deberá proporcionar un nombre de usuario y una contraseña. Para
Azure Container Registry, puede usar la autenticación integrada en Windows Admin
Center. En Azure, también puede seleccionar en qué suscripción y registro desea insertar
la imagen.
Pasos siguientes
Creación de contenedores en Windows Admin Center

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Ejecución de nuevos contenedores
mediante Windows Admin Center
Artículo • 23/01/2025

Windows Admin Center ayuda a ejecutar contenedores localmente en el host de


contenedor.

1. En Windows Admin Center con la extensión Containers instalada, abra el host de


contenedor que desea administrar.

2. En Herramientas en el panel izquierdo, seleccione la extensión Contenedores .

3. Seleccione la pestaña Imágenes en Host de contenedor.

4. Seleccione la imagen que desea ejecutar y haga clic en Ejecutar.


5. En Ejecutar imagen, puede especificar la configuración relacionada con el
contenedor:

Nombre del contenedor: se trata de una entrada opcional. Puede


proporcionar un nombre de contenedor para ayudarle a realizar un
seguimiento del contenedor que creó; de lo contrario, Docker proporcionará
un nombre genérico.
Tipo de aislamiento: puede optar por usar el hipervisor en lugar del
aislamiento de proceso predeterminado. Para obtener más información sobre
los modos de aislamiento para contenedores de Windows, consulte Modos
de aislamiento.
Publicar puertos: de forma predeterminada, los contenedores de Windows
usan NAT para el modo de red. Esto significa que un puerto en el host del
contenedor se asignará al contenedor. Esta opción permite especificar esa
asignación.
Asignación de memoria y recuento de CPU: puede especificar cuánta
memoria y cuántas CPU debe poder usar un contenedor. Esta opción no
asigna la memoria asignada ni la CPU al contenedor. En su lugar, esta opción
especifica la cantidad máxima que podrá asignar un contenedor.
Agregar: también puede anexar parámetros de ejecución de Docker que no
están en la interfaz de usuario, como -v para el volumen persistente. Para
más información sobre los parámetros de ejecución de Docker disponibles,
consulte la documentación de Docker .

6. Una vez que haya terminado de configurar el contenedor, seleccione Ejecutar.


Puede ver el estado de los contenedores en ejecución en la pestaña Contenedores
:

Pasos siguientes
Administrar Azure Container Registry en Windows Admin Center
Comentarios
¿Le ha resultado útil esta página?  Sí  No
Creación de imágenes de contenedor en
Windows Admin Center
Artículo • 23/01/2025

En este tema se describe cómo crear nuevas imágenes de contenedor mediante


Windows Admin Center. Las imágenes de contenedor se usan para crear nuevos
contenedores en máquinas Windows u otros servicios en la nube, como Azure
Kubernetes Service. Para obtener más información sobre las imágenes de Windows,
consulte Introducción a las imágenes de contenedor.

Creación de nuevas imágenes de contenedores


Al trabajar con contenedores, escribirá instrucciones en Docker sobre cómo funciona la
imagen de contenedor y, después, Docker creará una nueva imagen de contenedor en
función de estas instrucciones. Estas instrucciones se guardan en un archivo
denominado "Dockerfile" que se guarda en la misma carpeta en la que reside la
aplicación.

Windows Admin Center puede reducir considerablemente la sobrecarga de escribir


dockerfiles o incluso quitar la necesidad de escribir estos archivos por completo. Para
empezar, en la extensión Containers , seleccione la opción Crear nuevo en la pestaña
Imágenes .

Al crear una nueva imagen de contenedor, tiene diferentes opciones entre las que
elegir:
Usar un Dockerfile existente: esta opción permite recompilar una nueva imagen
de contenedor basada en un Dockerfile existente. Esto resulta útil cuando necesita
realizar pequeños cambios en un Dockerfile existente o cuando necesite volver a
crear el contenedor para detectar una actualización de la aplicación.
Carpeta de aplicación web de IIS/aplicación web estática: use esta opción para
crear una nueva imagen de contenedor mediante la imagen base de IIS. El
contenido de la carpeta se copia en la imagen de contenedor para agregarlo como
sitio web. No se agrega ningún marco con esta opción.
Aplicación web de IIS o solución de Visual Studio (ASP.NET):use esta opción para
crear una nueva imagen de contenedor basada en una solución de Visual Studio
existente. Esta opción usa un enfoque de fase de varias imágenes para almacenar
provisionalmente la aplicación, compilar los archivos binarios necesarios y
almacenar solo los recursos necesarios en la imagen final. La imagen de
contenedor ASP.NET se usa como imagen base. Esta opción también solicita la
carpeta en la que reside Visual Studio. Esto le permite ver una lista de los
proyectos existentes y puede seleccionar el que desea incluir en contenedor.
Aplicación web de IIS/Web Deploy (archivo Zip exportado): use esta opción para
crear una imagen de contenedor a partir de los artefactos exportados desde un
servidor en ejecución. Puede usar Web Deploy para exportar la aplicación a un
archivo Zip y, a continuación, usar Windows Admin Center para crear una nueva
imagen de contenedor basada en el archivo Zip exportado. La imagen de
contenedor ASP.NET se usa como imagen base.

Una vez que seleccione el tipo de aplicación que desea incluir en contenedores, puede
seleccionar opciones comunes para finalizar la creación de la imagen:

Versión del marco: tanto la solución de Visual Studio como las opciones Web
Deploy usan la imagen de ASP.NET como base para la imagen de contenedor. Sin
embargo, puede seleccionar qué versión de .NET Framework desea usar para dar
cabida a la aplicación.
Scripts adicionales para ejecutar: esta opción permite seleccionar un script de
PowerShell para usarlo en tiempo de compilación. Windows Admin Center agrega
una instrucción al Dockerfile para copiar el archivo .PS1 en la imagen de
contenedor y, a continuación, ejecutar este script cuando se crea la imagen de
contenedor. Esto puede resultar útil si la aplicación requiere que ejecute algún
paso adicional que no se complete en la propia aplicación.
Nombre de la imagen: nombre final de la imagen que se va a usar. Puede cambiar
el nombre más adelante al insertar la imagen en un registro de contenedor.
Etiqueta de imagen: la etiqueta se usa para diferenciar entre varias versiones de la
misma imagen. Proporcione un identificador, por lo que la imagen está etiquetada
correctamente.
Una vez que haya seleccionado todas las opciones de la imagen de contenedor, puede
revisar el Dockerfile. Si es necesario, también puede editar manualmente el Dockerfile.
Este Dockerfile se guarda en la ubicación de la aplicación que especificó en un paso
anterior.

7 Nota

Si ya existe un Dockerfile en la ubicación de la aplicación que intenta incluir en


contenedor, Windows Admin Center reemplazará ese archivo por el nuevo que
acaba de crear.

Pasos siguientes
Ejecución de contenedores en Windows Admin Center

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Administración de Azure Container
Registry mediante Windows Admin
Center
Artículo • 23/01/2025

En este tema se describe cómo administrar Azure Container Registry (ACR) mediante
Windows Admin Center. Azure Container Registry permite compilar, almacenar y
administrar imágenes y artefactos de contenedor en un registro privado para todo tipo
de implementaciones de contenedor.

7 Nota

Se requiere una suscripción de Azure para ejecutar los pasos de este tutorial. Para
más información sobre cómo conectar la instancia de Windows Admin Center a
Azure, consulte Configuración de la integración de Azure.

Windows Admin Center permite realizar una administración básica de Azure Container
Registry, como:

Enumerar registros e imágenes


Creación de nuevos registros
Eliminación de imágenes
Extracción de imágenes en el host de contenedor
Inicio de nuevos contenedores en Azure Container Instances a partir de imágenes
almacenadas en Azure Container Registry

Con Windows Admin Center para administrar ACR, puede preparar la ubicación de
Azure a la que puede insertar imágenes directamente desde la pestaña Imágenes en
host de contenedor. Para empezar, siga estos pasos:

1. Abra la instancia de Windows Admin Center y seleccione el host de contenedor.

2. En Herramientas en el panel izquierdo, desplácese hacia abajo y seleccione la


extensión Contenedores .

3. Abra la pestaña Azure Container Registry en Azure.


Administración de registros e imágenes
Para crear un nuevo registro, en Azure Container Registry, seleccione Crear nuevo
registro.
En Crear un nuevo registro, seleccione la suscripción que desea usar para crear un
registro y el grupo de recursos que desea asignar al registro. A continuación,
proporcione un nombre del Registro, una ubicación y una SKU. Para más información
sobre los precios y las características de cada SKU, consulte la documentación de ACR.
Haga clic en Crear para crear el registro. Una vez completado, Windows Admin Center le
notificará si la operación se ha completado correctamente y, a continuación, verá el
nuevo registro en la lista.
Una vez que se muestran los registros y las imágenes, puede quitar una imagen
existente o extraerla en el host de contenedor para su uso local. Para extraer una
imagen, seleccione la imagen que desea extraer y haga clic en Extraer imagen:

Una vez completado el proceso de extracción, Windows Admin Center le notificará y la


imagen estará disponible para su uso en la pestaña Imágenes en Host de contenedor.

Por último, puede ejecutar un nuevo contenedor basado en una imagen hospedada en
ACR. Para empezar, seleccione la imagen que desea ejecutar y haga clic en Ejecutar
instancia:
En Instancia de ejecución, debe proporcionar un nombre de contenedor, la suscripción
que se va a usar y el grupo de recursos y la ubicación que desea ejecutar esta instancia.

A continuación, proporcione la asignación de CPU y memoria para esta instancia, así


como el puerto que desea abrir, si es necesario. Haga clic en Crear y Windows Admin
Center envíe el comando a Azure para ejecutar la instancia. Puede comprobar el estado
de la instancia de contenedor en la pestaña Instancia de contenedor de Azure .

Pasos siguientes
Administración de Azure Container Instance en Windows Admin Center

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Administración de Azure Container
Instances mediante Windows Admin
Center
Artículo • 23/01/2025

En este tema se describe cómo administrar Azure Container Instances (ACI) mediante
Windows Admin Center. Azure Container Instances es una solución para cualquier
escenario que puede funcionar en contenedores aislados, sin orquestación.

7 Nota

Se requiere una suscripción de Azure para ejecutar los pasos descritos en este
tutorial. Para más información sobre cómo conectar la instancia de Windows Admin
Center a Azure, consulte Configuración de la integración de Azure.

Windows Admin Center permite realizar una administración básica de Azure Container
Instances, que incluye enumerar las instancias de contenedor existentes, iniciar y
detener una instancia, quitar instancias y abrir Azure Portal para la administración
avanzada.

Con la instancia de contenedor, puede realizar las siguientes acciones:

Start: para iniciar una instancia existente que está detenida actualmente.
End: para detener una instancia en ejecución.
Eliminar: para eliminar una instancia. Esto es irreversible y quita cualquier
configuración que se haya realizado en la instancia.
Administrar en Azure: se abre el panel de Azure Portal para administrar la
instancia de contenedor seleccionada en una nueva pestaña del explorador.

Pasos siguientes
Administrar Azure Container Registry en Windows Admin Center

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Imágenes base de contenedor
Artículo • 23/01/2025

Se aplica a: Windows Server 2025, Windows Server 2022, Windows Server 2019,
Windows Server 2016

Windows ofrece cuatro imágenes base de contenedor desde las que los usuarios
pueden compilar. Cada imagen base es un tipo diferente del sistema operativo Windows
o Windows Server, tiene una superficie de disco diferente y tiene un conjunto de API de
Windows diferente.

Windo Nano Windo Windo


ws Server ws ws
Server Implementa Proporciona
Server
Core do para el conjunto
Proporciona
aplicaciones completo
el conjunto
Admite .NET Core. de API de
completo
aplicaciones Windows.
de API de
tradicionale
Windows.
s de
.NET Frame
work.

Detección de imágenes
Todas las imágenes base de contenedores de Windows se pueden detectar a través de
Docker Hub . Las imágenes base de contenedores de Windows se entregan desde
mcr.microsoft.com , Microsoft Container Registry (MCR). Este es el motivo por el que
los comandos de extracción para las imágenes base de contenedores de Windows
tienen el aspecto siguiente:

code
docker pull mcr.microsoft.com/windows/servercore:ltsc2025

MCR no tiene su propia experiencia de catálogo y está pensado para admitir los
catálogos existentes, como Docker Hub. Gracias a la superficie global de Azure y junto
con Azure CDN, MCR ofrece una experiencia de extracción de imágenes que es
coherente y rápida. Los clientes de Azure que ejecutan sus cargas de trabajo en Azure se
benefician de las mejoras de rendimiento en la red, así como de una estrecha
integración con MCR (el origen de las imágenes de contenedores de Microsoft), Azure
Marketplace y el creciente número de servicios de Azure que ofrecen contenedores
como formato de paquete de implementación.

Elección de una imagen base


¿Cómo elegir la imagen base adecuada en función de la cual compilar? Para la mayoría
de los usuarios, Windows Server Core y Nanoserver serán la imagen más adecuada para
usar. Cada imagen base se describe brevemente a continuación:

Nano Server es una oferta de Windows ultraligera para el desarrollo de nuevas

aplicaciones.
Server Core tiene un tamaño medio y es una buena opción para migrar

aplicaciones de Windows Server mediante "lift-and-shift".


Windows es la imagen más grande y tiene compatibilidad completa con las API de

Windows para cargas de trabajo.


Windows Server es ligeramente más pequeña que la imagen de Windows, tiene

compatibilidad completa con las API de Windows y le permite usar más


características de servidor.

Directrices
Si bien tiene la posibilidad de usar la imagen que quiera, estas son algunas directrices
que le ayudarán a dirigir su elección:

¿Requiere la aplicación la versión completa de .NET Framework? Si la respuesta a


esta pregunta es afirmativa, deberías usar Windows Server Core .
¿Estás compilando una aplicación de Windows basada en .NET Core? Si la
respuesta a esta pregunta es afirmativa, deberías usar Nanoserver .
¿Falta en la imagen de contenedor de Windows Server Core una dependencia
que tu aplicación necesita? Si la respuesta a esta pregunta es afirmativa, deberías
intentar usar Windows . Esta imagen es mucho más grande que las otras imágenes
base, pero incluye muchas de las bibliotecas de Windows principales (como la
biblioteca GDI).
¿Eres miembro de Windows Insider? En caso afirmativo, piensa en la posibilidad
de usar la versión de las imágenes para Insider. Para obtener más información,
consulte "Imágenes base para los usuarios de Windows Insider" a continuación.
¿Necesita compatibilidad con la aceleración de GPU para las cargas de trabajo
de contenedor? En caso afirmativo, analice la posibilidad de usar la imagen
Windows Server para incluir la aceleración de hardware para las cargas de trabajo

de contenedores Windows.

 Sugerencia

Muchos usuarios de Windows quieren incluir en contenedores las aplicaciones que


tienen una dependencia en .NET. Además de las cuatro imágenes base que se
describen aquí, Microsoft publica varias imágenes de contenedor de Windows que
están preconfiguradas con los marcos de Microsoft conocidos, como la imagen de
.NET Framework y la imagen de ASP .NET .

Windows frente a Windows Server


La imagen Windows Server (3,1 GB) tiene un tamaño ligeramente menor que la imagen
Windows (3,4 GB). La imagen de Windows Server también hereda todas las mejoras de

rendimiento y fiabilidad de la imagen de Server Core, tiene compatibilidad con GPU y


no tiene límites en las conexiones IIS. Para usar la imagen más reciente de Windows
Server, necesitará una instalación de Windows Server 2025. La imagen de Windows no
está disponible para Windows Server 2025.

Imágenes base para Windows Insider


Microsoft proporciona versiones de "Insider" de cada imagen base de contenedor. Estas
imágenes de contenedor de Insider incluyen el desarrollo de características más reciente
y mejor en nuestras imágenes de contenedor. Cuando ejecutes un host que sea una
versión de Windows para Insider (ya sea Windows Insider o Windows Server Insider), es
preferible usar estas imágenes. Las siguientes imágenes de Insider están disponibles en
Docker Hub:

mcr.microsoft.com/windows/servercore/insider
mcr.microsoft.com/windows/nanoserver/insider
mcr.microsoft.com/windows/server/insider:10.0.20344.1
mcr.microsoft.com/windows/insider

Para más información, lee Usar contenedores con el Programa Windows Insider.

Windows Server Core frente a Nano Server


Windows Server Core y Nanoserver son las imágenes base de destino más comunes. La

diferencia principal entre estas imágenes es que Nano Server tiene una superficie de API
significativamente menor. PowerShell, WMI y la pila de servicio de Windows no están
presentes en la imagen de Nano Server.

Nano Server se compiló para proporcionar una superficie de API apenas suficiente para
ejecutar aplicaciones que tengan una dependencia en .NET Core u otros marcos de
código abierto modernos. Como contrapartida a la menor superficie de API, la imagen
de Nano Server tiene una superficie en disco considerablemente menor que el resto de
las imágenes base de Windows. Ten en cuenta que siempre se pueden agregar capas
sobre Nano Server según estimes oportuno. Para ver un ejemplo de esto, echa un
vistazo al Dockerfile de .NET Core Nano Server .

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Ciclos de vida de mantenimiento de
imágenes base
Artículo • 28/01/2025

Se aplica a: Windows Server 2025, Windows Server 2022, Windows Server 2019,
Windows Server 2016

7 Nota

Microsoft ha retrasado las fechas del final programado de soporte técnico y


servicio para una serie de productos para ayudar a las personas y organizaciones a
centrar su atención en mantener la continuidad empresarial. Consulte cambios en
el ciclo de vida hasta el final del soporte técnico y las fechas de mantenimiento
para obtener más información.

Las imágenes base de contenedores de Windows se basan en las publicaciones del


Canal de mantenimiento a largo plazo o en las publicaciones del Canal semianual de
Windows Server. En este artículo se explica el tiempo que durará el soporte técnico para
las distintas versiones de las imágenes base de ambos canales.

El Canal semianual es una versión de actualización de características que se publica dos


veces al año con unos plazos de mantenimiento de 18 meses para cada versión. Permite
a los clientes sacar partido de nuevas funcionalidades del sistema operativo a un ritmo
más rápido, tanto en aplicaciones, especialmente las integradas en contenedores y
microservicios, como en el centro de datos híbrido definido por software. Para más
información, consulta Introducción al Canal semianual de Windows Server.

En el caso de las imágenes de Server Core, los clientes también pueden usar el Canal de
servicio a largo plazo, que publica una nueva versión principal de Windows Server cada
dos o tres años. Las publicaciones del Canal de mantenimiento a largo plazo reciben un
soporte estándar y soporte extendido durante cinco años. Este canal funciona con
sistemas que requieren una opción de mantenimiento más prolongado y estabilidad
funcional.

En la tabla siguiente se enumeran los tipos de imagen base, su canal de mantenimiento


y el tiempo que durará el soporte técnico.

ノ Expandir tabla
Base Canal de Version Compilación Disponibilidad Fecha de Fecha del
image mantenimiento del sistema finalización soporte
operativo del soporte extendido
estándar

Server A largo plazo 2022 20348 18/08/2021 13/10/2026 14/10/2031


Core,
Nano
Server,
Datacenter
Container

Server Semianual 20H2 19042 20/10/2020 09/08/2022 N/A


Core,
Nano
Server,
Windows

Server Semianual 2004 19041 27/05/2020 14/12/2021 N/A


Core,
Nano
Server,
Windows

Server Semianual 1909 18363 12/11/2019 11/05/2021 N/A


Core,
Nano
Server,
Windows

Server Semianual 1903 18362 21/05/2019 08/12/2020 N/A


Core,
Nano
Server,
Windows

Server A largo plazo; 2019, 17763 13/11/2018 09/01/2024 09/01/2029


Core semestral 1809

Nano Semianual 1809 17763 13/11/2018 09/01/2024 09/01/2029


Server

Windows Semianual 1809 17763 13/11/2018 09/01/2024 09/01/2029

Server Semianual 1803 17134 30/04/2018 12/11/2019 N/A


Core,
Nano
Server

Server Semianual 1709 16299 17/10/2017 09/04/2019 N/A


Core,
Base Canal de Version Compilación Disponibilidad Fecha de Fecha del
image mantenimiento del sistema finalización soporte
operativo del soporte extendido
estándar

Nano
Server

Server A largo plazo 2016 14393 15/10/2016 11/01/2022 11/01/2027


Core

Nano Semianual 1607 14393 15/10/2016 09/10/2018 N/A


Server

Para conocer los requisitos de mantenimiento y otra información adicional, consulte las
Preguntas más frecuentes sobre el ciclo de vida de Windows, información de versión de
Windows Server, y las siguientes imágenes del sistema operativo base de Windows
Server en el repositorio de Docker Hub:

Windows Server
Windows Server Core
Nano Server

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Modos de aislamiento
Artículo • 05/02/2025

Se aplica a: Windows Server 2025, Windows Server 2022, Windows Server 2019,
Windows Server 2016

Los contenedores de Windows ofrecen dos modos distintos de aislamiento en tiempo


de ejecución: process y Hyper-V . Los contenedores que se ejecutan en ambos modos
de aislamiento se crean, administran y funcionan de forma idéntica. También generan y
consumen las mismas imágenes de contenedor. La diferencia entre los modos de
aislamiento es hasta qué grado de aislamiento se crea entre el contenedor, el sistema
operativo host y todos los demás contenedores que se ejecutan en ese host.

Aislamiento de procesos
Este es el modo de aislamiento "tradicional" para los contenedores y es lo que se
describe en la visión general de los contenedores de Windows . Con el aislamiento de
procesos, varias instancias de contenedor se ejecutan simultáneamente en un host
determinado con aislamiento proporcionado a través del espacio de nombres, el control
de recursos y otras tecnologías de aislamiento de procesos. Cuando se ejecuta en este
modo, los contenedores comparten el mismo kernel con el host, así como entre sí. Esto
es aproximadamente lo mismo que la ejecución de contenedores de Linux.

Qué se aísla
Los contenedores de Windows virtualizan el acceso a varios espacios de nombres del
sistema operativo. Un espacio de nombres proporciona acceso a información, objetos o
recursos a través de un nombre. Por ejemplo, es probable que el sistema de archivos sea
el espacio de nombres más conocido. Hay numerosos espacios de nombres en Windows
que se aíslan para cada contenedor:
sistema de archivos
registro
puertos de red
Espacio del id, de proceso y subproceso
Espacio de nombres del Administrador de objetos

Perforación del límite de aislamiento


Hay casos en los que resulta útil perforar el límite de aislamiento. El usuario debe
solicitar deliberadamente estas operaciones y debe realizarse con una consideración
cuidadosa, ya que puede poner en peligro la posición de seguridad del contenedor. Los
contenedores de Windows admiten lo siguiente:

mapear archivos compartidos o volúmenes del host al contenedor


mapeo de una canalización con nombre desde el host al contenedor
mapeo de un puerto desde el host al contenedor
personalización y uso compartido del espacio de nombres de red
Compartición de la visibilidad del dispositivo host en el contenedor

Los contenedores de Windows no admiten actualmente:

memoria compartida
compartir objetos de sincronización (semáforos, mutexes, etc.)
Espacios de nombres de procesos compartidos

Aislamiento de Hyper-V
Este modo de aislamiento ofrece mayor seguridad y compatibilidad más amplia entre
las versiones de host y contenedor. Mediante el aislamiento Hyper-V, varias instancias
de contenedores se ejecutan simultáneamente en un host; sin embargo, cada
contenedor se ejecuta dentro de una máquina virtual altamente optimizada y adquiere
de manera efectiva su propio kernel. La presencia de la máquina virtual proporciona
aislamiento a nivel de hardware entre cada contenedor, así como el host del
contenedor.
Ejemplos de aislamiento

Creación de un contenedor
La administración de contenedores aislados de Hyper-V con Docker es casi idéntica a la
administración de contenedores aislados de procesos. Para crear un contenedor con
aislamiento de Hyper-V mediante Docker, use el parámetro --isolation para establecer
--isolation=hyperv .

Símbolo del sistema de Windows

docker run -it --isolation=hyperv


mcr.microsoft.com/windows/servercore:ltsc2019 cmd

Para crear un contenedor con aislamiento de procesos mediante Docker, use el


parámetro --isolation para establecer --isolation=process .

Símbolo del sistema de Windows

docker run -it --isolation=process


mcr.microsoft.com/windows/servercore:ltsc2019 cmd

Los contenedores de Windows que se ejecutan en Windows Server se ejecutan de forma


predeterminada con aislamiento de procesos. Los contenedores de Windows que se
ejecutan en Windows 10 Pro y Enterprise lo hacen de manera predeterminada con
aislamiento de Hyper-V. A partir de la actualización de octubre de 2018 de Windows 10,
los usuarios que ejecutan un host de Windows 10 Pro o Enterprise pueden ejecutar un
contenedor de Windows con aislamiento de procesos. Los usuarios deben solicitar
directamente el aislamiento del proceso mediante la marca --isolation=process .

2 Advertencia

La ejecución con aislamiento de procesos en Windows 10 Pro y Enterprise está


pensada para desarrollo y pruebas. El host debe estar ejecutando la compilación
17763+ de Windows 10 y debe tener una versión de Docker con Engine 18.09 o
posterior.

Debe seguir usando Windows Server como host para implementaciones de


producción. Al usar esta característica en Windows 10 Pro y Enterprise, también
debes asegurarte de que las etiquetas de versión del host y del contenedor
coincidan; de lo contrario, es posible que el contenedor no pueda iniciar o mostrar
un comportamiento indefinido.

Explicación del aislamiento


En este ejemplo se muestran las diferencias en las funcionalidades de aislamiento entre
el aislamiento de procesos y el aislamiento de Hyper-V.

En este caso, se está implementando un contenedor aislado de procesos y se hospedará


un proceso de ping de larga duración.

Símbolo del sistema de Windows

docker run -d mcr.microsoft.com/windows/servercore:ltsc2019 ping localhost -


t

Con el comando docker top , el proceso de ping se devuelve tal como aparece dentro
del contenedor. El proceso de este ejemplo tiene un identificador de 3964.

Símbolo del sistema de Windows

docker top 1f8bf89026c8f66921a55e773bac1c60174bb6bab52ef427c6c8dbc8698f9d7a

3964 ping

En el host del contenedor, el comando get-process se puede usar para devolver los
procesos de ping en ejecución desde el host. En este ejemplo hay uno y el identificador
de proceso coincide con el del contenedor. Es el mismo proceso visible desde el
contenedor y el host.

get-process -Name ping

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id SI ProcessName


------- ------ ----- ----- ----- ------ -- -- -----------
67 5 820 3836 ...71 0.03 3964 3 PING

Por otro lado, en este ejemplo se inicia un contenedor con aislamiento de Hyper-V que
también tiene un proceso de ping.
docker run -d --isolation=hyperv
mcr.microsoft.com/windows/servercore:ltsc2019 ping localhost -t

Del mismo modo, se puede usar docker top para devolver los procesos en ejecución
desde el contenedor.

docker top 5d5611e38b31a41879d37a94468a1e11dc1086dcd009e2640d36023aa1663e62

1732 ping

Sin embargo, al buscar el proceso en el host del contenedor, no se encuentra un


proceso de ping y se produce un error.

get-process -Name ping

get-process : Cannot find a process with the name "ping". Verify the process
name and call the cmdlet again.
At line:1 char:1
+ get-process -Name ping
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (ping:String) [Get-Process],
ProcessCommandException
+ FullyQualifiedErrorId :
NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.GetProcessCommand

Por último, en el host, el proceso de vmwp es visible, que es la máquina virtual en


ejecución que encapsula el contenedor en ejecución y protege los procesos en
ejecución del sistema operativo host.

get-process -Name vmwp

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id SI ProcessName


------- ------ ----- ----- ----- ------ -- -- -----------
1737 15 39452 19620 ...61 5.55 2376 0 vmwp

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Portabilidad de contenedores
Artículo • 05/02/2025

Se aplica a: Windows Server, versión 23H2

La portabilidad es una característica del canal anual de Windows Server para


contenedores. La portabilidad simplifica el proceso de actualización, lo que le ayuda a
aprovechar al máximo la flexibilidad mejorada y la compatibilidad que ofrecen los
contenedores. En este artículo se proporciona una explicación detallada de cómo se
optimiza la portabilidad de imágenes de contenedor para hosts de contenedores de
canal anual.

Canal anual de Windows Server para contenedores es una edición de Windows Server
diseñada para las implementaciones de Windows Server centradas en contenedores y
Azure Kubernetes Service para mejorar la eficacia y proporcionar portabilidad
optimizada para contenedores de Windows y Linux. Para más información sobre el canal
anual para contenedores en Windows Server, vea nuestro Anuncio de
TechCommunity .

Funcionamiento de la portabilidad
Windows usa un kernel modular donde los componentes suelen estar estrechamente
enlazados entre modo de usuario y modo kernel. Los componentes estrechamente
enlazados son interfaces gráficas útiles que se sitúan encima de los controladores en
modo kernel, o bien optimizan el rendimiento al reducir los cambios de contexto de
modo kernel a modo usuario. Sin embargo, presenta un desafío para los contenedores.
La portabilidad permite a los contenedores que se ejecutan en modo de usuario
ejecutar cargas de trabajo con una versión de imagen de contenedor diferente a la
versión del sistema operativo host.

Sin portabilidad, los usuarios solo podían ejecutar cargas de trabajo con versiones
coincidentes de imagen y host. Por ejemplo, un usuario que ejecuta un host de
Windows Server 2022 no pudo ejecutar contenedores aislados de procesos de Windows
Server 2019. El control de versiones entre el host y la imagen del contenedor
representaba un problema significativo en el uso de contenedores de Windows,
haciendo que la actualización a versiones más recientes de un host de contenedor sea
un desafío. Por ejemplo, Windows Server 2022 LTSC requería que todas las imágenes de
infraestructura y aplicación se actualizaran a la versión más reciente al mismo tiempo
que se actualizaba el servidor host.
Interfaz binaria de la aplicación
La interfaz binaria de aplicaciones, o ABI, permite que varios lenguajes de programación
interactúen con interfaces de modo de usuario y kernel. La interacción del código de
cliente con un objeto en tiempo de ejecución se produce en el nivel más bajo, con
construcciones de lenguaje cliente traducidas en llamadas a la ABI del objeto. La
portabilidad de los contenedores de Windows presenta una ABI estable para la
interacción entre el usuario y el kernel. Esta ABI estable desacopla los componentes de
usuario y kernel del sistema, y ofrece la capacidad de actualizar por separado los
elementos de kernel y usuario del sistema.

Los contenedores pueden ejecutar todos los archivos binarios en modo de usuario
desde su capa base, excepto la capa ABI.

En el diagrama siguiente se muestra la comunicación entre los componentes en modo


de usuario y en modo kernel.

¿Qué versiones puedo usar?


Las imágenes de contenedor de Nano Server, Server Core y Windows Server solo están
disponibles a través del canal de mantenimiento de Long-Term para contenedores que
ejecutan Windows Server 2019 o posterior. Para más información sobre las imágenes de
contenedores de Windows Server admitidas, vea Ciclos de vida de mantenimiento de
imágenes base.

Un host de contenedor de Windows Server, versión 23H2, solo admite la imagen de


contenedor del canal de mantenimiento a largo plazo (LTSC) de Windows Server 2022.

Azure Kubernetes Service admite actualmente Windows Server 2019 y hosts posteriores.
Canal anual de Windows Server para contenedores es otra opción de sistema operativo
de contenedor que Microsoft ofrece junto con Kubernetes 1.28. Puede crear nuevos
grupos de nodos en función del canal anual y seguir implementando las imágenes de
contenedor de Windows Server 2022 en esos nodos. Microsoft actualiza
automáticamente la versión del canal anual y las nuevas versiones de Kubernetes de
forma anual. Sin embargo, también es una buena idea seguir las últimas versiones de
LTSC para asegurarse de que los contenedores están actualizados.

7 Nota

Aunque las versiones anteriores de imágenes de contenedor se pueden ejecutar en


el sistema operativo host más reciente, los sistemas operativos de imágenes de
contenedor más recientes no se pueden ejecutar en el sistema operativo host
anterior.

Contenido relacionado
¿Qué es el Canal Anual de Windows Server para Contenedores?

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Compatibilidad con versiones de
contenedores de Windows
Artículo • 21/03/2023

Se aplica a: Windows Server 2022, Windows Server 2019, Windows Server 2016

Windows Server 2016 y la Actualización de aniversario de Windows 10 (versión 14393 en


ambos casos) fueron los primeros lanzamientos de Windows que podían compilar y
ejecutar contenedores de Windows Server. Los contenedores compilados con estas
versiones se pueden ejecutar en las versiones más recientes, pero hay algunos aspectos
que debes saber antes de empezar.

La arquitectura de Windows difiere enormemente de la de Linux. Linux tiene un kernel


monolítico, mientras que en el modo de kernel y usuario de Windows están enlazados
más estrechamente. Hasta la introducción de los contenedores, el modo de kernel y
usuario de Windows se enviaban en sincronía, lo que dio lugar a requisitos de
compatibilidad de contenedores en Windows que difieren de la norma en Linux.

Separar el límite de usuario/kernel en Windows es una tarea importante y nada trivial;


sin embargo, hemos estado trabajando duro para estabilizar este límite en todas las
instancias de Windows para proporcionar a nuestros clientes la flexibilidad de ejecutar
contenedores de nivel inferior. A partir de Windows 11 y Windows Server 2022,
estamos habilitando la capacidad de ejecutar contenedores WS2022 aislados por
procesos en hosts Windows 11. Hemos hecho todo lo posible para capturar las áreas
que rompen el límite, pero ahora queremos abrir la característica a los desarrolladores
en Windows 11 para recibir comentarios. Nos comprometemos a habilitar esta
experiencia para usted, así que háganoslo saber cuando experimente problemas .

En cualquier otro escenario en el que haya una discrepancia en el control de versiones


de Windows host/invitado, es posible que el modo Kernel/Usuario sea compatible, pero
no se garantiza, por lo que se impedirá que la imagen de contenedor se ejecute en el
host. Para cualquier versión con discrepancias, la ejecución con aislamiento de Hyper-V
proporciona al contenedor un conjunto de archivos binarios del Kernel coincidentes y
no depende de la versión del host. Consulte las tablas siguientes para obtener una
matriz de compatibilidad detallada.

Compatibilidad del sistema operativo host de


Windows Server
Windows Server 2022

Versión del sistema operativo de una Admite el Admite el


imagen base de contenedor aislamiento de aislamiento de
Hyper-V procesos

Windows Server 2022 ✔ ✔

Windows Server 2019 ✔ ❌

Windows Server 2016 ✔ ❌

Compatibilidad del sistema operativo host del


cliente de Windows
Windows 11

Versión del sistema operativo de una Admite el Admite el


imagen base de contenedor aislamiento de aislamiento de
Hyper-V procesos

Windows Server 2022 ✔ ✔(versión preliminar)

Windows Server 2019 ✔ ❌

Windows Server 2016 ✔ ❌

7 Nota

Windows 10 versión 1809 y Windows Server 2019 tenían el mismo número de


compilación en la etapa de disponibilidad general. Desde entonces, han recibido
actualizaciones independientes, lo que da lugar a un error de coincidencia en el
número de compilación. El aislamiento de procesos en el cliente de Windows está
disponible en versión preliminar para Windows 11 con imágenes de Windows
Server 2022, con un número de compilación que no coincide. Si tiene un requisito
para ejecutar contenedores de procesos aislados en Windows 10, comuníquenoslo
mediante la página Problemas de GitHub .
Coincidencia de la versión del host de
contenedor con las versiones de las imágenes
de contenedor

Contenedores de Windows Server

Número de compilación (nueva publicación de Windows)

El sistema operativo Windows tiene cuatro niveles de control de versiones: principal,


secundario, compilación y revisión (por ejemplo, 10.0.14393.0). Por ejemplo, la versión
10.0.14393.103 tendría una versión principal de 10, una versión secundaria de 0, un
número de compilación de 14393 y un número de revisión de 103. El número de
compilación solo cambia cuando se publican nuevas versiones del sistema operativo y el
número de revisión se actualiza a medida que se aplican las actualizaciones de
Windows.

Si el número de compilación entre el host de contenedor y la imagen del contenedor es


diferente, se bloquea el inicio de los contenedores de Windows Server, a excepción de
WS2022 y Windows 11. Por ejemplo, cuando el host de contenedor es la versión
10.0.14393.* (Windows Server 2016) e intenta ejecutar un contenedor con una versión
de imagen 10.0.16299.* (Windows Server, versión 1709), el servicio de proceso del
sistema operativo devolverá un error de incompatibilidad de versión.

Restricciones de Windows Server 2016


Los contenedores basados en Windows Server 2016 no se ejecutarán en un sistema en
el que los números de revisión del host de contenedor y la imagen del contenedor sean
diferentes. Por ejemplo, si el host del contenedor tiene la versión 10.0.14393.1914
(Windows Server 2016 con KB4051033) y la imagen del contenedor tiene la versión
10.0.14393.1944 (Windows Server 2016 con KB4053579), es posible que la imagen no se
inicie.

Para los hosts o imágenes que usan Windows Server, versión 1809 y versiones
posteriores, esta regla no se aplica: el host y la imagen del contenedor no necesitan
tener revisiones coincidentes.

7 Nota
Te recomendamos encarecidamente que actualices el host y los contenedores con
las revisiones y actualizaciones más recientes para mantener la seguridad y la
compatibilidad. Para obtener instrucciones importantes sobre cómo actualizar los
contenedores de Windows, consulta Actualización de contenedores de Windows
Server.

Aplicación práctica
Ejemplo 1: el host del contenedor ejecuta Windows Server 2016 con KB4041691.
Cualquier contenedor de Windows Server implementado a este host debe basarse en las
imágenes base del contenedor versión 10.0.14393.1770. Si aplicas KB4053579 al
contenedor host, también debes actualizar las imágenes para asegurarte de que el
contenedor host las admita.

Ejemplo 2: El host de contenedor ejecuta Windows Server, versión 1809, con KB4534273.
Cualquier contenedor de Windows Server implementado en este host debe basarse en
una imagen base de contenedor de Windows Server versión 1809 (10.0.17763), pero no
necesita coincidir con el KB del host. Si se aplica KB4534273 al host, se seguirán
admitiendo las imágenes del contenedor, pero se recomienda actualizarlas para abordar
los posibles problemas de seguridad.

Consultar versiones
Método 1: Incluido en la versión 1709, el comando ver y el símbolo del sistema cmd
ahora deben devolver los detalles de revisión.

batch

Microsoft Windows [Version 10.0.16299.125]


(c) 2017 Microsoft Corporation. All rights reserved.

C:\>ver

Microsoft Windows [Version 10.0.16299.125]

Método 2: Consulta la siguiente clave del Registro:


HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion

Por ejemplo:

batch
C:\>reg query "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows
NT\CurrentVersion" /v BuildLabEx

PowerShell

Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.

PS C:\Users\Administrator> (Get-ItemProperty
'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\').BuildLabEx
14393.321.amd64fre.rs1_release_inmarket.161004-2338

Para comprobar qué versión usa la imagen base, revisa las etiquetas en Docker Hub o la
tabla hash de la imagen proporcionada en la descripción de la imagen. En la página
Historial de actualizaciones de Windows 10 se muestra cuándo se lanzó cada
compilación y revisión.

Aislamiento de Hyper-V para contenedores


Puedes ejecutar los contenedores de Windows con o sin aislamiento de Hyper-V. El
aislamiento de Hyper-V crea un límite seguro alrededor del contenedor con una VM
optimizada. A diferencia de los contenedores estándar de Windows, que comparten el
kernel entre los contenedores y el host, cada contenedor aislado con Hyper-V tiene su
propia instancia del kernel de Windows. Es decir, puedes tener diferentes versiones del
sistema operativo en el host y la imagen del contenedor (para más información,
consulta la matriz de compatibilidad a continuación).

Para ejecutar un contenedor con aislamiento de Hyper-V, solo tienes que agregar la
etiqueta --isolation=hyperv al comando de ejecución de docker.

Errores de las versiones que no coinciden


Si intentas ejecutar una combinación no admitida, se producirá el error siguiente:

Dockerfile

docker: Error response from daemon: container


b81ed896222eb87906ccab1c3dd2fc49324eafa798438f7979b87b210906f839 encountered
an error during CreateContainer: failure in a Windows system call: The
operating system of the container does not match the operating system of the
host. (0xc0370101) extra info:
{"SystemType":"Container","Name":"b81ed896222eb87906ccab1c3dd2fc49324eafa798
438f7979b87b210906f839","Owner":"docker","IsDummy":false,"VolumePath":"\\\\?
\\Volume{2443d38a-1379-4bcf-a4b7-
fc6ad4cd7b65}","IgnoreFlushesDuringBoot":true,"LayerFolderPath":"C:\\Program
Data\\docker\\windowsfilter\\b81ed896222eb87906ccab1c3dd2fc49324eafa798438f7
979b87b210906f839","Layers":[{"ID":"1532b584-8431-5b5a-8735-
5e1b4fe9c2a9","Path":"C:\\ProgramData\\docker\\windowsfilter\\b2b88bc2a47abc
c682e422507abbba9c9b6d826d34e67b9e4e3144cc125a1f80"},{"ID":"a64b8da5-cd6e-
5540-bc73-
d81acae6da54","Path":"C:\\ProgramData\\docker\\windowsfilter\\5caaedbced1f54
6bccd01c9d31ea6eea4d30701ebba7b95ee8faa8c098a6845a"}],"HostName":"b81ed89622
2e","MappedDirectories":[],"HvPartition":false,"EndpointList":["002a0d9e-
13b7-42c0-89b2-
c1e80d9af243"],"Servicing":false,"AllowUnqualifiedDNSQuery":true}.

Existen tres formas de resolver este error:

Volver a compilar el contenedor en función de la versión correcta de


mcr.microsoft.com/microsoft-windows-nanoserver o

mcr.microsoft.com/windows/servercore .
Si el host es más reciente, ejecutar docker run --isolation=hyperv ...
Intentar ejecutar el contenedor en otro host con la misma versión de Windows.

Elección de la versión del sistema operativo del


contenedor que se va a usar

7 Nota

A partir del 16 de abril de 2019, la etiqueta "más reciente" ya no se publica ni


mantiene para las imágenes base de contenedor del SO Windows . Declara una
etiqueta específica al extraer o hacer referencia a las imágenes desde estos
repositorios.

Debes saber qué versión debes utilizar para el contenedor. Por ejemplo, si quieres usar
Windows Server, versión 1809, como sistema operativo para el contenedor y quieres
tener las últimas revisiones de dicha versión, debes usar la etiqueta 1809 cuando
indiques qué versión de las imágenes base de contenedor del SO quieres, de este
modo:

Dockerfile

FROM mcr.microsoft.com/windows/nanoserver:1809
...
Sin embargo, si quieres una revisión específica de Windows Server versión 1809, puedes
especificar el número de KB en la etiqueta. Por ejemplo, para obtener una imagen base
de contenedor del SO Nano Server de Windows Server, versión 1809, con KB4493509,
tienes que indicarlo de la siguiente forma:

Dockerfile

FROM mcr.microsoft.com/windows/nanoserver:1809-KB4493509
...

También puedes especificar las revisiones exactas que necesitas con el esquema que
hemos usado anteriormente, es decir, indicar la versión del sistema operativo en la
etiqueta:

Dockerfile

FROM mcr.microsoft.com/windows/nanoserver:10.0.17763.437
...

Las imágenes base de Server Core basadas en Windows Server 2022 y Windows
Server 2019 son versiones del Canal de mantenimiento a largo plazo (LTSC). Si, por
ejemplo, quieres que Windows Server 2019 sea el sistema operativo de contenedor de
la imagen de Server Core y quieres tener las revisiones más recientes para él, puedes
especificar las versiones de LTSC como sigue:

Dockerfile

FROM mcr.microsoft.com/windows/servercore:ltsc2019
...

Coincidencia de versiones mediante Docker


Swarm
Actualmente, Docker Swarm no tiene un modo integrado para hacer coincidir la versión
de Windows que usa un contenedor con un host que tenga la misma versión. Si
actualizas el servicio para usar un contenedor más reciente, se ejecutará correctamente.

Si tienes que ejecutar varias versiones de Windows durante un largo período de tiempo,
existen dos enfoques que puedes seguir: configurar los hosts de Windows para usar
siempre el aislamiento de Hyper-V o usar restricciones de etiquetas.
Encontrar un servicio que no se inicia
Si un servicio no se inicia, notarás que MODE es replicated , pero REPLICAS se bloquea
en 0. Para ver si el problema es la versión del sistema operativo, ejecuta los siguientes
comandos:

Ejecuta docker service ls para buscar el nombre del servicio:

Dockerfile

ID NAME MODE REPLICAS


IMAGE PORTS
xh6mwbdq2uil angry_liskov replicated 0/1
windows/servercore/iis

Ejecuta docker service ps (nombre del servicio) para obtener el estado y los intentos
más recientes:

Dockerfile

C:\Program Files\Docker>docker service ps angry_liskov


ID NAME IMAGE
NODE DESIRED STATE CURRENT STATE ERROR
PORTS
klkbhn742lv0 angry_liskov.1 windows/servercore/iis WIN-
BSTMQDRQC2E Ready Ready 3 seconds ago
y5blbdum70zo \_ angry_liskov.1 windows/servercore/iis WIN-
BSTMQDRQC2E Shutdown Failed 24 seconds ago "starting
container failed: co…"
yjq6zwzqj8kt \_ angry_liskov.1 windows/servercore/iis WIN-
BSTMQDRQC2E Shutdown Failed 31 seconds ago "starting
container failed: co…"

ytnnv80p03xx \_ angry_liskov.1 windows/servercore/iis WIN-


BSTMQDRQC2E Shutdown Failed about a minute ago "starting
container failed: co…"
xeqkxbsao57w \_ angry_liskov.1 windows/servercore/iis WIN-
BSTMQDRQC2E Shutdown Failed about a minute ago "starting
container failed: co…"

Si ves starting container failed: ... , puedes ver el error completo con docker
service ps --no-trunc (nombre del contenedor) :

Dockerfile

C:\Program Files\Docker>docker service ps --no-trunc angry_liskov


ID NAME IMAGE
NODE DESIRED STATE CURRENT STATE
ERROR
PORTS
dwsd6sjlwsgic5vrglhtxu178 angry_liskov.1
windows/servercore/iis@sha256:868bca7e89e1743792e15f78edb5a73070ef44eae6807d
c3f05f9b94c23943d5 WIN-BSTMQDRQC2E Running Starting less
than a second ago
y5blbdum70zoh1f6uhx5nxsfv \_ angry_liskov.1
windows/servercore/iis@sha256:868bca7e89e1743792e15f78edb5a73070ef44eae6807d
c3f05f9b94c23943d5 WIN-BSTMQDRQC2E Shutdown Failed 39
seconds ago "starting container failed: container
e7b5d3adba7e510569c18d8e55f7c689d7cb92be40a516c91b363e27f84604d0 encountered
an error during CreateContainer: failure in a Windows system call: The
operating system of the container does not match the operating system of the
host. (0xc0370101) extra info:
{"SystemType":"Container","Name":"e7b5d3adba7e510569c18d8e55f7c689d7cb92be40
a516c91b363e27f84604d0","Owner":"docker","VolumePath":"\\\\?
\\Volume{2443d38a-1379-4bcf-a4b7-
fc6ad4cd7b65}","IgnoreFlushesDuringBoot":true,"LayerFolderPath":"C:\\Program
Data\\docker\\windowsfilter\\e7b5d3adba7e510569c18d8e55f7c689d7cb92be40a516c
91b363e27f84604d0","Layers":[{"ID":"bcf2630f-ea95-529b-b33c-
e5cdab0afdb4","Path":"C:\\ProgramData\\docker\\windowsfilter\\200235127f9241
6724ae1d53ed3fdc86d78767132d019bdda1e1192ee4cf3ae4"},{"ID":"e3ea10a8-4c2f-
5b93-b2aa-
720982f116f6","Path":"C:\\ProgramData\\docker\\windowsfilter\\0ccc9fa71a9f4c
5f6f3bc8134fe3533e454e09f453de662cf99ab5d2106abbdc"},{"ID":"cff5391f-e481-
593c-aff7-
12e080c653ab","Path":"C:\\ProgramData\\docker\\windowsfilter\\a49576b24cd6ec
4a26202871c36c0a2083d507394a3072186133131a72601a31"},{"ID":"499cb51e-b891-
549a-b1f4-
8a25a4665fbd","Path":"C:\\ProgramData\\docker\\windowsfilter\\fdf2f52c4323c6
2f7ff9b031c0bc3af42cf5fba91098d51089d039fb3e834c08"},{"ID":"1532b584-8431-
5b5a-8735-
5e1b4fe9c2a9","Path":"C:\\ProgramData\\docker\\windowsfilter\\b2b88bc2a47abc
c682e422507abbba9c9b6d826d34e67b9e4e3144cc125a1f80"},{"ID":"a64b8da5-cd6e-
5540-bc73-
d81acae6da54","Path":"C:\\ProgramData\\docker\\windowsfilter\\5caaedbced1f54
6bccd01c9d31ea6eea4d30701ebba7b95ee8faa8c098a6845a"}],"HostName":"e7b5d3adba
7e","HvPartition":false,"EndpointList":["298bb656-8800-4948-a41c-
1b0500f3d94c"],"AllowUnqualifiedDNSQuery":true}"

Es el mismo error que CreateContainer: failure in a Windows system call: The


operating system of the container does not match the operating system of the host.

(0xc0370101) .

Corrección: actualizar el servicio para que use una versión


coincidente
Hay dos consideraciones para tener en cuenta con Docker Swarm. En caso de que
tengas un archivo de Compose que tenga un servicio que use una imagen que no hayas
creado tú, es conveniente actualizar la referencia según corresponda. Por ejemplo:
YAML

version: '3'

services:
YourServiceName:
image: windows/servercore:1709
...

La otra consideración es si la imagen a la que apuntas es una que has creado tú mismo
(por ejemplo, contoso/myimage):

YAML

version: '3'

services:
YourServiceName:
image: contoso/myimage
...

En este caso, tendrías que usar el método descrito en Errores de las versiones que no
coinciden para modificar ese Dockerfile en lugar de la línea docker-compose.

Mitigación: usar el aislamiento de Hyper-V con Docker


Swarm
Los contenedores de Windows admiten el uso del aislamiento de Hyper-V en cada
contenedor, lo que requiere cambiar la configuración del servicio de Docker y, a
continuación, reiniciar el motor de Docker.

1. Edita C:\ProgramData\docker\config\daemon.json .

2. Agrega una línea con "exec-opts":["isolation=hyperv"] .

7 Nota

No existe el archivo daemon.json de manera predeterminada. Si observas que


es así cuando echas un vistazo en el directorio, debes crear el archivo. A
continuación, copia lo siguiente:

JSON
{
"exec-opts":["isolation=hyperv"]
}

3. Cierra el archivo y guárdalo. Luego reinicia Docker Engine ejecutando los


siguientes cmdlets en PowerShell:

PowerShell

Stop-Service docker
Start-Service docker

4. Una vez que hayas reiniciado el servicio, inicia los contenedores. Cuando estén en
ejecución, puedes verificar el nivel de aislamiento de un contenedor examinando el
contenedor con el cmdlet siguiente:

PowerShell

docker inspect --format='{{json .HostConfig.Isolation}}'


$instanceNameOrId

Se mostrarán los valores "process" o "hyperv". Si modificaste y estableciste tu archivo


daemon.json como se describe más arriba, debería mostrarse "hyperv".

Mitigación: usar etiquetas y restricciones


Aquí te mostramos cómo usar etiquetas y restricciones para hacer coincidir las
versiones:

1. Agrega etiquetas a cada nodo.

En cada nodo, agrega dos etiquetas: OS y OsVersion . En este procedimiento se


supone que estás ejecutando de forma local, pero podría modificarse para
establecerlas en un host remoto.

PowerShell

docker node update --label-add OS="windows" $ENV:COMPUTERNAME


docker node update --label-add OsVersion="$((Get-
ComputerInfo).OsVersion)" $ENV:COMPUTERNAME

Después, puedes comprobarlo mediante la ejecución del comando docker node


inspect, que debe mostrar las etiquetas recién agregadas:
YAML

"Spec": {
"Labels": {
"OS": "windows",
"OsVersion": "10.0.16296"
},
"Role": "manager",
"Availability": "active"
}

2. Agrega una restricción de servicio.

Ahora que has etiquetado cada nodo, puedes actualizar las restricciones que
determinan la ubicación de los servicios. En el ejemplo a continuación, sustituye
"contoso_service" con el nombre de tu servicio real:

PowerShell

docker service update \


--constraint-add "node.labels.OS == windows" \
--constraint-add "node.labels.OsVersion == $((Get-
ComputerInfo).OsVersion)" \
contoso_service

Esto aplica y limita los lugares en los que se puede ejecutar un nodo.

Para más información sobre cómo usar las restricciones de servicios, consulta la
referencia de service create .

Coincidencia de versiones mediante


Kubernetes
El mismo problema descrito en Coincidencia de versiones mediante Docker Swarm
puede producirse cuando se programan pods en Kubernetes. Este problema puede
evitarse con estrategias similares:

Vuelve a compilar el contenedor en función de la misma versión de sistema


operativo de desarrollo y producción. Para saber cómo hacerlo, consulta Elección
de la versión del sistema operativo del contenedor que se va a usar.
Usa etiquetas de nodo y nodeSelectors para asegurarte de que los pods se
programen en nodos compatibles si hay nodos de Windows Server 2016 y de
Windows Server, versión 1709, en el mismo clúster.
Usar clústeres independientes según la versión de SO
Buscar pods con errores debido a la falta de coincidencia
del SO
En este caso, una implementación incluía un pod programado en un nodo con una
versión de sistema operativo no coincidente y sin el aislamiento de Hyper-V habilitado.

El mismo error se muestra en los eventos que se muestran con kubectl describe pod
<podname> . Después de varios intentos, el estado del pod probablemente será
CrashLoopBackOff .

$ kubectl -n plang describe pod fabrikamfiber.web-789699744-rqv6p

Name: fabrikamfiber.web-789699744-rqv6p
Namespace: plang
Node: 38519acs9011/10.240.0.6
Start Time: Mon, 09 Oct 2017 19:40:30 +0000
Labels: io.kompose.service=fabrikamfiber.web
pod-template-hash=789699744
Annotations: kubernetes.io/created-by=
{"kind":"SerializedReference","apiVersion":"v1","reference":
{"kind":"ReplicaSet","namespace":"plang","name":"fabrikamfiber.web-
789699744","uid":"b5062a08-ad29-11e7-b16e-000d3a...
Status: Running
IP: 10.244.3.169
Created By: ReplicaSet/fabrikamfiber.web-789699744
Controlled By: ReplicaSet/fabrikamfiber.web-789699744
Containers:
fabrikamfiberweb:
Container ID:
docker://eab0151378308315ed6c31adf4ad9e31e6d65fd300e56e742757004a969a803a
Image: patricklang/fabrikamfiber.web:latest
Image ID: docker-
pullable://patricklang/fabrikamfiber.web@sha256:562741016ce7d9a232a389449a4f
d0a0a55aab178cf324144404812887250ead
Port: 80/TCP
State: Waiting
Reason: CrashLoopBackOff
Last State: Terminated
Reason: ContainerCannotRun
Message: container
eab0151378308315ed6c31adf4ad9e31e6d65fd300e56e742757004a969a803a encountered
an error during CreateContainer: failure in a Windows system call: The
operating system of the container does not match the operating system of the
host. (0xc0370101) extra info:
{"SystemType":"Container","Name":"eab0151378308315ed6c31adf4ad9e31e6d65fd300
e56e742757004a969a803a","Owner":"docker","IsDummy":false,"VolumePath":"\\\\?
\\Volume{037b6606-bc9c-461f-ae02-
829c28410798}","IgnoreFlushesDuringBoot":true,"LayerFolderPath":"C:\\Program
Data\\docker\\windowsfilter\\eab0151378308315ed6c31adf4ad9e31e6d65fd300e56e7
42757004a969a803a","Layers":[{"ID":"f8bc427f-7aa3-59c6-b271-
7331713e9451","Path":"C:\\ProgramData\\docker\\windowsfilter\\e206d2514a6265
a76645b9d6b3dc6a78777c34dbf5da9fa2d564651645685881"},{"ID":"a6f35e41-a86c-
5e4d-a19a-
a6c2464bfb47","Path":"C:\\ProgramData\\docker\\windowsfilter\\0f21f1e28ef130
30bbf0d87cbc97d1bc75f82ea53c842e9a3250a2156ced12d5"},{"ID":"4f624ca7-2c6d-
5c42-b73f-
be6e6baf2530","Path":"C:\\ProgramData\\docker\\windowsfilter\\4d9e2ad969fbd7
4fd58c98b5ab61e55a523087910da5200920e2b6f641d00c67"},{"ID":"88e360ff-32af-
521d-9a3f-
3760c12b35e2","Path":"C:\\ProgramData\\docker\\windowsfilter\\9e16a3d53d3e9b
33344a6f0d4ed34c8a46448ee7636b672b61718225b8165e6e"},{"ID":"20f1a4e0-a6f3-
5db3-9bf2-
01fd3e9e855a","Path":"C:\\ProgramData\\docker\\windowsfilter\\7eec7f59f9adce
38cc0a6755da58a3589287d920d37414b5b21b5b543d910461"},{"ID":"c2b3d728-4879-
5343-a92a-
b735752a4724","Path":"C:\\ProgramData\\docker\\windowsfilter\\8ed04b60acc0f6
5f541292a9e598d5f73019c8db425f8d49ea5819eab16a42f3"},{"ID":"2973e760-dc59-
5800-a3de-
ab9d93be81e5","Path":"C:\\ProgramData\\docker\\windowsfilter\\cc71305d45f09c
e377ef497f28c3a74ee027c27f20657d2c4a5f157d2457cc75"},{"ID":"454a7d36-038c-
5364-8a25-
fa84091869d6","Path":"C:\\ProgramData\\docker\\windowsfilter\\9e8cde1ce8f5de
861a5f22841f1ab9bc53d5f606d06efeacf5177f340e8d54d0"},{"ID":"9b748c8c-69eb-
55fb-a1c1-
5688cac4efd8","Path":"C:\\ProgramData\\docker\\windowsfilter\\8e02bf54040570
55a71d542780a2bb2731be4b3707c01918ba969fb4d83b98ec"},{"ID":"bfde5c26-b33f-
5424-9405-
9d69c2fea4d0","Path":"C:\\ProgramData\\docker\\windowsfilter\\77483cedfb0964
008c33d92d306734e1fab3b5e1ebb27e898f58ccfd108108f2"},{"ID":"bdabfbf5-80d1-
57f1-86f3-
448ce97e2d05","Path":"C:\\ProgramData\\docker\\windowsfilter\\aed2ebbb31ad24
b38ee8521dd17744319f83d267bf7f360bc177e27ae9a006cf"},{"ID":"ad9b34f2-dcee-
59ea-8962-
b30704ae6331","Path":"C:\\ProgramData\\docker\\windowsfilter\\d44d3a675fec10
70b61d6ea9bacef4ac12513caf16bd6453f043eed2792f75d8"}],"HostName":"fabrikamfi
ber.web-789699744-rqv6p","MappedDirectories":
[{"HostPath":"c:\\var\\lib\\kubelet\\pods\\b50f0027-ad29-11e7-b16e-
000d3afd2878\\volumes\\kubernetes.io~secret\\default-token-
rw9dn","ContainerPath":"c:\\var\\run\\secrets\\kubernetes.io\\serviceaccount
","ReadOnly":true,"BandwidthMaximum":0,"IOPSMaximum":0}],"HvPartition":false
,"EndpointList":null,"NetworkSharedContainerName":"586870f5833279678773cb700
db3c175afc81d557a75867bf39b43f985133d13","Servicing":false,"AllowUnqualified
DNSQuery":false}
Exit Code: 128
Started: Mon, 09 Oct 2017 20:27:08 +0000
Finished: Mon, 09 Oct 2017 20:27:08 +0000
Ready: False
Restart Count: 10
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-rw9dn
(ro)
Conditions:
Type Status
Initialized True
Ready False
PodScheduled True
Volumes:
default-token-rw9dn:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-rw9dn
Optional: false
QoS Class: BestEffort
Node-Selectors: beta.kubernetes.io/os=windows
Tolerations: <none>
Events:
FirstSeen LastSeen Count From
SubObjectPath Type Reason
Message
--------- -------- ----- ---- ------------
- -------- ------ -------
49m 49m 1 default-scheduler
Normal Scheduled Successfully assigned
fabrikamfiber.web-789699744-rqv6p to 38519acs9011
49m 49m 1 kubelet, 38519acs9011
Normal SuccessfulMountVolume MountVolume.SetUp succeeded for
volume "default-token-rw9dn"
29m 29m 1 kubelet, 38519acs9011
spec.containers{fabrikamfiberweb} Warning Failed
Failed to pull image "patricklang/fabrikamfiber.web:latest": rpc error: code
= 2 desc = Error response from daemon: {"message":"Get https://registry-
1.docker.io/v2/: dial tcp: lookup registry-1.docker.io: no such host"}
49m 3m 12 kubelet, 38519acs9011
spec.containers{fabrikamfiberweb} Normal Pulling
pulling image "patricklang/fabrikamfiber.web:latest"
33m 3m 11 kubelet, 38519acs9011
spec.containers{fabrikamfiberweb} Normal Pulled
Successfully pulled image "patricklang/fabrikamfiber.web:latest"
33m 3m 11 kubelet, 38519acs9011
spec.containers{fabrikamfiberweb} Normal Created
Created container
33m 2m 11 kubelet, 38519acs9011
spec.containers{fabrikamfiberweb} Warning Failed
Error: failed to start container "fabrikamfiberweb": Error response from
daemon: {"message":"container fabrikamfiberweb encountered an error during
CreateContainer: failure in a Windows system call: The operating system of
the container does not match the operating system of the host. (0xc0370101)
extra info:
{\"SystemType\":\"Container\",\"Name\":\"fabrikamfiberweb\",\"Owner\":\"dock
er\",\"IsDummy\":false,\"VolumePath\":\"\\\\\\\\?\\\\Volume{037b6606-bc9c-
461f-ae02-
829c28410798}\",\"IgnoreFlushesDuringBoot\":true,\"LayerFolderPath\":\"C:\\\
\ProgramData\\\\docker\\\\windowsfilter\\\\fabrikamfiberweb\",\"Layers\":
[{\"ID\":\"f8bc427f-7aa3-59c6-b271-
7331713e9451\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\e2
06d2514a6265a76645b9d6b3dc6a78777c34dbf5da9fa2d564651645685881\"},
{\"ID\":\"a6f35e41-a86c-5e4d-a19a-
a6c2464bfb47\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\0f
21f1e28ef13030bbf0d87cbc97d1bc75f82ea53c842e9a3250a2156ced12d5\"},
{\"ID\":\"4f624ca7-2c6d-5c42-b73f-
be6e6baf2530\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\4d
9e2ad969fbd74fd58c98b5ab61e55a523087910da5200920e2b6f641d00c67\"},
{\"ID\":\"88e360ff-32af-521d-9a3f-
3760c12b35e2\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\9e
16a3d53d3e9b33344a6f0d4ed34c8a46448ee7636b672b61718225b8165e6e\"},
{\"ID\":\"20f1a4e0-a6f3-5db3-9bf2-
01fd3e9e855a\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\7e
ec7f59f9adce38cc0a6755da58a3589287d920d37414b5b21b5b543d910461\"},
{\"ID\":\"c2b3d728-4879-5343-a92a-
b735752a4724\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\8e
d04b60acc0f65f541292a9e598d5f73019c8db425f8d49ea5819eab16a42f3\"},
{\"ID\":\"2973e760-dc59-5800-a3de-
ab9d93be81e5\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\cc
71305d45f09ce377ef497f28c3a74ee027c27f20657d2c4a5f157d2457cc75\"},
{\"ID\":\"454a7d36-038c-5364-8a25-
fa84091869d6\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\9e
8cde1ce8f5de861a5f22841f1ab9bc53d5f606d06efeacf5177f340e8d54d0\"},
{\"ID\":\"9b748c8c-69eb-55fb-a1c1-
5688cac4efd8\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\8e
02bf5404057055a71d542780a2bb2731be4b3707c01918ba969fb4d83b98ec\"},
{\"ID\":\"bfde5c26-b33f-5424-9405-
9d69c2fea4d0\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\77
483cedfb0964008c33d92d306734e1fab3b5e1ebb27e898f58ccfd108108f2\"},
{\"ID\":\"bdabfbf5-80d1-57f1-86f3-
448ce97e2d05\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\ae
d2ebbb31ad24b38ee8521dd17744319f83d267bf7f360bc177e27ae9a006cf\"},
{\"ID\":\"ad9b34f2-dcee-59ea-8962-
b30704ae6331\",\"Path\":\"C:\\\\ProgramData\\\\docker\\\\windowsfilter\\\\d4
4d3a675fec1070b61d6ea9bacef4ac12513caf16bd6453f043eed2792f75d8\"}],\"HostNam
e\":\"fabrikamfiber.web-789699744-rqv6p\",\"MappedDirectories\":
[{\"HostPath\":\"c:\\\\var\\\\lib\\\\kubelet\\\\pods\\\\b50f0027-ad29-11e7-
b16e-000d3afd2878\\\\volumes\\\\kubernetes.io~secret\\\\default-token-
rw9dn\",\"ContainerPath\":\"c:\\\\var\\\\run\\\\secrets\\\\kubernetes.io\\\\
serviceaccount\",\"ReadOnly\":true,\"BandwidthMaximum\":0,\"IOPSMaximum\":0}
],\"HvPartition\":false,\"EndpointList\":null,\"NetworkSharedContainerName\"
:\"586870f5833279678773cb700db3c175afc81d557a75867bf39b43f985133d13\",\"Serv
icing\":false,\"AllowUnqualifiedDNSQuery\":false}"}
33m 11s 151 kubelet, 38519acs9011
Warning FailedSync Error syncing pod
32m 11s 139 kubelet, 38519acs9011
spec.containers{fabrikamfiberweb} Warning BackOff
Back-off restarting failed container

Mitigación: usar etiquetas de nodo y nodeSelector


Ejecuta kubectl get node para obtener una lista de todos los nodos. Después de esto,
puedes ejecutar kubectl describe node (nombre del nodo) para obtener más detalles.

En el ejemplo siguiente, dos nodos de Windows ejecutan versiones diferentes:


$ kubectl get node

NAME STATUS AGE VERSION


38519acs9010 Ready 21h v1.7.7-7+e79c96c8ff2d8e
38519acs9011 Ready 4h v1.7.7-25+bc3094f1d650a2
k8s-linuxpool1-38519084-0 Ready 21h v1.7.7
k8s-master-38519084-0 Ready 21h v1.7.7

$ kubectl describe node 38519acs9010

Name: 38519acs9010
Role:
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/instance-type=Standard_D2_v2
beta.kubernetes.io/os=windows
failure-domain.beta.kubernetes.io/region=westus2
failure-domain.beta.kubernetes.io/zone=0
kubernetes.io/hostname=38519acs9010
Annotations: node.alpha.kubernetes.io/ttl=0
volumes.kubernetes.io/controller-managed-attach-
detach=true
Taints: <none>
CreationTimestamp: Fri, 06 Oct 2017 01:41:02 +0000

...

System Info:
Machine ID: 38519acs9010
System UUID:
Boot ID:
Kernel Version: 10.0 14393
(14393.1715.amd64fre.rs1_release_inmarket.170906-1810)
OS Image:
Operating System: windows
Architecture: amd64
...

$ kubectl describe node 38519acs9011


Name: 38519acs9011
Role:
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/instance-type=Standard_DS1_v2
beta.kubernetes.io/os=windows
failure-domain.beta.kubernetes.io/region=westus2
failure-domain.beta.kubernetes.io/zone=0
kubernetes.io/hostname=38519acs9011
Annotations: node.alpha.kubernetes.io/ttl=0
volumes.kubernetes.io/controller-managed-attach-
detach=true
Taints: <none>
CreationTimestamp: Fri, 06 Oct 2017 18:13:25 +0000
Conditions:
...
System Info:
Machine ID: 38519acs9011
System UUID:
Boot ID:
Kernel Version: 10.0 16299
(16299.0.amd64fre.rs3_release.170922-1354)
OS Image:
Operating System: windows
Architecture: amd64
...

Vamos a usar este ejemplo para mostrar cómo hacer coincidir las versiones:

1. Anota el nombre de cada nodo y el valor de Kernel Version de la información del


sistema.

En nuestro ejemplo, la información se verá como sigue:

Nombre Version

38519acs9010 14393.1715.amd64fre.rs1_release_inmarket.170906-1810

38519acs9011 16299.0.amd64fre.rs3_release.170922-1354

2. Agrega una etiqueta para cada nodo denominada beta.kubernetes.io/osbuild .


Windows Server 2016 necesita que se admitan las versiones principal y secundaria
(en este ejemplo, 14393.1715) sin aislamiento de Hyper-V. Windows Server, versión
1709, solo necesita la versión principal (en este ejemplo, 16299) para coincidir.

En este ejemplo, el comando para agregar las etiquetas tiene el siguiente aspecto:

$ kubectl label node 38519acs9010 beta.kubernetes.io/osbuild=14393.1715

node "38519acs9010" labeled


$ kubectl label node 38519acs9011 beta.kubernetes.io/osbuild=16299

node "38519acs9011" labeled

3. Comprueba que las etiquetas están allí ejecutando kubectl get nodes --show-
labels.

En este ejemplo, el resultado tendrá este aspecto:


$ kubectl get nodes --show-labels

NAME STATUS AGE


VERSION LABELS
38519acs9010 Ready,SchedulingDisabled 3d
v1.7.7-7+e79c96c8ff2d8e
beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-
type=Standard_D2_v2,beta.kubernetes.io/os=windows,beta.kubernetes.io/os
build=14393.1715,failure-
domain.beta.kubernetes.io/region=westus2,failure-
domain.beta.kubernetes.io/zone=0,kubernetes.io/hostname=38519acs9010
38519acs9011 Ready 3d
v1.7.7-25+bc3094f1d650a2
beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-
type=Standard_DS1_v2,beta.kubernetes.io/os=windows,beta.kubernetes.io/o
sbuild=16299,failure-domain.beta.kubernetes.io/region=westus2,failure-
domain.beta.kubernetes.io/zone=0,kubernetes.io/hostname=38519acs9011
k8s-linuxpool1-38519084-0 Ready 3d v1.7.7
agentpool=linuxpool1,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/i
nstance-type=Standard_D2_v2,beta.kubernetes.io/os=linux,failure-
domain.beta.kubernetes.io/region=westus2,failure-
domain.beta.kubernetes.io/zone=0,kubernetes.io/hostname=k8s-linuxpool1-
38519084-0,kubernetes.io/role=agent
k8s-master-38519084-0 Ready 3d v1.7.7
beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-
type=Standard_D2_v2,beta.kubernetes.io/os=linux,failure-
domain.beta.kubernetes.io/region=westus2,failure-
domain.beta.kubernetes.io/zone=0,kubernetes.io/hostname=k8s-master-
38519084-0,kubernetes.io/role=master

4. Agrega selectores de nodo a las implementaciones. En este caso de ejemplo,


agregaremos nodeSelector a la especificación de contenedor con
beta.kubernetes.io/os = windows y beta.kubernetes.io/osbuild = 14393.* o
16299 para que coincida con el sistema operativo base utilizado por el contenedor.

A continuación se muestra un ejemplo completo para ejecutar un contenedor


creado para Windows Server 2016:

YAML

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
annotations:
kompose.cmd: kompose convert -f docker-compose-combined.yml
kompose.version: 1.2.0 (99f88ef)
creationTimestamp: null
labels:
io.kompose.service: fabrikamfiber.web
name: fabrikamfiber.web
spec:
replicas: 1
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
io.kompose.service: fabrikamfiber.web
spec:
containers:
- image: patricklang/fabrikamfiber.web:latest
name: fabrikamfiberweb
ports:
- containerPort: 80
resources: {}
restartPolicy: Always
nodeSelector:
"beta.kubernetes.io/os": windows
"beta.kubernetes.io/osbuild": "14393.1715"
status: {}

El pod ya puede iniciarse con la implementación actualizada. Los selectores de


nodo también se muestran en kubectl describe pod <podname> , por lo que puedes
ejecutar ese comando para verificar que se han agregado.

La salida de nuestro ejemplo es la siguiente:

$ kubectl -n plang describe po fa

Name: fabrikamfiber.web-1780117715-5c8vw
Namespace: plang
Node: 38519acs9010/10.240.0.4
Start Time: Tue, 10 Oct 2017 01:43:28 +0000
Labels: io.kompose.service=fabrikamfiber.web
pod-template-hash=1780117715
Annotations: kubernetes.io/created-by=
{"kind":"SerializedReference","apiVersion":"v1","reference":
{"kind":"ReplicaSet","namespace":"plang","name":"fabrikamfiber.web-
1780117715","uid":"6a07aaf3-ad5c-11e7-b16e-000d3...
Status: Running
IP: 10.244.1.84
Created By: ReplicaSet/fabrikamfiber.web-1780117715
Controlled By: ReplicaSet/fabrikamfiber.web-1780117715
Containers:
fabrikamfiberweb:
Container ID:
docker://c94594fb53161f3821cf050d9af7546991aaafbeab41d333d9f64291327fae
13
Image: patricklang/fabrikamfiber.web:latest
Image ID: docker-
pullable://patricklang/fabrikamfiber.web@sha256:562741016ce7d9a232a3894
49a4fd0a0a55aab178cf324144404812887250ead
Port: 80/TCP
State: Running
Started: Tue, 10 Oct 2017 01:43:42 +0000
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-
rw9dn (ro)
Conditions:
Type Status
Initialized True
Ready True
PodScheduled True
Volumes:
default-token-rw9dn:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-rw9dn
Optional: false
QoS Class: BestEffort
Node-Selectors: beta.kubernetes.io/os=windows
beta.kubernetes.io/osbuild=14393.1715
Tolerations: <none>
Events:
FirstSeen LastSeen Count From
SubObjectPath Type Reason
Message
--------- -------- ----- ---- -------
------ -------- ------
-------
5m 5m 1 default-scheduler
Normal Scheduled Successfully assigned
fabrikamfiber.web-1780117715-5c8vw to 38519acs9010
5m 5m 1 kubelet, 38519acs9010
Normal SuccessfulMountVolume MountVolume.SetUp succeeded for
volume "default-token-rw9dn"
5m 5m 1 kubelet, 38519acs9010
spec.containers{fabrikamfiberweb} Normal Pulling
pulling image "patricklang/fabrikamfiber.web:latest"
5m 5m 1 kubelet, 38519acs9010
spec.containers{fabrikamfiberweb} Normal Pulled
Successfully pulled image "patricklang/fabrikamfiber.web:latest"
5m 5m 1 kubelet, 38519acs9010
spec.containers{fabrikamfiberweb} Normal Created
Created container
5m 5m 1 kubelet, 38519acs9010
spec.containers{fabrikamfiberweb} Normal Started
Started container
Actualización de contenedores de
Windows Server
Artículo • 05/02/2025

Se aplica a: Windows Server 2025, Windows Server 2022, Windows Server 2019,
Windows Server 2016

Como parte del mantenimiento de Windows Server cada mes, publicamos


periódicamente imágenes base de contenedor del SO Windows Server actualizadas. Con
estas actualizaciones, puedes automatizar la creación de imágenes de contenedor
actualizadas o actualizarlas manualmente extrayendo de la versión más reciente. Los
contenedores de Windows Server no tienen una pila de servicio, como Windows Server.
No puedes obtener actualizaciones en un contenedor como lo haces con Windows
Server. Por lo tanto, cada mes volvemos a generar las imágenes base de contenedor del
SO Windows Server con las actualizaciones, y publicamos las imágenes de contenedor
actualizadas.

Otras imágenes de contenedor, como .NET o IIS, se volverán a generar en función de las
imágenes base de contenedor del SO actualizadas y se publicarán mensualmente.

Cómo obtener actualizaciones de contenedores


de Windows Server
Actualizamos las imágenes base de contenedor del SO Windows Server en consonancia
con la cadencia de entregas de Windows. Las imágenes de contenedor actualizadas se
publican el segundo martes de cada mes, a los que a veces llamamos la publicación "B",
con un número de prefijo según el mes de publicación. Por ejemplo, llamamos a la
actualización de febrero "2B" y a la actualización de marzo "3B". Este evento de
actualización mensual es la única versión normal que incluye nuevas correcciones de
seguridad.

El servidor que hospeda estos contenedores, denominado host de contenedor o


simplemente "host", se puede atender durante otros eventos de actualización distintos
de las publicaciones "B". Para más información sobre la cadencia de mantenimiento de
actualizaciones de Windows, vea nuestra entrada de blog Explicación de las
actualizaciones mensuales de Windows .

Si estás más familiarizado con Docker Hub que con MCR, esta entrada de blog te
proporcionará una explicación más detallada.
Para obtener una lista completa de las imágenes de contenedor del sistema operativo
base de Windows Server, las versiones y sus respectivas etiquetas, vea los siguientes
recursos en Docker Hub:

Windows Server
Windows Server Core
Nano Server

Las imágenes de Windows Server con entrega mensual que publica Microsoft en Azure
Marketplace también vienen con imágenes base de contenedor del SO preinstaladas.
Encontrarás más información en nuestra página de precios de Azure Marketplace para
Windows Server . Normalmente actualizamos estas imágenes unos cinco días
laborables después de la publicación "B".

Para obtener una lista completa de las imágenes y versiones de Windows Server,
consulta el historial de actualizaciones de publicación de Windows Server en Azure
Marketplace .

Compatibilidad de versiones de host y


contenedor
Hay dos tipos de modos de aislamiento para los contenedores de Windows: aislamiento
de procesos y aislamiento de Hyper-V. El aislamiento de Hyper-V es más flexible en
cuanto a la compatibilidad entre versiones de host y contenedor. Para más información,
consulta Compatibilidad de versiones y Modos de aislamiento. Esta sección se centrará
en los contenedores con aislamiento de procesos, a menos que se indique lo contrario.

Al actualizar el host de contenedor o la imagen del contenedor con las actualizaciones


mensuales, siempre y cuando se admitan tanto el host como la imagen de contenedor
(Windows Server versión 1809 o posterior), no es necesario que las revisiones del host y
de la imagen del contenedor coincidan para que el contenedor se inicie y ejecute con
normalidad.

No obstante, podrías tener problemas al usar contenedores de Windows Server con la


versión de actualización de seguridad del 11 de febrero de 2020 (también denominada
"2B") o versiones posteriores de actualización de seguridad mensuales. Para más
información, consulta este artículo de Soporte técnico de Microsoft . Estos problemas
provienen de un cambio de seguridad que exigía que una interfaz entre el modo de
usuario y el modo kernel cambiara para garantizar la seguridad de las aplicaciones.
Estos problemas solo se producen en los contenedores con aislamiento de procesos, ya
que estos contenedores comparten el modo de kernel con el host de contenedor. Esto
significa que las imágenes de contenedor sin el componente de modo de usuario
actualizado no eran seguras y no eran compatibles con la nueva interfaz de kernel
protegida.

El 18 de febrero de 2020 publicamos una corrección. Esta nueva versión ha establecido


una "nueva línea base". Esta nueva línea base sigue estas reglas:

Toda combinación de hosts y contenedores anteriores a 2B funcionará.


Toda combinación de hosts y contenedores donde ambos sean posteriores a 2B
funcionará.
Ninguna combinación de hosts y contenedores en distintos lados de la nueva base
de referencia funcionará. Por ejemplo, un host 3B y un contenedor 1B no
funcionarán.

Usemos la publicación de la actualización de seguridad mensual de marzo de 2020


como ejemplo para mostrar cómo funcionan estas nuevas reglas de compatibilidad. En
la tabla siguiente, la publicación de la actualización de seguridad de marzo de 2020 se
denomina "3B", la actualización de febrero de 2020 es "2B", y la actualización de enero
de 2020 es "1B".

ノ Expandir tabla

Host Contenedor Compatibilidad

3B 3B Sí

3B 2B Sí

3B 1B o anterior No

2B 3B Sí

2B 2B Sí

2B 1B o anterior No

1B o anterior 3B No

1B o anterior 2B No

1B o anterior 1B o anterior Sí

Solución de errores de coincidencia entre el


host y la imagen de contenedor
Antes de empezar, asegúrate de familiarizarte con la información de Compatibilidad de
versiones. Esta información te ayudará a averiguar si el problema se debe a que las
revisiones no coinciden. Si estableces que la causa se debe a la falta coincidencia entre
las revisiones, puedes seguir las instrucciones de esta sección para solucionar el
problema.

Consulta de la versión del host de contenedor


Si puedes acceder al host de contenedor, puedes ejecutar el comando ver para obtener
su versión del SO. Por ejemplo, si ejecutas ver en un sistema que ejecuta
Windows Server 2019 con la publicación más reciente de la actualización de seguridad
de febrero de 2020, verás lo siguiente:

batch

Microsoft Windows [Version 10.0.17763.1039]


(c) 2018 Microsoft Corporation. All rights reserved.

C:\>ver

Microsoft Windows [Version 10.0.17763.1039]

7 Nota

El número de revisión de este ejemplo se muestra como 1039, no 1040, porque la


publicación de la actualización de seguridad de febrero de 2020 no tenía una
versión 2B extraordinaria para Windows Server. Solo había una versión 2B
extraordinaria para los contenedores, que tenía un número de revisión de 1040.

Si no tienes acceso directo al host de contenedor, consulta con el administrador de TI. Si


trabajas en la nube, consulta el sitio web del proveedor de la nube para averiguar en
qué versión del SO del host de contenedor se ejecuta. Por ejemplo, si usas Azure
Kubernetes Service (AKS), puedes encontrar la versión del SO del host en las notas de la
versión de AKS .

Consulta de la versión de la imagen del contenedor


Sigue estas instrucciones para averiguar qué versión ejecuta el contenedor:

1. En PowerShell, ejecute el siguiente cmdlet:

PowerShell
docker images

La salida debe parecerse a lo siguiente:

PowerShell

REPOSITORY TAG IMAGE ID


CREATED SIZE
mcr.microsoft.com/windows/servercore ltsc2019 b456290f487c
4 weeks ago 4.84GB
mcr.microsoft.com/windows 1809 58229ca44fa7
4 weeks ago 12GB
mcr.microsoft.com/windows/nanoserver 1809 f519d4f3a868
4 weeks ago 251M

2. Ejecute el comando docker inspect para el identificador de imagen de la imagen


de contenedor que no funciona. Esto le mostrará la versión de destino de la
imagen de contenedor.

Por ejemplo, supongamos que ejecutamos run docker inspect para una imagen
de contenedor ltsc 2019:

PowerShell

docker inspect b456290f487c

"Architecture": "amd64",

"Os": "windows",

"OsVersion": "10.0.17763.1039",

"Size": 4841309825,

"VirtualSize": 4841309825,

En este ejemplo, la versión del SO del contenedor se muestra como


10.0.17763.1039 .

Si ya estás ejecutando un contenedor, también puedes ejecutar el comando ver


dentro del contenedor para obtener la versión. Por ejemplo, al ejecutar ver en una
imagen de contenedor de Server Core de Windows Server 2019 con la publicación
más reciente de la actualización de seguridad de febrero de 2020, se mostrará lo
siguiente:
batch

Microsoft Windows [Version 10.0.17763.1040]


(c) 2020 Microsoft Corporation. All rights reserved.

C:\>ver

Microsoft Windows [Version 10.0.17763.1040]

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Actualización de contenedores a una
nueva versión del sistema operativo
Windows
Artículo • 05/02/2025

Se aplica a: Windows Server 2025, Windows Server 2022, Windows Server 2019,
Windows Server 2016

En este tema se describe cómo actualizar contenedores de Windows a una nueva


versión del sistema operativo Windows o Windows Server. Hay dos pasos para actualizar
contenedores:

1. Actualice el host de contenedor a la nueva versión del sistema operativo.


2. Cree nuevas instancias de contenedor mediante la nueva versión del sistema
operativo.

7 Nota

Si solo tiene que actualizar (o revisar) la imagen actual del contenedor del sistema
operativo base de Windows, vea Actualización de los contenedores para extraer la
imagen de revisión más reciente para los contenedores.

Actualización del host del contenedor


Para actualizar el host de contenedor a una versión más reciente de Windows o
Windows Server, puede realizar una actualización local o una instalación limpia. Dado
que el host de contenedor y los contenedores de Windows comparten un único kernel,
debe asegurarse de que la versión del sistema operativo de la imagen base del
contenedor coincide con la del host. Pero todavía puede tener una versión más reciente
del host de contenedor con una imagen base anterior con aislamiento de Hyper-V. En
Windows Server 2022, puede implementar este escenario con aislamiento de procesos
(en versión preliminar).

Creación de nuevas instancias de contenedor


mediante la nueva versión del sistema
operativo
Para crear las nuevas instancias de contenedor, necesitará:

Extracción de la imagen base del contenedor


Edición del Dockerfile para que apunte a la nueva imagen base
Compilación y ejecución de la nueva imagen de aplicación
Etiquete e inserte la imagen en el registro

Extracción de la imagen base del contenedor


Después de haber extraído la nueva versión del sistema operativo Windows en el host
de contenedor, siga los pasos siguientes para actualizar la imagen base:

1. Seleccione la imagen base del contenedor a la que desea actualizar.

2. Abra una sesión de PowerShell como administrador y, en función de la versión del


sistema operativo que eligió, ejecute el comando de extracción de Docker para
extraer una imagen:

PowerShell

PS C:\> docker pull mcr.microsoft.com/windows/servercore:ltsc2022

En este ejemplo se extrae la imagen base Server Core versión 20H2.

3. Una vez finalizada la descarga de la imagen, puede comprobar que se ha extraído


la nueva imagen mediante la ejecución del comando docker images para
devolver una lista de imágenes extraídas:

PowerShell

docker images

Edición del Dockerfile para que apunte a la nueva imagen


base
A continuación, quiere crear e iniciar nuevas instancias de contenedor mediante la
nueva imagen base que ha extraído. Para automatizar este proceso, edite el Dockerfile
para redirigirlo a la nueva imagen.

7 Nota
Si quiere actualizar la imagen de cualquier contenedor que se esté ejecutando
actualmente, deberá detener los contenedores mediante docker stop y, a
continuación, ejecutar docker rm para quitar los contenedores.

Abra el Dockerfile en un editor de texto y realice las actualizaciones. En el ejemplo


siguiente, el Dockerfile se actualiza a Server Core 20H2 con la aplicación IIS.

Dockerfile

FROM mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2022 AS
build-env
WORKDIR /app

COPY *.csproj ./
RUN PowerShell Install-WindowsFeature NET-Framework-45-ASPNET

FROM mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2022
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["ServiceMonitor.exe", "w3svc"]

Compilación y ejecución de la nueva imagen de


aplicación
Una vez actualizado el Dockerfile, debe compilar y ejecutar la imagen de la aplicación.

1. Utiliza el comando docker build para construir tu imagen, como se muestra a


continuación:

PowerShell

docker build -t iss .

2. Para ejecutar el contenedor recién compilado, ejecute el comando docker run :

PowerShell

docker run -d -p 8080:80 --name iss-app iss

Etiquete e inserte la imagen en el registro


Para permitir que otros hosts vuelvan a usar la nueva imagen, debe etiquetar y, a
continuación, subir la imagen de contenedor a su registro.
1. Use etiqueta docker para etiquetar la imagen de la siguiente manera:

PowerShell

docker tag mcr.microsoft.com/windows/servercore/iis:windowsservercore-


ltsc2022 <login-server>/iss

2. Use docker push para insertar la imagen en el registro de contenedores de la


siguiente manera:

PowerShell

docker push <login-server> iss

Actualización de contenedores mediante un


orquestador
También puede volver a implementar los contenedores de Windows mediante un
orquestador, como Azure Kubernetes Service y AKS en Azure Stack HCI. El orquestador
proporciona una automatización eficaz para hacerlo a escala. Para más información,
consulte Tutorial: Actualización de una aplicación en Azure Kubernetes Service o
Tutorial: Actualización de una aplicación en Azure Kubernetes Service en Azure Stack
HCI.

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Implementar controles de recursos para
contenedores de Windows
Artículo • 21/03/2023

Se aplica a: Windows Server 2022, Windows Server 2019

Hay varios controles de recursos que pueden implementarse por contenedor y por
recurso. De forma predeterminada, los contenedores ejecutados están sujetos a la
administración habitual de recursos de Windows, lo que, en general, se comparte de
forma equitativa. Sin embargo, un desarrollador o administrador puede limitar el uso de
los recursos, o influir sobre él, tras configurar estos controles. Entre los recursos que se
pueden controlar se incluyen: CPU/procesador, memoria/RAM, disco/almacenamiento y
redes/rendimiento.

Los contenedores de Windows utilizan objetos de trabajo para agrupar y realizar un


seguimiento de los procesos asociados a cada contenedor. Los controles de recursos se
implementan en el objeto de trabajo principal asociado al contenedor.

En el caso de aislamiento de Hyper-V, los controles de recursos se aplican a la máquina


virtual y al objeto de trabajo del contenedor que se ejecuta automáticamente en dicha
máquina. Esto garantiza que aunque un proceso que se ejecuta en el contenedor
omitiera o pasara por alto los controles de objetos de trabajo, la máquina virtual se
aseguraría de que fuera incapaz de superar los controles de recursos definidos.

Recursos
Para cada recurso, esta sección ofrece una asignación entre la interfaz de línea de
comandos Docker como un ejemplo de cómo debería usarse el control de recursos (un
orquestador u otras herramientas pueden configurarlo) a la API de servicio de proceso
de host (HCS) que ha implementado Windows (ten en cuenta que esta descripción es de
nivel alto y que la implementación subyacente está sujeta a cambios).

Memoria

Resource Location

Interfaz de docker --memory

Interfaz de HCS MemoryMaximumInMB


Resource Location

Kernel compartido JOB_OBJECT_LIMIT_JOB_MEMORY

Aislamiento de Hyper-V Memoria de máquina virtual

7 Nota

Con respecto al aislamiento de Hyper-V en Windows Server 2016, al usar un límite


de memoria, verá cómo el contenedor asigna inicialmente el límite de memoria y,
luego, se inicia para devolverlo al host de contenedor. Las versiones posteriores de
Windows Server (1709 o posteriores) han optimizado este proceso.

CPU (recuento)

Resource Location

Interfaz de docker --cpus

Interfaz de HCS ProcessorCount

Kernel compartido Simulado con JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP*

Aislamiento de Hyper-V Número de procesadores virtuales expuestos

CPU (porcentaje)

Resource Location

Interfaz de docker --cpu-percent

Interfaz de HCS ProcessorMaximum

Kernel compartido JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP

Aislamiento de Hyper-V Límites de hipervisor en procesadores virtuales

CPU (recursos compartidos)

Resource Location

Interfaz de docker --cpu-shares

Interfaz de HCS ProcessorWeight


Resource Location

Kernel compartido JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED

Aislamiento de Hyper-V Pesos de procesadores virtuales de hipervisor

Almacenamiento (imagen)

Resource Location

Interfaz de docker --io-maxbandwidth/--io-maxiops

Interfaz de HCS StorageIOPSMaximum y StorageBandwidthMaximum

Kernel compartido JOBOBJECT_IO_RATE_CONTROL_INFORMATION

Aislamiento de Hyper-V JOBOBJECT_IO_RATE_CONTROL_INFORMATION

Almacenamiento (volúmenes)

Resource Location

Interfaz de docker --storage-opt size=

Interfaz de HCS StorageSandboxSize

Kernel compartido JOBOBJECT_IO_RATE_CONTROL_INFORMATION

Aislamiento de Hyper-V JOBOBJECT_IO_RATE_CONTROL_INFORMATION

Detalles o notas adicionales

Requisitos de memoria
Los contenedores de Windows ejecutan algún proceso del sistema en cada contenedor;
por lo general, aquellos que proporcionan funcionalidad por contenedor como la
administración de usuarios, redes etc… y si bien gran parte de la memoria necesaria
para estos procesos se comparte entre contenedores, el límite de memoria debe ser lo
suficientemente alto como para permitirlos. En el documento requisitos del sistema se
incluye una tabla para cada tipo de imagen base con y sin aislamiento de Hyper-V.

Recursos compartidos de CPU (sin el aislamiento de


Hyper-V)
Al usar los recursos compartidos de CPU, la implementación subyacente (cuando no se
utiliza el aislamiento de Hyper-V) configura
JOBOBJECT_CPU_RATE_CONTROL_INFORMATION, lo que establece específicamente la
marca de control en JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED y proporciona
un peso adecuado. Los intervalos de peso válido del objeto de trabajo son 1 – 9 con un
valor predeterminado de 5, lo que supone una fidelidad inferior a los valores de
servicios de proceso de host de 1-10000. A modo de ejemplo, un peso de recurso
compartido de 7500 produciría un peso de 7 o un peso de recurso compartido de 2500
daría como resultado un valor de 2.
Zona horaria virtualizada
Artículo • 05/02/2025

Se aplica a: Windows Server 2025, Windows Server 2022, Windows Server 2019,

Los contenedores de Windows admiten la capacidad de mantener una configuración de


zona horaria virtualizada independiente del host. Todas las configuraciones usadas
tradicionalmente para la zona horaria del host se han virtualizado y se crean instancias
de cada contenedor. Con esta característica, los contenedores de Windows ofrecen los
siguientes comportamientos:

Al iniciar el contenedor, la zona horaria del host se hereda y permanece dentro del
contenedor. Si la zona horaria del host cambia mientras se ejecuta el contenedor,
la zona horaria almacenada en el contenedor no cambia. Para volver a heredar la
zona horaria del host, se debe reiniciar el contenedor.
El contenedor mantiene la configuración de zona horaria del host que se observa
al iniciar el contenedor solo hasta que el usuario configura explícitamente la zona
horaria desde dentro del contenedor. Una vez establecida la zona horaria desde
dentro del contenedor, la configuración se virtualiza y el contenedor ya no hace
referencia al host.
Si configura la zona horaria del contenedor y, posteriormente, guarda el estado del
contenedor, la configuración de zona horaria persiste en los reinicios.

Todas las API de modo kernel y modo de usuario relacionadas con la configuración de la
zona horaria del sistema ahora son compatibles con contenedores. Cuando un
subproceso que se ejecuta en el contexto de un contenedor llama a una API del sistema
para consultar la hora local, recupera la configuración de zona horaria del contenedor
en lugar de la del host. Los datos de zona horaria escritos desde dentro de un
contenedor ahora se conservan en el almacenamiento específico del contenedor y el
contenedor en cuestión ya no hereda los datos de zona horaria actuales del host
durante el inicio. Esto significa que una vez establecida la zona horaria, el contenedor
sigue usando la zona horaria configurada entre reinicios. Los contenedores construidos
sobre una imagen heredan la configuración de zona horaria mientras esté
explícitamente establecida en alguna de las capas.

En la tabla siguiente se muestra la compilación admitida para cada SKU:

ノ Expandir tabla
SKU Versión admitida

Windows Server 2019 10.0.17763.1935 o superior

20H2 SAC 10.0.19042.985 o posterior

Windows Server 2022 Todas las versiones

Windows Server 2025 Todas las versiones

¿Cómo se configura la zona horaria del


contenedor?
En primer lugar, necesita tanto las versiones de host como las de invitado que
contienen esta característica, lo que significa que ambas se deben ejecutar en una
revisión de mantenimiento de 2105B o superior. La ejecución de versiones anteriores
simplemente revierte el comportamiento del contenedor a reflejar la zona horaria del
host, y la configuración no afecta ni al host ni al sistema invitado.

7 Nota

La configuración de la zona horaria requiere privilegios administrativos,


específicamente SeTimeZonePrivilege. La cuenta ContainerAdministrator tiene este
privilegio. Por lo tanto, la recomendación es ejecutar con los privilegios mínimos
necesarios para la carga de trabajo y reservar la cuenta ContainerAdministrator
para las tareas administrativas, como establecer la zona horaria.

La manera recomendada de configurar la zona horaria del contenedor es a través de


la utilidad TZUtil.exe o el cmdlet Set-TimeZone de PowerShell. Estas utilidades se
mantienen bien y ofrecen comodidad para establecer fácilmente la zona horaria.
Cualquier otro método debe interactuar directamente con las API del sistema. Las
versiones de imagen base con TZUtil.exe o PowerShell incluido funcionarán de forma
inmediata. La imagen base de Nanoserver es una excepción, ya que esta imagen no
admite TZUtil.exe ni PowerShell de forma predeterminada, por lo que requiere una
utilidad personalizada para interactuar con las API del sistema. En cualquier caso, las
aplicaciones recién escritas NO deben depender de la zona horaria del sistema
operativo a menos que sea absolutamente necesario y, en su lugar, deben tenerlo en
cuenta en los datos y la lógica de la aplicación.

Ejemplo de uso de Windows Server 2019


Con la imagen base de Windows Server 2019 Server Core , a continuación se muestra
un ejemplo para establecer una zona horaria virtualizada.

1. Después de iniciar el contenedor, establezca la zona horaria en la zona horaria del


host (en este ejemplo, es hora estándar del Pacífico), como se muestra a
continuación:

PowerShell

PS C:\> tzutil /g
Pacific Standard Time

2. Establezca la zona horaria del host de en Hora estándar de Asia Central (UTC+6:00)
y observe que la hora estándar del Pacífico sigue apareciendo en el contenedor:

PowerShell

PS C:\> Get-TimeZone

Output

Id : Pacific Standard Time


DisplayName : (UTC-08:00) Pacific Time (US & Canada)
StandardName : Pacific Standard Time
DaylightName : Pacific Daylight Time
BaseUtcOffset : -08:00:00
SupportsDaylightSavingTime : True

Tenga en cuenta que, al iniciar el contenedor por primera vez, la configuración se


establece en lo que se configuró al crear la imagen base hasta configurarlo usted
mismo. En la mayoría de los casos para las imágenes base de Windows, el valor
predeterminado será Hora estándar del Pacífico.

3. A continuación, establezca la zona horaria del contenedor en "Hora estándar de


Samoa":

PowerShell

PS C:\> tzutil /s "Samoa Standard Time"


PS C:\> tzutil /g
Samoa Standard Time
PS C:\> Get-TimeZone

Output
Id : Samoa Standard Time
DisplayName : (UTC+13:00) Samoa
StandardName : Samoa Standard Time
DaylightName : Samoa Daylight Time
BaseUtcOffset : 13:00:00
SupportsDaylightSavingTime : True

Ahora la zona horaria del contenedor se ha actualizado a la hora estándar de


Samoa, pero el host permanece en la hora estándar de Asia Central. Esta
configuración persiste al guardar el estado del contenedor.

4. Si reinicia el contenedor sin guardar previamente su estado, la zona horaria se


establece en la zona horaria del host, como se muestra a continuación:

PowerShell

PS C:\>tzutil /g
Central Asia Standard Time
PS C:\> Get-TimeZone

Output

Id : Central Asia Standard Time


DisplayName : (UTC+06:00) Astana
StandardName : Central Asia Standard Time
DaylightName : Central Asia Daylight Time
BaseUtcOffset : 06:00:00
SupportsDaylightSavingTime : False

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Información general sobre la
orquestación de contenedores de
Windows
Artículo • 05/02/2025

Se aplica a: Windows Server 2025, Windows Server 2022, Windows Server 2019,
Windows Server 2016

Debido a su tamaño pequeño y orientación a la aplicación, los contenedores son


perfectos para entornos de entrega ágiles y arquitecturas basadas en microservicios. Sin
embargo, un entorno que usa contenedores y microservicios puede tener cientos o
miles de componentes para realizar un seguimiento. Es posible que pueda administrar
manualmente unas docenas de máquinas virtuales o servidores físicos, pero no hay
ninguna manera de administrar correctamente un entorno de contenedor a escala de
producción sin automatización. Esta tarea debe caer en el orquestador, que es un
proceso que automatiza y administra un gran número de contenedores y cómo
interactúan entre sí.

Los orquestadores realizan las siguientes tareas:

Programación: al recibir una imagen de contenedor y una solicitud de recurso, el


orquestador busca una máquina adecuada para ejecutar el contenedor.
Afinidad/Antiafinidad: especifique si un conjunto de contenedores debe ejecutarse
cerca unos de otros para el rendimiento o lejos unos de otros para la
disponibilidad.
Seguimiento de estado: observe si hay errores de contenedor y vuelva a
programarlos automáticamente.
Conmutación por error: realice el seguimiento de lo que se ejecuta en cada
máquina y vuelva a programar contenedores de máquinas con error en nodos
correctos.
Escalado: agregar o quitar instancias de contenedor según la demanda, de forma
manual o automática.
Redes: proporcione una red superpuesta que coordina los contenedores para
comunicarse entre varias máquinas host.
Detección de servicios: habilite los contenedores para localizarse entre sí
automáticamente incluso cuando se mueven entre las máquinas host y cambian
las direcciones IP.
Actualizaciones coordinadas de aplicaciones: administre las actualizaciones de
contenedores para evitar el tiempo de inactividad de la aplicación y habilitar la
reversión si algo va mal.

Tipos de orquestador
Azure ofrece los siguientes orquestadores de contenedor:

azure Kubernetes Service (AKS) facilita la creación, configuración y administración de un


clúster de máquinas virtuales preconfiguradas para ejecutar aplicaciones en contenedor.
Esto le permite usar sus aptitudes existentes y aprovechar un gran y creciente cuerpo de
conocimientos de la comunidad para implementar y administrar aplicaciones basadas
en contenedores en Microsoft Azure. Mediante AKS, puede aprovechar las
características de nivel empresarial de Azure, a la vez que mantiene la portabilidad de la
aplicación a través de Kubernetes y el formato de imagen de Docker.

AKS en Azure Stack HCI es una implementación local del conocido orquestador de AKS,
que automatiza la ejecución de aplicaciones en contenedores a escala. Azure
Kubernetes Service está disponible con carácter general en Azure Stack HCI y en
Windows Server 2019 Datacenter, lo que hace que sea más rápido empezar a hospedar
contenedores de Linux y Windows en el centro de datos.

Azure Service Fabric es una plataforma de sistemas distribuidos que facilita la


empaquetación, implementación y administración de microservicios y contenedores
escalables y confiables. Service Fabric aborda los desafíos importantes en el desarrollo y
la administración de aplicaciones nativas en la nube. Los desarrolladores y
administradores pueden evitar problemas complejos de infraestructura y centrarse en la
implementación de cargas de trabajo críticas y exigentes que son escalables, confiables
y administrables. Service Fabric representa la plataforma de próxima generación para
compilar y administrar estas aplicaciones de clase empresarial, de nivel 1 y de escala en
la nube que se ejecutan en contenedores.

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Docker Engine en Windows
Artículo • 23/01/2025

Se aplica a: Windows Server 2022, Windows Server 2019, Windows Server 2016

El cliente y el motor de Docker no se incluyen con Windows y deberán instalarse y


configurarse por separado. Además, el motor de Docker puede aceptar varias
configuraciones personalizadas. Algunos ejemplos incluyen la configuración de cómo
acepta el demonio las solicitudes entrantes, las opciones de red predeterminadas y la
configuración de registro y depuración. En Windows, estas configuraciones pueden
especificarse en un archivo de configuración o mediante el Administrador de control de
servicios de Windows. En este documento se detalla cómo instalar y configurar el motor
de Docker. Además, se proporcionan algunos ejemplos de configuraciones frecuentes.

Instalar Docker
Se necesita Docker para trabajar con contenedores de Windows. Docker está formado
por el motor de Docker (dockerd.exe) y el cliente de Docker (docker.exe). La forma más
fácil de instalar todo se encuentra en la guía de inicio rápido, que te ayudará a preparar
todo el equipo y ejecutar el primer contenedor.

Instalación de Docker

Para instalaciones con script, consulta Uso de un script para instalar Docker EE .

Antes de poder usar Docker, deberás instalar las imágenes de contenedor. Para obtener
más información, consulta los documentos para nuestras imágenes base de contenedor.

Configuración de Docker con un archivo de


configuración
El método preferido para configurar el motor de Docker en Windows es usar un archivo
de configuración. El archivo de configuración se encuentra en
'C:\ProgramData\Docker\config\daemon.json'. Puedes crear este archivo si aún no
existe.

7 Nota
No todas las opciones de configuración de Docker disponibles se pueden aplicar a
Docker en Windows. En el ejemplo siguiente, se muestran las opciones de
configuración que se aplican. Para información sobre la configuración del motor de
Docker, consulta Archivo de configuración de demonio de Docker .

JSON

{
"authorization-plugins": [],
"dns": [],
"dns-opts": [],
"dns-search": [],
"exec-opts": [],
"storage-driver": "",
"storage-opts": [],
"labels": [],
"log-driver": "",
"mtu": 0,
"pidfile": "",
"data-root": "",
"cluster-store": "",
"cluster-advertise": "",
"debug": true,
"hosts": [],
"log-level": "",
"tlsverify": true,
"tlscacert": "",
"tlscert": "",
"tlskey": "",
"group": "",
"default-ulimits": {},
"bridge": "",
"fixed-cidr": "",
"raw-logs": false,
"registry-mirrors": [],
"insecure-registries": [],
"disable-legacy-registry": false
}

Solo necesitas agregar los cambios de configuración deseados al archivo de


configuración. Por ejemplo, en este ejemplo se configura el motor de Docker para que
acepte las conexiones entrantes a través del puerto 2375. Las demás opciones de
configuración usarán los valores predeterminados.

JSON

{
"hosts": ["tcp://0.0.0.0:2375"]
}
Del mismo modo, en este ejemplo se configura el demonio de Docker para mantener
las imágenes y los contenedores en una ruta alternativa. Si no se especifica, el valor
predeterminado es c:\programdata\docker .

JSON

{
"data-root": "d:\\docker"
}

En este ejemplo se configura el demonio de Docker para aceptar únicamente


conexiones seguras a través del puerto 2376.

JSON

{
"hosts": ["tcp://0.0.0.0:2376", "npipe://"],
"tlsverify": true,
"tlscacert": "C:\\ProgramData\\docker\\certs.d\\ca.pem",
"tlscert": "C:\\ProgramData\\docker\\certs.d\\server-cert.pem",
"tlskey": "C:\\ProgramData\\docker\\certs.d\\server-key.pem",
}

Configuración de Docker en Docker Service


El motor de Docker también se puede configurar modificando el servicio de Docker con
sc config . Con este método, se establecen marcas de motor de Docker directamente

en el servicio de Docker. Ejecute el siguiente comando en un símbolo del sistema


(cmd.exe, no PowerShell):

Símbolo del sistema de Windows

sc config docker binpath= "\"C:\Program Files\docker\dockerd.exe\" --run-


service -H tcp://0.0.0.0:2375"

7 Nota

No es necesario ejecutar este comando si el archivo daemon.json ya contiene la


entrada "hosts": ["tcp://0.0.0.0:2375"] .

Configuración común
Los siguientes ejemplos de archivos de configuración muestran configuraciones de
Docker comunes. Esta configuración se puede combinar en un único archivo de
configuración.

Creación de red predeterminada


Para configurar el motor de Docker para que no se cree una red NAT predeterminada,
usa lo siguiente.

JSON

{
"bridge" : "none"
}

Para obtener más información, vea Administrar redes de Docker.

Definición del grupo de seguridad de Docker


Si has iniciado sesión en el host de Docker y ejecutas comandos de Docker de forma
local, estos se ejecutan a través de una canalización con nombre. De forma
predeterminada, solo los miembros del grupo de administradores pueden tener acceso
al motor de Docker a través de la canalización con nombre. Para especificar un grupo de
seguridad que tiene este acceso, use la marca group .

JSON

{
"group" : "docker"
}

Configuración de proxy
Para establecer la información del proxy para docker search y docker pull , cree una
variable de entorno de Windows con el nombre HTTP_PROXY o HTTPS_PROXY y un valor de
información del proxy. Esto se puede completar con PowerShell mediante un comando
similar al siguiente:

PowerShell

[Environment]::SetEnvironmentVariable("HTTP_PROXY",
"http://username:password@proxy:port/",
[EnvironmentVariableTarget]::Machine)

Una vez que se ha establecido la variable, reinicie el servicio Docker.

PowerShell

Restart-Service docker

Para más información, consulta Archivo de configuración de Windows en Docker.com .

Desinstalación de Docker
En esta sección te indicamos cómo desinstalar Docker y realizar una limpieza completa
de componentes del sistema Docker del sistema Windows 10 o Windows Server 2016.

7 Nota

Debes ejecutar todos los comandos incluidos en estas instrucciones desde una
sesión de PowerShell con privilegios elevados.

Preparación del sistema para quitar Docker


Antes de desinstalar Docker, asegúrate de que no haya contenedores en ejecución en el
sistema.

Ejecuta los siguientes cmdlets para comprobar los contenedores en ejecución:

PowerShell

# Leave swarm mode (this will automatically stop and remove services and
overlay networks)
docker swarm leave --force

# Stop all running containers


docker ps --quiet | ForEach-Object {docker stop $_}

También recomendamos eliminar todos los contenedores, imágenes de contenedor,


redes y volúmenes del sistema antes de eliminar Docker. Puedes realizarlo usando el
siguiente cmdlet:

PowerShell
docker system prune --volumes --all

Desinstalar Docker
A continuación, deberás desinstalar realmente Docker.

Para desinstalar Docker en Windows 10

Ve a Configuración>Aplicaciones en la máquina Windows 10


En Aplicaciones y características, busca Docker para Windows
Ve a Docker para Windows>Desinstalar

Para desinstalar Docker en Windows Server 2016:

Desde una sesión con privilegios elevados de PowerShell, usa los cmdlets Uninstall-
Package y Uninstall-Module para eliminar el módulo Docker y su correspondiente
Proveedor de administración de paquetes de tu sistema, como se muestra en el ejemplo
siguiente:

PowerShell

Uninstall-Package -Name docker -ProviderName DockerMsftProvider


Uninstall-Module -Name DockerMsftProvider

 Sugerencia

Puedes encontrar el Proveedor de paquetes que usaste para instalar Docker con PS
C:\> Get-PackageProvider -Name *Docker*

Limpieza de componentes del sistema y datos de Docker


Después de desinstalar Docker, deberás quitar las redes predeterminadas de Docker
para que su configuración no permanezca en el sistema después de que hayas
eliminado Docker. Puedes realizarlo usando el siguiente cmdlet:

PowerShell

Get-HNSNetwork | Remove-HNSNetwork

Para quitar las redes predeterminadas de Docker en Windows Server 2016.


PowerShell

Get-ContainerNetwork | Remove-ContainerNetwork

Ejecuta el cmdlet siguiente para quitar del sistema los datos del programa de Docker:

PowerShell

Remove-Item "C:\ProgramData\Docker" -Recurse

También puedes eliminar las características opcionales de Windows asociadas a Docker


o los contenedores en Windows.

Esto incluye la característica "Contenedores", que se habilita automáticamente en


Windows 10 o Windows Server 2016 cuando se instala Docker. También puede incluir la
característica "Hyper-V", que se habilita automáticamente en Windows 10 cuando
Docker está instalado, pero debe estar habilitado de forma explícita en Windows Server
2016.

) Importante

La característica Hyper-V es una característica de virtualización general que habilita


mucho más que solo contenedores. Antes de deshabilitar la característica Hyper-V,
asegúrate de que no hay otros componentes virtualizados en el sistema que la
necesiten.

Para quitar características de Windows en Windows 10:

Ve a Panel de control>Programas>Programas y características>Activar o


desactivar las características de Windows.
Busca el nombre de la características o características que te gustaría deshabilitar,
en este caso, Contenedores y (de forma opcional) Hyper-V.
Desactiva la casilla junto al nombre de la característica que quieres deshabilitar.
Selecciona "Aceptar" .

Para quitar las características de Windows en Windows Server 2016:

Desde una sesión con privilegios elevados de PowerShell, usa los siguientes cmdlets
para deshabilitar las características Contenedores y (de forma opcional) Hyper-V del
sistema:

PowerShell
Remove-WindowsFeature Containers
Remove-WindowsFeature Hyper-V

Reinicio del sistema


Para finalizar la desinstalación y la limpieza, ejecuta el siguiente cmdlet desde una sesión
de PowerShell con privilegios elevados para reiniciar el sistema:

PowerShell

Restart-Computer -Force

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Administración remota de un host de
Docker de Windows
Artículo • 05/02/2025

Incluso en ausencia de docker-machine todavía se puede crear un host de Docker


accesible de forma remota en una máquina virtual windows Server.

Los pasos son:

Cree los certificados en el servidor mediante dockertls . Si va a crear los


certificados con una dirección IP, puede considerar una dirección IP estática para
evitar tener que volver a crear certificados cuando cambie la dirección IP.
Reinicie el servicio docker Restart-Service Docker
Haga que los puertos TLS de Docker 2375 y 2376 estén disponibles mediante la
creación de una regla de NSG que permita el tráfico entrante. Tenga en cuenta que
para las conexiones seguras solo es necesario permitir 2376. En el portal se debe
mostrar una configuración de NSG como esta:

Permitir conexiones entrantes a través del Firewall de Windows.

PowerShell

New-NetFirewallRule -DisplayName 'Docker SSL Inbound' -Profile @('Domain',


'Public', 'Private') -Direction Inbound -Action Allow -Protocol TCP -
LocalPort 2376

Copie los archivos ca.pem , "cert.pem" y "key.pem" de la carpeta docker del usuario
en la máquina, por ejemplo, c:\users\chris\.docker a la máquina local. Por
ejemplo, se pueden copiar y pegar (Ctrl+C, Ctrl+V) los archivos de una sesión RDP.
Confirme que puede conectarse al host remoto de Docker. Ejecute:

PowerShell

docker -D -H tcp://wsdockerhost.southcentralus.cloudapp.azure.com:2376 --
tlsverify --tlscacert=c:\
users\foo\.docker\client\ca.pem --
tlscert=c:\users\foo\.docker\client\cert.pem --tlskey=c:\users\foo\.doc
ker\client\key.pem ps

Solución de problemas

Pruebe a conectarse sin TLS para determinar que la


configuración del firewall de NSG es correcta.
Los errores de conectividad normalmente se manifiestan en errores como:

PowerShell

error during connect: Get


https://wsdockerhost.southcentralus.cloudapp.azure.com:2376/v1.25/version:
dial tcp 13.85.27.177:2376: connectex: A connection attempt failed because
the connected party did not properly respond after a period of time, or
established connection failed because connected host has failed to respond.

Permitir conexiones sin cifrar, agregando

PowerShell

{
"tlsverify": false,
}

para c"\programdata\docker\config\daemon.json y, después, reinicie el servicio.

Conéctese al host remoto con una línea de comandos como:

PowerShell

docker -H tcp://wsdockerhost.southcentralus.cloudapp.azure.com:2376 --
tlsverify=0 version

Problemas de certificados
El acceso al host de Docker con un certificado no creado para la dirección IP o el
nombre DNS producirá un error:

Output
error during connect: Get https://w.x.y.c.z:2376/v1.25/containers/json:
x509: certificate is valid for 127.0.0.1, a.b.c.d, not w.x.y.z

Asegúrese de que w.x.y.z sea el nombre DNS de la dirección IP pública del host y de que
el nombre DNS coincida exactamente con el nombre común del certificado , que era
la variable de entorno SERVER_NAME o una de las direcciones IP en la variable
IP_ADDRESSES proporcionada a dockertls.

advertencia crypto/x509
Es posible que reciba una advertencia.

Output

level=warning msg="Unable to use system certificate pool: crypto/x509:


system root pool is not available on Windows"

La advertencia es benigna.

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Kubernetes en Windows
Artículo • 05/02/2025

 Sugerencia

¿Tiene curiosidad por averiguar qué características de Kubernetes se admiten


actualmente en Windows? Vea Características admitidas oficialmente para más
información.

Esta página sirve de información general para empezar a trabajar con Kubernetes en
Windows.

Prueba de Kubernetes en Windows


Consulte implementación de Kubernetes en Windows para obtener instrucciones sobre
cómo instalar Kubernetes manualmente en Windows en el entorno que prefiera.

Programación de contenedores de Windows


Consulte mejores prácticas para la programación de contenedores de Windows en
Kubernetes para recomendaciones sobre la programación de contenedores de
Windows en Kubernetes.

Implementación de Kubernetes en Windows en Azure


La guía Contenedores de Windows en Azure Kubernetes Service facilita esta tarea. Si
quiere implementar y administrar todos los componentes de Kubernetes usted mismo,
consulte nuestro tutorial paso a paso mediante la herramienta de AKS-Engine de
código abierto.

Solución de problemas
Consulte Solución de problemas de Kubernetes para obtener una lista sugerida de
soluciones y soluciones a problemas conocidos.

 Sugerencia
Para obtener más recursos de autoayuda, también hay una entrada de blog Guía
de solución de problemas de redes de Kubernetes .

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Solución de problemas de Kubernetes
Artículo • 23/01/2025

En esta página se describen varios problemas comunes con la configuración, las redes y
las implementaciones de Kubernetes.

 Sugerencia

Sugerir un elemento de preguntas más frecuentes mediante la generación de una


solicitud de incorporación de cambios al repositorio de documentación.

Esta página se subdivide en las siguientes categorías:

1. Preguntas generales
2. Errores comunes de red
3. Errores comunes de Windows
4. Errores de maestro comunes de Kubernetes

Preguntas generales

Cómo saber que Kubernetes en Windows se completó


correctamente?
Debería ver kubelet, kube-proxy y (si eligió Flannel como solución de red) procesos
flanneld host-agent que se ejecutan en el nodo. Además de esto, el nodo de Windows
debe aparecer como "Listo" en el clúster de Kubernetes.

¿Puedo configurar para ejecutar todo esto en segundo


plano?
A partir de la versión 1.11 de Kubernetes, kubelet y kube-proxy se pueden ejecutar
como servicios nativos de Windows. También puede usar siempre administradores de
servicios alternativos como nssm.exe para ejecutar siempre estos procesos (flanneld,
kubelet y kube-proxy) en segundo plano.

Errores comunes de red


Los equilibradores de carga se agrupan de forma
incoherente entre los nodos del clúster
En Windows, kube-proxy crea un equilibrador de carga de HNS para cada servicio de
Kubernetes del clúster. En la configuración de kube-proxy (valor predeterminado), los
nodos de clústeres que contienen muchos equilibradores de carga (normalmente 100+)
pueden agotarse de puertos TCP efímeros disponibles (a.k.a. intervalo de puertos
dinámicos, que de forma predeterminada cubre los puertos 49152 a 65535). Esto se
debe al gran número de puertos reservados en cada nodo para cada equilibrador de
carga (no DSR). Este problema puede manifestarse a través de errores en kube-proxy,
como:

Output

Policy creation failed: hcnCreateLoadBalancer failed in Win32: The specified


port already exists.

Los usuarios pueden identificar este problema ejecutando el script CollectLogs.ps1 y


consultando los *portrange.txt archivos.

También CollectLogs.ps1 imitará la lógica de asignación de HNS para probar la


disponibilidad de asignación del grupo de puertos en el intervalo de puertos TCP
efímero y notificar el éxito o el error en reservedports.txt . El script reserva 10 intervalos
de 64 puertos efímeros TCP (para emular el comportamiento de HNS), cuenta los éxitos
y errores de reserva y, a continuación, libera los intervalos de puertos asignados. Un
número de éxito menor que 10 indica que el grupo efímero se está quedando sin
espacio libre. También se generará un resumen heuristico del número de reservas de
puertos de 64 bloques aproximadamente disponibles en reservedports.txt .

Para resolver este problema, se pueden realizar algunos pasos:

1. Para una solución permanente, el equilibrio de carga kube-proxy debe


establecerse en modo DSR. El modo DSR está totalmente implementado y está
disponible solo en la compilación 18945 o superior de Windows Server Insider.
2. Como solución alternativa, los usuarios también pueden aumentar la configuración
predeterminada de Windows de puertos efímeros disponibles mediante un
comando como netsh int ipv4 set dynamicportrange TCP <start_port>
<port_count> . ADVERTENCIA: Invalidar el intervalo de puertos dinámicos

predeterminado puede tener consecuencias en otros procesos o servicios en el


host que dependen de los puertos TCP disponibles del intervalo no efímero, por lo
que este intervalo debe seleccionarse cuidadosamente.
3. Hay una mejora de escalabilidad para equilibradores de carga que no son DSR
mediante el uso compartido inteligente del grupo de puertos incluido en la
actualización acumulativa KB4551853 (y todas las actualizaciones acumulativas
más recientes).

La publicación de HostPort no funciona


Para usar la característica HostPort, asegúrese de que los complementos de CNI son la
versión v0.8.6 o superior, y de que el archivo de configuración de CNI tiene las
portMappings funcionalidades establecidas:

Output

"capabilities": {
"portMappings": true
}

Veo errores como "hnsCall failed in Win32: The wrong


diskette is in the drive".
Este error se puede producir al realizar modificaciones personalizadas en objetos HNS o
instalar una nueva Actualización de Windows que introduce cambios en HNS sin anular
objetos HNS antiguos. Indica que un objeto HNS que se creó anteriormente antes de
que una actualización no sea compatible con la versión de HNS instalada actualmente.

En Windows Server 2019 (y versiones anteriores), los usuarios pueden eliminar objetos
HNS eliminando el archivo HNS.data.

Output

Stop-Service HNS
rm C:\ProgramData\Microsoft\Windows\HNS\HNS.data
Start-Service HNS

Los usuarios deben poder eliminar directamente los puntos de conexión o redes de
HNS incompatibles:

Output

hnsdiag list endpoints


hnsdiag delete endpoints <id>
hnsdiag list networks
hnsdiag delete networks <id>
Restart-Service HNS

Los usuarios de Windows Server, versión 1903 pueden ir a la siguiente ubicación del
Registro y eliminar cualquier NIC que empiece por el nombre de red (por ejemplo
vxlan0 , o cbr0 ):

Output

\\Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vmsmp\parame
ters\NicList

Los contenedores en la implementación de host-gw de


Flannel en Azure no pueden acceder a Internet
Al implementar Flannel en modo host-gw en Azure, los paquetes deben pasar por el
vSwitch del host físico de Azure. Los usuarios deben programar rutas definidas por el
usuario de tipo "aplicación virtual" para cada subred asignada a un nodo. Esto se puede
hacer a través de Azure Portal (consulte un ejemplo aquí) o a través de az la CLI de
Azure. Este es un ejemplo de UDR con el nombre "MyRoute" mediante comandos az
para un nodo con IP 10.0.0.4 y la subred de pod correspondiente 10.244.0.0/24:

Output

az network route-table create --resource-group <my_resource_group> --name


BridgeRoute
az network route-table route create --resource-group <my_resource_group> --
address-prefix 10.244.0.0/24 --route-table-name BridgeRoute --name MyRoute
--next-hop-type VirtualAppliance --next-hop-ip-address 10.0.0.4

 Sugerencia

Si va a implementar Kubernetes en máquinas virtuales iaaS o de Azure desde otros


proveedores de nube, también puede usar overlay networking en su lugar.

Mis pods de Windows no pueden hacer ping a recursos


externos
Los pods de Windows no tienen reglas de salida programadas para el protocolo ICMP
hoy mismo. Sin embargo, se admite TCP/UDP. Al intentar demostrar la conectividad a
los recursos fuera del clúster, sustituya ping <IP> por los comandos correspondientes
curl <IP> .

Si sigue teniendo problemas, lo más probable es que la configuración de red en


cni.conf merezca cierta atención adicional. Siempre puede editar este archivo estático,
la configuración se aplicará a los recursos de Kubernetes recién creados.

¿Por qué? Uno de los requisitos de red de Kubernetes (consulte modelo de


Kubernetes) es para que la comunicación del clúster se produzca sin NAT internamente.
Para cumplir este requisito, tenemos un exceptionList para toda la comunicación en la
que no queremos que se produzca NAT de salida. Sin embargo, esto también significa
que debe excluir la dirección IP externa que está intentando consultar de ExceptionList.
Solo entonces el tráfico que se origina en los pods de Windows será SNAT
correctamente para recibir una respuesta del mundo exterior. En este sentido, la clase
ExceptionList en cni.conf debe tener el siguiente aspecto:

conf

"ExceptionList": [
"10.244.0.0/16", # Cluster subnet
"10.96.0.0/12", # Service subnet
"10.127.130.0/24" # Management (host) subnet
]

Mi nodo de Windows no puede acceder a un servicio


NodePort
Es posible que se produzca un error en el acceso Local NodePort desde el propio nodo.
Se trata de una brecha de características conocida que se aborda con la actualización
acumulativa KB4571748 (o posterior). El acceso a NodePort funcionará desde otros
nodos o clientes externos.

Mi nodo de Windows detiene el enrutamiento thourgh


NodePorts después de reducir verticalmente mis pods
Debido a una limitación de diseño, debe haber al menos un pod que se ejecute en el
nodo de Windows para que el reenvío de NodePort funcione.

Después de algún tiempo, se eliminan los puntos de


conexión de VNIC y HNS de los contenedores.
Este problema puede deberse a que el hostname-override parámetro no se pasa a kube-
proxy . Para resolverlo, los usuarios deben pasar el nombre de host a kube-proxy de la
siguiente manera:

Output

C:\k\kube-proxy.exe --hostname-override=$(hostname)

En el modo Flannel (vxlan), mis pods tienen problemas de


conectividad después de volver a unir el nodo
Cada vez que se vuelve a unir un nodo eliminado previamente al clúster, flannelD
intentará asignar una nueva subred de pod al nodo. Los usuarios deben quitar los
archivos de configuración de subred de pod antiguos en las siguientes rutas de acceso:

PowerShell

Remove-Item C:\k\SourceVip.json
Remove-Item C:\k\SourceVipRequest.json

Después de iniciar Kubernetes, Flanneld está bloqueado


en "Esperando a que se cree la red"
Este problema debe solucionarse con Flannel v0.12.0 (y versiones posteriores). Si usa
una versión anterior de Flanneld, hay una condición de carrera conocida que puede
ocurrir de modo que no se establezca la dirección IP de administración de la red flannel.
Una solución alternativa consiste simplemente en volver a iniciar FlannelD
manualmente.

Output

PS C:> [Environment]::SetEnvironmentVariable("NODE_NAME", "


<Windows_Worker_Hostname>")
PS C:> C:\flannel\flanneld.exe --kubeconfig-file=c:\k\config --iface=
<Windows_Worker_Node_IP> --ip-masq=1 --kube-subnet-mgr=1

Mis pods de Windows no se pueden iniciar debido a que


falta /run/flannel/subnet.env
Esto indica que Flannel no se ha lanzado correctamente. Puede intentar reiniciar
flanneld.exe o puede copiar los archivos manualmente desde el maestro de
/run/flannel/subnet.env Kubernetes en C:\run\flannel\subnet.env en el nodo de

trabajo de Windows y modificar la FLANNEL_SUBNET fila a la subred asignada. Por


ejemplo, si se asignó la subred del nodo 10.244.4.1/24:

Output

FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.4.1/24
FLANNEL_MTU=1500
FLANNEL_IPMASQ=true

Con más frecuencia que no, hay otro problema que podría estar causando este error
que debe investigarse primero. Se recomienda que genere flanneld.exe este archivo
automáticamente.

La conectividad de pod a pod entre hosts se interrumpe


en el clúster de Kubernetes que se ejecuta en vSphere
Dado que vSphere y Flannel reservan el puerto 4789 (puerto VXLAN predeterminado)
para las redes de superposición, los paquetes pueden acabar interceptándose. Si
vSphere se usa para las redes de superposición, debe configurarse para usar un puerto
diferente para liberar hasta 4789.

Mis puntos de conexión o direcciones IP están filtrando


Existen 2 problemas conocidos actualmente que pueden hacer que los puntos de
conexión se filtren.

1. El primer problema conocido es un problema en la versión 1.11 de Kubernetes.


Evite usar Kubernetes versión 1.11.0 - 1.11.2.
2. El segundo problema conocido que puede hacer que los puntos de conexión se
filtren es un problema de simultaneidad en el almacenamiento de puntos de
conexión. Para recibir la corrección, debe usar Docker EE 18.09 o superior.

Mis pods no se pueden iniciar debido a errores de "red:


no se pudo asignar el intervalo".
Esto indica que el espacio de direcciones IP del nodo se usa. Para limpiar los puntos de
conexión filtrados, migre los recursos de los nodos afectados y ejecute los siguientes
comandos:
Output

c:\k\stop.ps1
Get-HNSEndpoint | Remove-HNSEndpoint
Remove-Item -Recurse c:\var

Mi nodo de Windows no puede acceder a mis servicios


mediante la dirección IP del servicio
Se trata de una limitación conocida de la pila de redes actual en Windows. Sin embargo,
los pods de Windows pueden acceder a la dirección IP del servicio.

No se encuentra ningún adaptador de red al iniciar


Kubelet
La pila de redes de Windows necesita un adaptador virtual para que funcionen las redes
de Kubernetes. Si los siguientes comandos no devuelven ningún resultado (en un shell
de administración), se ha producido un error en la creación de red de HNS ( un requisito
previo necesario para que Kubelet funcione):

PowerShell

Get-HnsNetwork | ? Name -ieq "cbr0"


Get-HnsNetwork | ? Name -ieq "vxlan0"
Get-NetAdapter | ? Name -Like "vEthernet (Ethernet*"

A menudo vale la pena modificar el parámetro InterfaceName del script start.ps1, en los
casos en los que el adaptador de red del host no es "Ethernet". De lo contrario, consulte
la salida del start-kubelet.ps1 script para ver si hay errores durante la creación de la
red virtual.

Sigo viendo problemas. ¿Cuál debo hacer?


Puede haber restricciones adicionales en su red o en hosts que impidan determinados
tipos de comunicación entre nodos. Asegúrate de que:

ha configurado correctamente la topología de red elegida ( l2bridge o overlay )


se permite el tráfico que parece que procede de pods.
Se permite el tráfico HTTP, si va a implementar servicios web
No se quitan paquetes de distintos protocolos (ie ICMP frente a TCP/UDP)
 Sugerencia

Para obtener más recursos de autoayuda, también hay una guía de solución de
problemas de redes de Kubernetes para Windows disponible aquí .

Errores comunes de Windows

Mis pods de Kubernetes están bloqueados en


"ContainerCreating"
Este problema puede tener muchas causas, pero una de las más comunes es que la
imagen de pausa estaba mal configurada. Este es un síntoma de alto nivel del siguiente
problema.

Al implementar, los contenedores de Docker siguen


reiniciando
Compruebe que la imagen de pausa es compatible con la versión del sistema operativo.
Kubernetes supone que tanto el sistema operativo como los contenedores tienen
números de versión del sistema operativo coincidentes. Si usa una compilación
experimental de Windows, como una compilación de Insider, deberá ajustar las
imágenes en consecuencia. Consulte el repositorio de Docker de Microsoft para
obtener imágenes.

Errores de maestro comunes de Kubernetes


La depuración del maestro de Kubernetes se divide en tres categorías principales (en
orden de probabilidad):

Algo está mal con los contenedores del sistema de Kubernetes.


Algo está mal con la forma kubelet en que se está ejecutando.
Algo está mal con el sistema.

Ejecute kubectl get pods -n kube-system para ver los pods creados por Kubernetes;
esto puede proporcionar información sobre qué puntos concretos se bloquean o no se
inician correctamente. A continuación, ejecute docker ps -a para ver todos los
contenedores sin procesar que respaldan estos pods. Por último, ejecute docker logs
[ID] en los contenedores que se sospecha que están causando el problema para ver la

salida sin procesar de los procesos.

No se puede conectar al servidor de API en


https://[address]:[port]

Con más frecuencia que no, este error indica problemas de certificado. Asegúrese de
que ha generado correctamente el archivo de configuración, de que las direcciones IP
de él coinciden con la del host y de que la ha copiado en el directorio montado por el
servidor de API.

Buenos lugares para encontrar este archivo de configuración son:

~/kube/kubelet/

$HOME/.kube/config
/etc/kubernetes/admin.conf

De lo contrario, consulte el archivo de manifiesto del servidor de API para comprobar


los puntos de montaje.

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Service Fabric y contenedores
Artículo • 15/10/2024

Introducción
Azure Service Fabric es una plataforma de sistemas distribuidos que facilita el
empaquetado, la implementación y la administración de microservicios y contenedores
escalables y confiables.

Service Fabric es el orquestador de contenedores de Microsoft que implementa


microservicios en un clúster de máquinas. Service Fabric se beneficia de las lecciones
aprendidas durante sus años de ejecución de servicios en Microsoft a gran escala.

Se pueden desarrollar microservicios de muchas maneras, desde usando los modelos de


programación de Service Fabric o ASP.NET Core hasta implementando cualquier código
que prefiera. O, si simplemente quiere implementar y administrar contenedores, Service
Fabric es también una buena opción.

De forma predeterminada Service Fabric permite implementar y activar estos servicios


como procesos. Los procesos proporcionan la activación más rápida y el uso de
densidad más alto de los recursos del clúster. Service Fabric puede implementar
también servicios en imágenes de contenedor. También puede mezclar servicios en
procesos y servicios en contenedores en la misma aplicación.

Para comenzar de inmediato y probar contenedores en Service Fabric, pruebe una guía
de inicio rápido, tutorial o ejemplo:

Inicio rápido: Implementación de una aplicación contenedora de Linux en Service Fabric


Inicio rápido: Implementación de una aplicación contenedora de Windows en Service
Fabric
Inclusión de una aplicación .NET existente en un contenedor
Ejemplos de contenedores de Service Fabric

¿Qué son los contenedores?


Los contenedores vienen a solucionar el problema de ejecutar aplicaciones de forma
fiable en distintos entornos de proceso proporcionando un entorno inmutable para que
la aplicación se ejecute en él. Los contenedores encapsulan una aplicación y todas sus
dependencias, como bibliotecas y archivos de configuración, en su propio "cuadro"
aislado que contiene todo lo necesario para ejecutar el software en el contenedor.
Siempre que se ejecuta el contenedor, la aplicación que está dentro de él dispone de
todo lo necesario para ejecutarse como, por ejemplo, las versiones adecuadas de sus
bibliotecas dependientes, todos los archivos de configuración y cualquier otra cosa que
necesite para ejecutarse.

Los contenedores se ejecutan directamente en el kernel y tienen una vista aislada del
sistema de archivos y de otros recursos. Una aplicación en un contenedor no tiene
relación con ninguna otra aplicación o proceso fuera de su contenedor. Cada aplicación
y su entorno en tiempo de ejecución, las dependencias y las bibliotecas del sistema se
ejecutan dentro de un contenedor con acceso completo y privado a su propia vista
aislada del sistema operativo. Además de proporcionar con facilidad todas las
dependencias que la aplicación necesita para ejecutarse en diferentes entornos de
proceso, la seguridad y el aislamiento de los recursos son ventajas importantes del uso
de contenedores con Service Fabric que, de lo contrario, ejecutaría los servicios en un
proceso.

En comparación con las máquinas virtuales, los contenedores ofrecen las siguientes
ventajas:

Pequeño: usan un único espacio de almacenamiento y actualizaciones y versiones


de capa para aumentar la eficacia.
Rápidos: no tienen que arrancar un sistema operativo entero, así que pueden
iniciarse con mayor rapidez, normalmente en unos segundos.
Portabilidad: se puede portar una imagen de aplicación en contenedor para que
se ejecute en la nube o localmente, en máquinas virtuales o directamente en
máquinas físicas.
Gobernanza de recursos: un contenedor puede limitar los recursos físicos que
puede consumir en el host.

Compatibilidad de los contenedores con


Service Fabric
Service Fabric admite la implementación de contenedores de Docker en Linux y de
contenedores de Windows Server en Windows Server 2016 y versiones posteriores,
además de el modo de aislamiento de Hyper-V.

Entornos de ejecución de contenedor compatibles con ServiceFabric:

Linux: Docker
Windows:
Windows Server 2022: Mirantis Container Runtime
Windows Server 2019/2016: DockerEE
Contenedores de Docker en Linux
Docker ofrece API para crear y administrar contenedores sobre contenedores de kernel
de Linux. Docker Hub proporciona un repositorio central para almacenar y recuperar
imágenes de contenedor. Para ver un tutorial basado en Linux, consulte Cree la primera
aplicación de contenedor de Service Fabric en Linux.

Contenedores de Windows Server


Windows Server 2016 y versiones posteriores proporcionan dos tipos distintos de
contenedores que difieren en el nivel de aislamiento que ofrecen. Los contenedores de
Windows Server y los de Docker se parecen en que tienen un aislamiento del sistema de
archivos y un espacio de nombres, pero comparten el kernel con el host en que se
ejecutan. En Linux, este aislamiento tradicionalmente lo han proporcionado los cgroups
y los espacios de nombres, y los contenedores de Windows Server se comportan de
forma parecida.

Los contenedores de Windows compatibles con Hyper-V proporcionan mayor seguridad


y aislamiento, ya que los contenedores no comparten el kernel del sistema operativo
entre ellos ni con el host. Con este mayor nivel de aislamiento de seguridad, los
contenedores habilitados para Hyper-V están diseñados para escenarios potencialmente
hostiles y multiinquilino. Para ver un tutorial basado en Windows, consulte Cree la
primera aplicación de contenedor de Service Fabric en Windows.

La ilustración siguiente muestra los diferentes tipos de niveles de aislamiento y


virtualización disponibles.
Escenarios de uso de contenedores
Ejemplos típicos de buena elección de contenedor:

Migración mediante lift-and-shift de IIS: puede colocar una aplicación existente


de ASP.NET MVC en un contenedor en lugar de migrarla a ASP.NET Core. Estas
aplicaciones de ASP.NET MVC dependen de Internet Information Services (IIS).
Puede empaquetarlas en imágenes de contenedor a partir de la imagen de IIS
creada previamente e implementarlas con Service Fabric. Consulte Imágenes de
contenedores en Windows Server para obtener información sobre los
contenedores de Windows.

Mezcla de los contenedores y los microservicios de Service Fabric: Use una


imagen de contenedor existente para parte de la aplicación. Por ejemplo, podría
usar el contenedor NGINX para el front-end web de su aplicación y los servicios
con estado para la computación de back-end más intensa.

Reducción del impacto de los servicios de "vecinos ruidosos" : puede usar la


capacidad de gobernanza de recursos de los contenedores para restringir los
recursos que utiliza un servicio en un host. Si hay servicios que consuman un gran
número de recursos y afecten al rendimiento de otros (por ejemplo, una consulta
de larga ejecución como operación), considere la posibilidad de poner estos
servicios en contenedores con gobernanza de recursos.
7 Nota

Un clúster de Service Fabric es un único inquilino por diseño y las aplicaciones


hospedadas se consideran de confianza. Si está pensando en hospedar
aplicaciones que no son de confianza, consulte Hospedaje de aplicaciones que no
son de confianza en un clúster de Service Fabric.

Service Fabric proporciona un modelo de aplicaciónen el que un contenedor representa


un host de la aplicación en el que se colocan varias réplicas de servicio. Service Fabric
admite también un escenario de archivo ejecutable invitado en el que el usuario no usa
los modelos de programación de Service Fabric integrados y, en su lugar, empaqueta
una aplicación existente, escrita con cualquier lenguaje o plataforma, dentro de un
contenedor. Este escenario es el caso habitual de los contenedores.

También puede ejecutar servicios de Service Fabric dentro de un contenedor. La


compatibilidad con la ejecución de servicios de Service Fabric dentro de contenedores
está limitada actualmente.

Service Fabric ofrece varias funcionalidades de contenedor que le ayudarán a crear


aplicaciones que se componen de microservicios en contenedores, como:

Activación e implementación de la imagen de contenedor.


Gobernanza de recursos, incluida la configuración de valores de recursos
predeterminados en clústeres de Azure.
La autenticación de repositorios.
La asignación de puerto a host de contenedor.
La detección y comunicación entre contenedores.
La capacidad de configurar y establecer variables de entorno.
La capacidad de configurar credenciales de seguridad en el contenedor.
Selección de diferentes modos de red para contenedores.

Para obtener una introducción completa sobre la compatibilidad de contenedores en


Azure para, por ejemplo, crear un clúster de Kubernetes con Azure Kubernetes Service,
crear un registro privado de Docker en Azure Container Registry, etc, consulte Azure for
Containers.

Pasos siguientes
En este artículo, ha aprendido sobre la compatibilidad que ofrece Service Fabric para la
ejecución de contenedores. A continuación, analizaremos algunos ejemplos de cada una
de las características para mostrarle cómo utilizarlas.
Cree la primera aplicación de contenedor de Service Fabric en Linux
Cree la primera aplicación de contenedor en Service Fabric en Windows
Más información acerca de los contenedores de Windows

Comentarios
¿Le ha resultado útil esta página?  Sí  No

Proporcionar comentarios sobre el producto | Obtener ayuda en Microsoft Q&A


Regulación de recursos
Artículo • 15/10/2024

Cuando ejecuta varios servicios en el mismo clúster o nodo, es posible que un servicio
pueda consumir más recursos y privar así a otros servicios en el proceso. A este
problema se le conoce como el problema del entorno ruidoso. Azure Service Fabric
permite al desarrollador controlar este comportamiento al especificar las solicitudes y
los límites por servicio a fin de limitar el uso de recursos.

Antes de continuar con este artículo, le recomendamos que se familiarice con el


modelo de aplicación de Service Fabric y con el modelo de hospedaje de Service
Fabric.

Métricas de gobernanza de recursos


Service Fabric admite la gobernanza de recursos de acuerdo con el paquete de servicio.
Los recursos asignados al paquete de servicio pueden dividirse además entre paquetes
de código. Service Fabric admite la gobernanza de la memoria y la CPU por cada
paquete de servicio, con dos métricas integradas:

CPU (nombre de la métrica servicefabric:/_CpuCores ): un núcleo lógico que está


disponible en la máquina host. Todos los núcleos de los nodos se ponderan igual.

Memoria (nombre de métrica servicefabric:/_MemoryInMB ): la memoria se expresa


en megabytes y se asigna a la memoria física que está disponible en la máquina.

Para estas dos métricas, Cluster Resource Manager (CRM) realiza un seguimiento de la
capacidad total del clúster, la carga de cada nodo del clúster y los recursos restantes del
clúster. Estas dos métricas son equivalentes a cualquier otra métrica personalizada o de
usuario.

7 Nota

Los nombres de métricas personalizados no deben ser uno de estos dos nombres
de métrica, ya que provocará un comportamiento indefinido.

Todas las características existentes pueden utilizarse con ellas:

El clúster puede equilibrarse en función de estas dos métricas (comportamiento


predeterminado).
El clúster puede desfragmentarse en función de estas dos métricas.
Para describir un clúster, se puede establecer la capacidad de almacenamiento en
búfer para estas dos métricas.

7 Nota

El informe de carga dinámica no es compatible con estas métricas, y las cargas


para estas métricas se definen en el momento de la creación.

Mecanismo de gobernanza de recursos


A partir de la versión 7.2, el entorno de ejecución de Service Fabric admite la
especificación de solicitudes y límites de recursos de CPU y memoria.

7 Nota

Las versiones del entorno de ejecución de Service Fabric anteriores a 7.2 solo
admiten un modelo en el que un único valor actúa como la solicitud y el límite de
un recurso determinado (CPU o memoria). Esto se describe como la especificación
RequestsOnly en este documento.

Solicitudes: los valores de solicitud de la CPU y la memoria representan las cargas


que utiliza Cluster Resource Manager (CRM) para las métricas
servicefabric:/_CpuCores y servicefabric:/_MemoryInMB . En otras palabras, CRM

considera que el consumo de recursos de un servicio es igual a sus valores de


solicitud y usa estos valores al tomar decisiones de selección de ubicación.

Límites: los valores de límite de memoria y CPU representan los límites de recursos
reales que se aplican cuando se activa un proceso o un contenedor en un nodo.

Service Fabric permite tanto las especificaciones RequestsOnly y LimitsOnly como


ambas (RequestsAndLimits) para la CPU y la memoria.

Cuando se usa la especificación RequestsOnly, Service Fabric también usa los


valores de solicitud como límites.
Cuando se usa la especificación LimitsOnly, Service Fabric considera que los
valores de solicitud son 0.
Cuando se usa la especificación RequestsAndLimits, los valores de límite deben ser
mayores o iguales que los valores de solicitud.

Para comprender mejor el mecanismo de gobernanza de recursos, echemos un vistazo a


un escenario de selección de ubicación de ejemplo con la especificación RequestsOnly
para el recurso de CPU (el mecanismo para la gobernanza de memoria es equivalente).
Considere un nodo con dos núcleos de CPU y dos paquetes de servicio que se
colocarán en él. El primer paquete de servicio que se va a colocar se compone de un
solo paquete de código de contenedor y solo especifica una solicitud de un núcleo de
CPU. El segundo paquete de servicio que se va a colocar se compone de un solo
paquete de código basado en proceso y también especifica una solicitud de un núcleo
de CPU. Puesto que ambos paquetes de servicio tienen una especificación
RequestsOnly, sus valores límite se establecen en sus valores de solicitud.

1. En primer lugar, el paquete de servicio basado en contenedor que solicita un


núcleo de CPU se coloca en el nodo. El entorno de ejecución activa el contenedor
y establece el límite de CPU en un núcleo. El contenedor no podrá usar más de un
núcleo.

2. A continuación, el paquete de servicio basado en proceso que solicita un núcleo


de CPU se coloca en el nodo. El entorno de ejecución activa el proceso de servicio
y establece su límite de CPU en un núcleo.

En este momento, la suma de las solicitudes es igual a la capacidad del nodo. CRM no
colocará más contenedores ni procesos de servicio con solicitudes de CPU en este nodo.
En el nodo, un proceso y un contenedor se ejecutan con un núcleo cada uno y no
compiten entre sí para la CPU.

Vamos a consultar de nuevo nuestro ejemplo con la especificación RequestsAndLimits.


Esta vez, el paquete de servicio basado en contenedor especifica una solicitud de un
núcleo de CPU y un límite de dos núcleos de CPU. El paquete de servicio basado en
proceso especifica una solicitud y un límite de un núcleo de CPU.

1. En primer lugar, el paquete de servicio basado en contenedor se coloca en el


nodo. El entorno de ejecución activa el contenedor y establece el límite de CPU en
dos núcleos. El contenedor no podrá usar más de dos núcleos.
2. A continuación, el paquete de servicio basado en proceso se coloca en el nodo. El
entorno de ejecución activa el proceso de servicio y establece su límite de CPU en
un núcleo.

En este momento, la suma de las solicitudes de CPU de los paquetes de servicio que se
colocan en el nodo es igual a la capacidad de CPU del nodo. CRM no colocará más
contenedores ni procesos de servicio con solicitudes de CPU en este nodo. Sin embargo,
en el nodo, la suma de los límites (dos núcleos para el contenedor y un núcleo para el
proceso) supera la capacidad de dos núcleos. Si el contenedor y el proceso se expanden
al mismo tiempo, existe la posibilidad de realizar una contención del recurso de la CPU.
El sistema operativo subyacente de la plataforma administra ese tipo de contención. En
este ejemplo, el contenedor podría expandirse en un total de dos núcleos de CPU, por
lo que la solicitud del proceso de un núcleo de CPU no se garantiza.

7 Nota

Como se muestra en el ejemplo anterior, los valores de solicitud de CPU y memoria


no dan lugar a la reserva de recursos en un nodo. Estos valores representan el
consumo de recursos que Cluster Resource Manager tiene en cuenta al tomar
decisiones de selección de ubicación. Los valores de límite representan los límites
de los recursos reales que se aplican cuando se activa un proceso o un contenedor
en un nodo.

Existen algunas situaciones en las que puede haber contención de la CPU. En estas
situaciones, el proceso y el contenedor del ejemplo pueden experimentar el problema
del entorno ruidoso:

Combinación de servicios con gobierno y sin gobierno y contenedores: si el usuario


crea un servicio sin especificar una gobernanza de recursos, el entorno de tiempo
de ejecución considera que no estaba consumiendo ningún recurso y puede
colocarlo en el nodo de nuestro ejemplo. En este caso, este nuevo proceso
consume eficazmente algún recurso de CPU a costa de los servicios que se
ejecutan en el nodo. Hay dos soluciones para este problema. Una solución consiste
en no combinar servicios con gobierno y sin gobierno en el mismo clúster, y la otra
en usar restricciones de posición para que estos dos tipos de servicio no finalicen
en el mismo conjunto de nodos.

Cuando se inicia otro proceso en el nodo, fuera de Service Fabric (por ejemplo, un
servicio de sistema operativo) : En esta situación, el proceso fuera de Service Fabric
también competirá por la CPU con los servicios existentes. La solución a este
problema consiste en configurar correctamente las capacidades del nodo en la
cuenta para la sobrecarga del sistema operativo, tal como se muestra en la sección
siguiente.

Cuando las solicitudes no son iguales a los límites: Tal y como se describe en el
ejemplo de RequestsAndLimits anterior, las solicitudes no dan lugar a la reserva de
recursos en un nodo. Cuando se coloca un servicio con límites superiores a las
solicitudes en un nodo, es posible que este consuma recursos (si están disponibles)
hasta sus límites. En tales casos, es posible que otros servicios del nodo no puedan
consumir recursos hasta sus valores de solicitud.
Configuración del clúster para habilitar la
gobernanza de recursos
Cuando el nodo se inicia y se une al clúster, Service Fabric detecta la cantidad de
memoria disponible y el número de núcleos disponibles, y establece las capacidades del
nodo para esos dos recursos.

Para dejar algún espacio en búfer al sistema operativo y para otros procesos que
puedan ejecutarse en el nodo, Service Fabric solo utiliza el 80 % de los recursos
disponibles en el nodo. Este porcentaje es configurable y puede cambiarse en el
manifiesto de clúster.

Este es un ejemplo que indica a Service Fabric cómo usar el 50 % de la CPU disponible y
el 70 % de memoria disponible:

XML

<Section Name="PlacementAndLoadBalancing">
<!-- 0.0 means 0%, and 1.0 means 100%-->
<Parameter Name="CpuPercentageNodeCapacity" Value="0.5" />
<Parameter Name="MemoryPercentageNodeCapacity" Value="0.7" />
</Section>

Para la mayoría de los clientes y escenarios, la detección automática de las capacidades


del nodo para la CPU y la memoria es la configuración recomendada (la detección
automática está activada de forma predeterminada). No obstante, si necesita realizar
una configuración manual completa de las capacidades del nodo, puede hacerlo por
tipo de nodo mediante el mecanismo para describir los nodos del clúster. Este es un
ejemplo de cómo configurar el tipo de nodo con cuatro núcleos y 2 GB de memoria:

XML

<NodeType Name="MyNodeType">
<Capacities>
<Capacity Name="servicefabric:/_CpuCores" Value="4"/>
<Capacity Name="servicefabric:/_MemoryInMB" Value="2048"/>
</Capacities>
</NodeType>

Cuando está habilitada la detección automática de los recursos disponibles y las


capacidades de nodo se han definido manualmente en el manifiesto de clúster, Service
Fabric comprueba si el nodo tiene suficientes recursos para admitir la capacidad que ha
definido el usuario:
Si las capacidades de nodo que se definen en el manifiesto son menores o iguales
que los recursos disponibles en el nodo, Service Fabric usa las capacidades que se
especifican en el manifiesto.

Si las capacidades de nodo que se definen en el manifiesto son mayores que los
recursos disponibles, Service Fabric usa los recursos disponibles como capacidades
de nodo.

Puede desactivar la detección automática de los recursos disponibles si no es necesario.


Para desactivar esta función, cambie la configuración siguiente:

XML

<Section Name="PlacementAndLoadBalancing">
<Parameter Name="AutoDetectAvailableResources" Value="false" />
</Section>

Para obtener un rendimiento óptimo, también es necesario activar la siguiente


configuración en el manifiesto de clúster:

XML

<Section Name="PlacementAndLoadBalancing">
<Parameter Name="PreventTransientOvercommit" Value="true" />
<Parameter Name="AllowConstraintCheckFixesDuringApplicationUpgrade"
Value="true" />
</Section>

) Importante

A partir de la versión 7.0 de Service Fabric, actualizamos la regla de cómo se


calculan las capacidades de los recursos de nodo en casos donde el usuario
proporciona manualmente los valores de las capacidades de los recursos de nodo.
Consideremos el escenario siguiente:

Hay un total de 10 núcleos de CPU en el nodo.


SF está configurado para usar el 80 % del total de los recursos para los
servicios de usuario (configuración predeterminada), que deja un búfer del
20 % para los demás servicios que se ejecutan en el nodo (incluidos los
servicios del sistema de Service Fabric).
El usuario decide invalidar manualmente la capacidad del recurso del nodo
correspondiente a la métrica de núcleos de la CPU y la establece en 5 núcleos.
Modificamos la regla sobre cómo se calcula la capacidad disponible para los
servicios de usuario de Service Fabric de la manera siguiente:

Antes de Service Fabric 7.0, la capacidad disponible de los servicios de usuario


se calcularía en 5 núcleos (se omite el búfer de capacidad del 20 %).
A partir de Service Fabric 7.0, la capacidad disponible de los servicios de
usuario se calcularía en 4 núcleos (no se omite el búfer de capacidad del
20 %).

Especificación de la gobernanza de recursos


Los límites y las solicitudes de la gobernanza de recursos se especifican en el manifiesto
de aplicación (sección ServiceManifestImport). Veamos algunos ejemplos:

Ejemplo 1: Especificación de RequestsOnly

XML

<?xml version='1.0' encoding='UTF-8'?>


<ApplicationManifest ApplicationTypeName='TestAppTC1'
ApplicationTypeVersion='vTC1'
xsi:schemaLocation='http://schemas.microsoft.com/2011/01/fabric
ServiceFabricServiceModel.xsd'
xmlns='http://schemas.microsoft.com/2011/01/fabric'
xmlns:xsi='https://www.w3.org/2001/XMLSchema-instance'>
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName='ServicePackageA'
ServiceManifestVersion='v1'/>
<Policies>
<ServicePackageResourceGovernancePolicy CpuCores="1"/>
<ResourceGovernancePolicy CodePackageRef="CodeA1" CpuShares="512"
MemoryInMB="1024" />
<ResourceGovernancePolicy CodePackageRef="CodeA2" CpuShares="256"
MemoryInMB="1024" />
</Policies>
</ServiceManifestImport>

En este ejemplo, el atributo CpuCores se usa para especificar una solicitud de un núcleo
de CPU para ServicePackageA. Dado que no se especifica el límite de CPU (atributo
CpuCoresLimit ), Service Fabric también utiliza el valor de solicitud especificado de un

núcleo como límite de CPU del paquete de servicio.

ServicePackageA solo se colocará en un nodo en el que la capacidad restante de la CPU


sea mayor o igual que un núcleo después de restar la suma de las solicitudes de CPU
de todos los paquetes de servicio colocados en ese nodo. En el nodo, el paquete de
servicio se limitará a un núcleo. El paquete de servicio contiene dos paquetes de código
(CodeA1 y CodeA2), y ambos especifican el atributo CpuShares . La proporción de
CpuShares 512:256 se usa para calcular los límites de CPU para los paquetes de código
individuales. Por lo tanto, CodeA1 se limitará a dos tercios de un núcleo y CodeA2 se
limitará a un tercio de un núcleo. Si no se especifican las proporciones de CpuShares de
todos los paquetes de código, Service Fabric dividirá el límite de la CPU equitativamente
entre ellos.

Aunque las proporciones de CpuShares especificadas para los paquetes de código


representan su proporción relativa del límite total de CPU del paquete de servicio, los
valores de memoria de los paquetes de código se especifican en términos absolutos. En
este ejemplo, el atributo MemoryInMB se usa para especificar solicitudes de memoria de
1024 MB para CodeA1 y CodeA2. Dado que no se especifica el límite de memoria
(atributo MemoryInMBLimit ), Service Fabric también utiliza los valores de solicitud
especificados como límites para los paquetes de código. La solicitud de memoria (y el
límite) del paquete de servicio se calcula como la suma de los valores de solicitud de
memoria (y límite) de sus paquetes de código constituyentes. Por lo tanto, para
ServicePackageA, la solicitud de memoria y el límite se calculan como 2048 MB.

ServicePackageA solo se colocará en un nodo en el que la capacidad de memoria


restante sea mayor o igual que 2048 MB después de restar la suma de las solicitudes de
memoria de todos los paquetes de servicio colocados en ese nodo. En el nodo, ambos
paquetes de código se limitarán a 1024 MB de memoria cada uno. Los paquetes de
código (contenedores o procesos) no podrán asignar más memoria de la que establece
este límite y, si se intenta, el resultado serán excepciones de memoria insuficiente.

Ejemplo 2: Especificación RequestsOnly

XML

<?xml version='1.0' encoding='UTF-8'?>


<ApplicationManifest ApplicationTypeName='TestAppTC1'
ApplicationTypeVersion='vTC1'
xsi:schemaLocation='http://schemas.microsoft.com/2011/01/fabric
ServiceFabricServiceModel.xsd'
xmlns='http://schemas.microsoft.com/2011/01/fabric'
xmlns:xsi='https://www.w3.org/2001/XMLSchema-instance'>
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName='ServicePackageA'
ServiceManifestVersion='v1'/>
<Policies>
<ServicePackageResourceGovernancePolicy CpuCoresLimit="1"/>
<ResourceGovernancePolicy CodePackageRef="CodeA1" CpuShares="512"
MemoryInMBLimit="1024" />
<ResourceGovernancePolicy CodePackageRef="CodeA2" CpuShares="256"
MemoryInMBLimit="1024" />
</Policies>
</ServiceManifestImport>

En este ejemplo se utilizan los atributos CpuCoresLimit y MemoryInMBLimit , que solo


están disponibles en las versiones de SF 7.2 y posteriores. El atributo CpuCoresLimit se
usa para especificar un límite de CPU de 1 núcleo para ServicePackageA. Puesto que no
se especifica la solicitud de CPU (atributo CpuCores ), se considera que su valor es 0. El
atributo MemoryInMBLimit se usa para especificar los límites de memoria de 1024 MB
para CodeA1 y CodeA2 y, dado que no se especifican las solicitudes (atributo
MemoryInMB ), se considera que su valor es 0. El límite y la solicitud de memoria de

ServicePackageA se calculan como 0 y 2048, respectivamente. Dado que las solicitudes


de CPU y memoria de ServicePackageA son 0, no presenta ninguna carga que CRM
deba tener en cuenta para la selección de ubicación, en el caso de las métricas
servicefabric:/_CpuCores y servicefabric:/_MemoryInMB . Por lo tanto, desde la

perspectiva de la gobernanza de recursos, ServicePackageA se puede colocar en


cualquier nodo independientemente de la capacidad restante. Al igual que en el
ejemplo 1, en el nodo, CodeA1 se limitará a dos tercios de un núcleo y 1024 MB de
memoria, mientras que CodeA2 se limitará a un tercio de un núcleo y 1024 MB de
memoria.

Ejemplo 3: Especificación RequestsAndLimits

XML

<?xml version='1.0' encoding='UTF-8'?>


<ApplicationManifest ApplicationTypeName='TestAppTC1'
ApplicationTypeVersion='vTC1'
xsi:schemaLocation='http://schemas.microsoft.com/2011/01/fabric
ServiceFabricServiceModel.xsd'
xmlns='http://schemas.microsoft.com/2011/01/fabric'
xmlns:xsi='https://www.w3.org/2001/XMLSchema-instance'>
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName='ServicePackageA'
ServiceManifestVersion='v1'/>
<Policies>
<ServicePackageResourceGovernancePolicy CpuCores="1"
CpuCoresLimit="2"/>
<ResourceGovernancePolicy CodePackageRef="CodeA1" CpuShares="512"
MemoryInMB="1024" MemoryInMBLimit="3072" />
<ResourceGovernancePolicy CodePackageRef="CodeA2" CpuShares="256"
MemoryInMB="2048" MemoryInMBLimit="4096" />
</Policies>
</ServiceManifestImport>

A partir de los dos primeros ejemplos, en este ejemplo se muestra la especificación de


las solicitudes y los límites de la CPU y la memoria. ServicePackageA tiene solicitudes de
CPU y memoria de un núcleo y 3072 (1024 + 2048) MB, respectivamente. Solo se puede
colocar en un nodo que tenga al menos un núcleo (y 3072 MB) de capacidad restante
después de restar la suma de todas las solicitudes de CPU (y memoria) de todos los
paquetes de servicio que se colocan en el nodo de la capacidad total de CPU (y
memoria) del nodo. En el nodo, CodeA1 se limitará a dos tercios de 2 núcleos y
3072 MB de memoria, mientras que CodeA2 se limitará a un tercio de 2 núcleos y
4096 MB de memoria.

Uso de los parámetros de la aplicación


Al especificar la configuración de gobernanza de recursos, es posible utilizar parámetros
de la aplicación para administrar varias configuraciones de la aplicación. En el ejemplo
siguiente se muestra el uso de los parámetros de la aplicación:

XML

<?xml version='1.0' encoding='UTF-8'?>


<ApplicationManifest ApplicationTypeName='TestAppTC1'
ApplicationTypeVersion='vTC1'
xsi:schemaLocation='http://schemas.microsoft.com/2011/01/fabric
ServiceFabricServiceModel.xsd'
xmlns='http://schemas.microsoft.com/2011/01/fabric'
xmlns:xsi='https://www.w3.org/2001/XMLSchema-instance'>

<Parameters>
<Parameter Name="CpuCores" DefaultValue="4" />
<Parameter Name="CpuSharesA" DefaultValue="512" />
<Parameter Name="CpuSharesB" DefaultValue="512" />
<Parameter Name="MemoryA" DefaultValue="2048" />
<Parameter Name="MemoryB" DefaultValue="2048" />
</Parameters>

<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName='ServicePackageA'
ServiceManifestVersion='v1'/>
<Policies>
<ServicePackageResourceGovernancePolicy CpuCores="[CpuCores]"/>
<ResourceGovernancePolicy CodePackageRef="CodeA1" CpuShares="
[CpuSharesA]" MemoryInMB="[MemoryA]" />
<ResourceGovernancePolicy CodePackageRef="CodeA2" CpuShares="
[CpuSharesB]" MemoryInMB="[MemoryB]" />
</Policies>
</ServiceManifestImport>

En este ejemplo, se establecen los valores de los parámetros predeterminados para el


entorno de producción, donde cada paquete de servicio obtendría 4 núcleos y 2 GB de
memoria. Es posible cambiar los valores predeterminados con los archivos de
parámetros de la aplicación. En este ejemplo se puede utilizar un archivo de parámetros
para probar la aplicación localmente, donde obtendría menos recursos que en
producción:

XML

<!-- ApplicationParameters\Local.xml -->

<Application Name="fabric:/TestApplication1"
xmlns="http://schemas.microsoft.com/2011/01/fabric">
<Parameters>
<Parameter Name="CpuCores" DefaultValue="2" />
<Parameter Name="CpuSharesA" DefaultValue="512" />
<Parameter Name="CpuSharesB" DefaultValue="512" />
<Parameter Name="MemoryA" DefaultValue="1024" />
<Parameter Name="MemoryB" DefaultValue="1024" />
</Parameters>
</Application>

) Importante

La especificación de la gobernanza de recursos con parámetros de la aplicación


está disponible a partir de Service Fabric versión 6.1.

Cuando se usan parámetros de la aplicación para especificar la gobernanza de


recursos, Service Fabric no se puede degradar a una versión anterior a la versión
6.1.

Aplicación de los límites de recursos para los


servicios de usuario
Si bien la aplicación de la gobernanza de recursos a los servicios de Service Fabric
garantiza que esos servicios gobernados por los recursos no pueden exceder la cuota
de recursos, muchos usuarios todavía tienen que ejecutar algunos de sus servicios de
Service Fabric en modo no controlado. Cuando se usan los servicios de Service Fabric sin
control, es posible que surjan situaciones donde los servicios "descontrolados"
consuman todos los recursos disponibles en los nodos de Service Fabric, lo que puede
generar problemas graves como:

El colapso de los recursos de otros servicios que se ejecutan en los nodos


(incluidos los servicios de sistema de Service Fabric)
Nodos que terminan en un estado incorrecto
API de administración de clústeres de Service Fabric sin capacidad de respuesta
Para evitar que se produzcan estas situaciones, Service Fabric le permite aplicar los
límites de recursos para todos los servicios de usuario de Service Fabric que se ejecutan en
el nodo (tanto controlados como no controlados) para garantizar que los servicios de
usuario nunca usen más que la cantidad de recursos especificada. Para ello, el valor de
la configuración EnforceUserServiceMetricCapacities de la sección
PlacementAndLoadBalancing de ClusterManifest se establece en true. De manera
predeterminada, esta configuración está desactivada.

XML

<SectionName="PlacementAndLoadBalancing">
<ParameterName="EnforceUserServiceMetricCapacities" Value="false"/>
</Section>

Comentarios adicionales:

La aplicación de límites para los recursos solo se aplica a las métricas de recursos
servicefabric:/_CpuCores y servicefabric:/_MemoryInMB .

La aplicación de límites para los recursos solo funciona si las capacidades de nodo
para las métricas de recursos están disponibles para Service Fabric, ya sea a través
de un mecanismo de detección automática como mediante usuarios que
especifican de manera manual las capacidades de nodo (tal como se explicó en la
sección Configuración del clúster para habilitar la gobernanza de recursos). Si las
capacidades de nodo no están configuradas, no se puede usar la funcionalidad de
aplicación de límites para los recursos ya que Service Fabric no puede saber
cuántos recursos reservar para los servicios de usuario. Service Fabric emitirá una
advertencia de estado si el valor de "EnforceUserServiceMetricCapacities" es true,
pero las capacidades de nodo no están configuradas.

Otros recursos para los contenedores


Además de la CPU y de la memoria, es posible especificar otros límites de recursos para
los contenedores. Estos límites se especifican en el nivel del paquete de código y se
aplican cuando se inicia el contenedor. A diferencia de con la CPU y la memoria, Cluster
Resource Manager no tiene en cuenta estos recursos y no realiza ninguna
comprobación de capacidad ni de equilibrio de carga para ellos.

MemorySwapInMB: la cantidad total de memoria de intercambio que puede


utilizarse, en MB. Debe ser un entero positivo.
MemoryReservationInMB: límite flexible (en MB) para la gobernanza de memoria
que se aplica únicamente cuando se detecta contención de la memoria en el nodo.
Debe ser un entero positivo.
CpuPercent: porcentaje que se puede utilizar de las CPU disponibles (solo para
Windows). Debe ser un entero positivo. No se puede usar con CpuShares,
CpuCores o CpuCoresLimit.
CpuShares: peso relativo de CPU. Debe ser un entero positivo. No se puede usar
con CpuPercent, CpuCores o CpuCoresLimit.
MaximumIOps: máxima tasa de E/S (lectura y escritura) en términos de IOPS que se
puede usar. Debe ser un entero positivo.
MaximumIOBandwidth: máximo de E/S (bytes por segundo) que se puede usar
(lectura y escritura). Debe ser un entero positivo.
BlockIOWeight: peso de E/S en bloque, en relación con otros paquetes de código.
Debe ser un entero positivo comprendido entre 10 y 1000.
DiskQuotaInMB: cuota de disco para contenedores. Debe ser un entero positivo.
KernelMemoryInMB: límites de memoria del kernel en bytes. Debe ser un entero
positivo. Tenga en cuenta que esto es específico de Linux, y Docker en Windows
generará un error si se establece.
ShmSizeInMB: tamaño de /dev/shm en bytes. Si se omite, el sistema usa 64 MB.
Debe ser un entero positivo. Tenga en cuenta que esto es específico de Linux, pero
Docker solo ignorará (y no generará un error) si se especifica.

Estos recursos se pueden combinar con la CPU y la memoria. Este es un ejemplo de


cómo se especifican recursos adicionales para los contenedores:

XML

<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="FrontendServicePackage"
ServiceManifestVersion="1.0"/>
<Policies>
<ResourceGovernancePolicy CodePackageRef="FrontendService.Code"
CpuPercent="5"
MemorySwapInMB="4084" MemoryReservationInMB="1024"
MaximumIOPS="20" />
</Policies>
</ServiceManifestImport>

Pasos siguientes
Para más información sobre Cluster Resource Manager, consulte Presentación de
Cluster Resource Manager de Service Fabric.
Para más información sobre el modelo de aplicación, paquetes de servicio,
paquetes de código y cómo las réplicas los asignan, lea Modelar una aplicación en
Service Fabric.
Comentarios
¿Le ha resultado útil esta página?  Sí  No

Proporcionar comentarios sobre el producto | Obtener ayuda en Microsoft Q&A


Introducción al modo enjambre
Artículo • 23/01/2025

Se aplica a: Windows Server 2025, Windows Server 2022, Windows Server 2019,
Windows Server 2016

¿Qué es el “modo enjambre”?


El modo enjambre es una característica de Docker que proporciona funciones de
orquestación de contenedores integradas, lo que incluye la agrupación en clústeres de
hosts de Docker y la programación de cargas de trabajo de contenedores. Un grupo de
hosts de Docker forman un clúster “enjambre” cuando sus motores de Docker se
ejecutan juntos en “modo enjambre”. Para obtener contexto adicional respecto al modo
enjambre, consulta el sitio de documentación principal del Docker .

Nodos de administrador y nodos de trabajo


Un enjambre se compone de dos tipos de hosts de contenedor: nodos de administrador
y nodos de trabajo. Cada enjambre se inicializa a través de un nodo de administrador y
todos los comandos de la CLI de Docker para el control y la supervisión de un enjambre
se deben ejecutar desde uno de sus nodos de administrador. Los nodos de
administrador se pueden ver como “guardianes” del estado del enjambre; en conjunto,
forman un grupo de consenso que mantiene el conocimiento del estado de los servicios
que se ejecutan en el enjambre, y su trabajo es garantizar que el estado real del
enjambre siempre coincide con el estado pretendido, según lo que hayan definido el
desarrollador o el administrador.

7 Nota

Cualquier enjambre puede tener varios nodos de administrador, pero siempre debe
tener al menos uno.

Los nodos de trabajo los organiza el enjambre de Docker a través de los nodos de
administrador. Para unirse a un enjambre, un nodo de trabajo debe usar un “token de
unión” que genera el nodo de administrador al inicializa el enjambre. Los nodos de
trabajo simplemente reciben tareas desde los nodos de administrador y las ejecutan,
por lo que no requieren (ni poseen) ningún conocimiento del estado del enjambre.
Requisitos del sistema para el modo enjambre
Al menos un sistema de equipo físico o virtual (para usar la funcionalidad completa de
enjambre, se recomienda al menos dos nodos) que ejecute Windows 10 Creators
Update o Windows Server 2016con todas las últimas actualizaciones*, configurado
como un host de contenedor (consulta el tema Contenedores de Windows en Windows
10 o Contenedores de Windows en Windows Server para obtener más información
sobre cómo empezar a usar contenedores de Docker en Windows 10).

*Nota: El enjambre de Docker en Windows Server 2016 requiere KB4015217 .

Docker Engine v1.13.0 o posterior

Puertos abiertos: Los siguientes puertos deben estar disponibles en todos los host. En
algunos sistemas, estos puertos están abiertos de manera predeterminada.

Puerto TCP 2377 para las comunicaciones de administración de clústeres.


Puerto TCP y UDP 7946 para la comunicación entre los nodos.
Puerto UDP 4789 para el tráfico de redes superpuestas

Inicialización de un clúster enjambre


Para inicializar un enjambre, solo tienes que ejecutar el comando siguiente desde uno
de los hosts de contenedor (sustituyendo <HOSTIPADDRESS> por la dirección IPv4 local
del equipo host):

PowerShell

# Initialize a swarm
C:\> docker swarm init --advertise-addr=<HOSTIPADDRESS> --listen-addr
<HOSTIPADDRESS>:2377

Cuando este comando se ejecuta desde un host de contenedor, el Docker Engine de


dicho host comienza a ejecutarse en modo enjambre como un nodo de administrador.

Agregar nodos a un enjambre


No son necesarios varios nodos para aprovechar las características del modo enjambre y
las redes superpuestas. Todas las características de enjambre/superposición pueden
usarse con un único host que se ejecute en modo enjambre (es decir, un nodo de
administrador situado en modo enjambre con el comando docker swarm init ).
Agregar nodos de trabajo a un enjambre
Una vez que se ha inicializado un enjambre desde un nodo de administrador, pueden
agregarse otros hosts al enjambre como nodos de trabajo con otro sencillo comando:

PowerShell

C:\> docker swarm join --token <WORKERJOINTOKEN> <MANAGERIPADDRESS>

Aquí, <MANAGERIPADDRESS> es la dirección IP local de un nodo de administrador


enjambre, y <WORKERJOINTOKEN> es el token de unión de nodo de trabajo
proporcionado como salida por el comando docker swarm init ejecutado desde el
nodo de administrador. El token de unión también se puede obtener si se ejecuta uno
de los siguientes comandos desde el nodo de administrador después de inicializar el
enjambre:

PowerShell

# Get the full command required to join a worker node to the swarm
C:\> docker swarm join-token worker

# Get only the join-token needed to join a worker node to the swarm
C:\> docker swarm join-token worker -q

Agregar nodos de administrador a un enjambre


Pueden agregarse nodos de administrador adicionales a un clúster enjambre con el
siguiente comando:

PowerShell

C:\> docker swarm join --token <MANAGERJOINTOKEN> <MANAGERIPADDRESS>

De nuevo, <MANAGERIPADDRESS> es la dirección IP local de un nodo de administrador


enjambre. El token de unión <MANAGERJOINTOKEN>, es un token de unión de nodo
de administrador para el enjambre, que puede obtenerse mediante la ejecución de uno
de los siguientes comandos desde un nodo de administrador existente:

PowerShell

# Get the full command required to join a **manager** node to the swarm
C:\> docker swarm join-token manager
# Get only the join-token needed to join a **manager** node to the swarm
C:\> docker swarm join-token manager -q

Creación de una red superpuesta


Una vez que se ha configurado un clúster enjambre, se pueden crear redes superpuestas
en el enjambre. Es posible crear una red superpuesta mediante la ejecución del
siguiente comando desde un nodo de administrador enjambre:

PowerShell

# Create an overlay network


C:\> docker network create --driver=overlay <NETWORKNAME>

Aquí, <NETWORKNAME> es el nombre que quieras dar a la red.

Implementación de servicios para un enjambre


Una vez que se ha creado una red superpuesta, pueden crearse servicios y adjuntarlos a
dicha red. Para crear un servicio, se emplea la sintaxis siguiente:

PowerShell

# Deploy a service to the swarm


C:\> docker service create --name=<SERVICENAME> --endpoint-mode dnsrr --
network=<NETWORKNAME> <CONTAINERIMAGE> [COMMAND] [ARGS…]

Aquí, <SERVICENAME> es el nombre que quieres darle al servicio; es el nombre que


usarás para hacer referencia al servicio a través de la detección de servicios (que usa el
servidor DNS nativo de Docker). <NETWORKNAME> es el nombre de la red a la que
quieres conectar este servicio (por ejemplo, "myOverlayNet"). <CONTAINERIMAGE> es
el nombre de la imagen de contenedor que definirá el servicio.

7 Nota

El segundo argumento de este comando, --endpoint-mode dnsrr , es necesario para


especificar a Docker Engine que se usará la directiva de round robin de DNS para
equilibrar el tráfico de red en los puntos de conexión del contenedor de servicios.
Actualmente, round robin de DNS es la única estrategia de equilibrio de carga
compatible en Windows Server 2016. La malla de enrutamiento para hosts de
Windows Docker se admite en Windows Server 2019 (y versiones posteriores), pero
no en Windows Server 2016. Los usuarios que actualmente quieran una estrategia
de equilibrio de carga alternativa en Windows Server 2016 pueden configurar un
equilibrador de carga externo (como NGINX) y usar el modo de publicar puerto
del enjambre para exponer los puertos del host de contenedor para los cuales
equilibrar la carga.

Escalado de un servicio
Una vez que un servicio se ha implementado en un clúster enjambre, se implementan en
todo el clúster las instancias de contenedor que componen ese servicio. De manera
predeterminada, el número de instancias de contenedor que respaldan un servicio (el
número de “réplicas” o “tareas” para un servicio) es uno. Sin embargo, se puede crear un
servicio con varias tareas mediante la opción --replicas para el comando docker
service create o mediante el escalado del servicio después de haberlo creado.

La escalabilidad del servicio es una de las ventajas clave que ofrece el modo enjambre
de Docker y, además, se puede aprovechar con un solo comando de Docker:

PowerShell

C:\> docker service scale <SERVICENAME>=<REPLICAS>

Aquí, <SERVICENAME> es el nombre del servicio que se escala, y <REPLICAS> es el


número de tareas, o instancias del contenedor, al que se escala el servicio.

Visualización el estado del enjambre


Existen varios comandos útiles para ver el estado de un enjambre y los servicios que se
ejecutan en él.

Mostrar lista de nodos enjambre


Usa el siguiente comando para ver una lista de los nodos unidos a un enjambre en estos
momentos, incluida información sobre el estado de cada uno de dichos nodos. Este
comando debe ejecutarse desde un nodo de administrador.

PowerShell

C:\> docker node ls


En el resultado de este comando, verás que uno de los nodos está marcado con un
asterisco (*); este asterisco indica simplemente el nodo actual: el nodo desde el que el
se ha ejecutado el comando docker node ls .

Mostrar lista de redes


Usa el siguiente comando para ver una lista de las redes que se encuentran en un nodo
determinado. Para ver las redes superpuestas, este comando debe ejecutarse desde un
nodo de administrador que se ejecute en modo enjambre.

PowerShell

C:\> docker network ls

Mostrar lista de servicios


Usa el siguiente comando para ver una lista de los servicios que se están ejecutando
actualmente en un enjambre, incluida información sobre su estado.

PowerShell

C:\> docker service ls

Mostrar lista de las instancias de contenedor que definen


un servicio
Usa el siguiente comando para ver los detalles de las instancias de contenedor que se
ejecutan para un servicio determinado. El resultado de este comando incluye los
identificadores y los nodos en los que se ejecuta cada contenedor, así como información
sobre el estado de los contenedores.

PowerShell

C:\> docker service ps <SERVICENAME>

Clústeres de sistemas operativos combinados


Windows + Linux
Recientemente, un miembro de nuestro equipo publicó una demo breve de tres partes
sobre cómo configurar una aplicación con sistemas operativos combinados Windows y
Linux con el enjambre de Docker. Es un lugar excelente para empezar si no estás
familiarizado con el enjambre de Docker o para utilizarlo para ejecutar aplicaciones con
sistemas operativos combinados. Echa un vistazo ahora:

Usar enjambre de Docker para ejecutar una aplicación en contenedores de


Windows + Linux (parte 1/3)
Usar enjambre de Docker para ejecutar una aplicación en contenedores de
Windows + Linux (parte 2/3)
Usar enjambre de Docker para ejecutar una aplicación en contenedores de
Windows + Linux (parte 3/3)

Inicialización de un clúster con sistemas operativos


combinados Linux+Windows
La inicialización de un clúster enjambre con sistemas operativos combinados es fácil:
siempre y cuando las reglas de firewall estén correctamente configuradas y los hosts
tengan acceso unos a otros, lo único que necesitas para agregar un host de Linux a un
conjunto es el comando docker swarm join estándar:

PowerShell

C:\> docker swarm join --token <JOINTOKEN> <MANAGERIPADDRESS>

```powershell
You can also initialize a swarm from a Linux host using the same command
that you would run if initializing the swarm from a Windows host:

```powershell
# Initialize a swarm
C:\> docker swarm init --advertise-addr=<HOSTIPADDRESS> --listen-addr
<HOSTIPADDRESS>:2377

Agregar etiquetas a nodos enjambre


Para iniciar un servicio de Docker para un clúster enjambre de sistemas operativos
combinados, debe haber una forma de distinguir qué nodos enjambre ejecutan el
sistema operativo para el que se ha diseñado ese servicio y cuáles no. Las etiquetas de
objeto de Docker proporcionan una forma útil de etiquetar nodos, de forma que los
servicios pueden crearse y configurarse para ejecutarse solamente en los nodos que
coincidan con su sistema operativo.
7 Nota

Las etiquetas de objeto de Docker pueden usarse para aplicar los metadatos a
diversos objetos de Docker (incluidas imágenes de contenedor, contenedores,
volúmenes y redes) y para diversos fines (por ejemplo, pueden usarse etiquetas
para separar componentes de "front-end" y "back-end" de una aplicación, al
permitir la programación de microservicios front-end únicamente en nodos
etiquetados como "front-end", y programar microservicios back-end solo en nodos
etiquetados como "back-end"). En este caso, usamos etiquetas en nodos para
distinguir entre nodos con sistema operativo Windows y nodos con sistema
operativo Linux.

Para etiquetar los nodos enjambre existente, usa la sintaxis siguiente:

PowerShell

C:\> docker node update --label-add <LABELNAME>=<LABELVALUE> <NODENAME>

Aquí, <LABELNAME> es el nombre de la etiqueta que se crea: por ejemplo, en este caso
distinguimos nodos por su sistema operativo, por lo que un nombre lógico de la
etiqueta podría ser "so". <LABELVALUE> es el valor de la etiqueta, en este caso, puedes
usar los valores "windows" y "linux". (Por supuesto, puedes elegir los nombres que
quieras para la etiqueta y los valores de la etiqueta, siempre que mantengas la
coherencia). <NODENAME> es el nombre del nodo que se etiqueta; puedes recordarte los
nombres de los nodos ejecutando docker node ls .

Por ejemplo, si tienes cuatro nodos enjambre en el clúster, incluidos dos nodos
Windows y dos nodos Linux, los comandos de actualización de la etiquetas pueden
tener el siguiente aspecto:

PowerShell

# Example -- labeling 2 Windows nodes and 2 Linux nodes in a cluster...


C:\> docker node update --label-add os=windows Windows-SwarmMaster
C:\> docker node update --label-add os=windows Windows-SwarmWorker1
C:\> docker node update --label-add os=linux Linux-SwarmNode1
C:\> docker node update --label-add os=linux Linux-SwarmNode2

Implementación de servicios para un enjambre con


sistemas operativos combinados
Con etiquetas para los nodos enjambre, implementar servicios en el clúster es fácil; solo
tienes que usar la opción --constraint para el comando docker service create :

PowerShell

# Deploy a service with swarm node constraint


C:\> docker service create --name=<SERVICENAME> --endpoint-mode dnsrr --
network=<NETWORKNAME> --constraint node.labels.<LABELNAME>=<LABELVALUE>
<CONTAINERIMAGE> [COMMAND] [ARGS…]

Por ejemplo, si usas la nomenclatura de etiqueta y valor de etiqueta del ejemplo


anterior, un conjunto de comandos de creación de servicios (uno para un servicio
basado en Windows y otro para un servicio basado en Linux) podría tener el siguiente
aspecto:

PowerShell

# Example -- using the 'os' label and 'windows'/'linux' label values,


service creation commands might look like these...

# A Windows service
C:\> docker service create --name=win_s1 --endpoint-mode dnsrr --network
testoverlay --constraint 'node.labels.os==windows'
microsoft/nanoserver:latest powershell -command { sleep 3600 }

# A Linux service
C:\> docker service create --name=linux_s1 --endpoint-mode dnsrr --network
testoverlay --constraint 'node.labels.os==linux' redis

Limitaciones
Actualmente, el modo enjambre en Windows tiene las siguientes limitaciones:

No se admite el cifrado del plano de datos (es decir, el tráfico de contenedor a


contenedor mediante la opción --opt encrypted ).
La malla de enrutamiento no se admite para hosts de Windows Docker en
Windows Server 2016, sino desde Windows Server 2019 en adelante únicamente.
Los usuarios que deseen una estrategia de equilibrio de carga alternativa en estos
momentos pueden configurar un equilibrador de carga externo (como NGINX) y
usar el modo de publicar puerto del enjambre para exponer los puertos de host
del contenedor para los que equilibrar la carga. Encontrarás más información sobre
este tema más adelante.
Publicar puertos para los puntos de conexión
de servicio
Los usuarios que quieran publicar los puertos para los puntos de conexión de servicios
pueden hacerlo ya con el modo de publicar puerto o con la característica de malla de
enrutamiento del enjambre de Docker.

Para hacer que los puertos de host se publiquen para cada uno de los puntos de
conexión de tareas o contenedores que definen un servicio, usa el argumento --publish
mode=host,target=<CONTAINERPORT> para el comando docker service create :

PowerShell

# Create a service for which tasks are exposed via host port
C:\ > docker service create --name=<SERVICENAME> --publish mode=host,target=
<CONTAINERPORT> --endpoint-mode dnsrr --network=<NETWORKNAME>
<CONTAINERIMAGE> [COMMAND] [ARGS…]

Por ejemplo, el siguiente comando crear un servicio, 's1', para el que cada tarea se
mostrará a través del puerto 80 del contenedor y un puerto del host seleccionado de
forma aleatoria.

PowerShell

C:\ > docker service create --name=s1 --publish mode=host,target=80 --


endpoint-mode dnsrr web_1 powershell -command {echo sleep; sleep 360000;}

Tras crear un servicio con el modo de publicar puerto, el servicio puede consultarse para
ver la asignación de puertos correspondiente a cada tarea de servicio:

PowerShell

C:\ > docker service ps <SERVICENAME>

El comando anterior devolverá los detalles sobre cada instancia de contenedor en


ejecución para el servicio (en todos los hosts enjambre). Una columna de la salida, la
columna "ports", incluye información de puerto para cada host con la forma
<HOSTPORT>-><CONTAINERPORT>/tcp. Los valores de <HOSTPORT> serán diferentes
para cada instancia de contenedor, ya que cada contenedor se publica en su propio
puerto del host.

Recomendaciones y conclusiones
La red transparente existente puede bloquear la inicialización de enjambres o la
creación de redes de superposición En Windows, tanto los controladores de red de
superposición como los transparentes necesitan que haya un conmutador virtual
(vSwitch) externo vinculado a un adaptador de red de host (virtual). Cuando se crea una
red superpuesta, también se crea un nuevo conmutador y después se conecta a un
adaptador de red abierto. El modo de redes transparentes también usa un adaptador de
red de host. Al mismo tiempo, cualquier adaptador de red solo se puede enlazar a un
único conmutador a la vez; si un host tiene un solo adaptador de red, puede conectarse
a un único vSwitch externo en cada momento, tanto si ese vSwitch es para una red
superpuesta como si es para una red transparente.

Por lo tanto, si un host de contenedor tiene solamente un adaptador de red, es posible


encontrarse el problema de que una red transparente bloquee la creación de una red
superpuesta (o viceversa), porque la red transparente está ocupando actualmente la
única interfaz de red virtual del host.

Existen dos maneras de solventar este problema:

Opción 1: Eliminar la red transparente existente. Antes de inicializar un enjambre,


asegúrate de que no haya ninguna red transparente existente en el host del
contenedor. Elimina las redes transparentes para asegurarte de que hay un
adaptador de red virtual libre en el host para usarlo para la creación de la red
superpuesta.
Opción 2: Crear un adaptador de red (virtual) adicional en el host. En lugar de quitar
las redes transparentes que haya en el host, puedes crear un adaptador de red
adicional en el host y utilizarlo para la creación de la red superpuesta. Para ello,
simplemente crea un nuevo adaptador de red externo (mediante PowerShell o el
administrador de Hyper-V); con la nueva interfaz creada, cuando se inicialice el
enjambre, el servicio de red de host (HNS) la reconocerá automáticamente en el
host y la usará para enlazar el vSwitch externo para la creación de la red
superpuesta.

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Proteger los contenedores de Windows
Artículo • 30/04/2024

Se aplica a: Windows Server 2022, Windows Server 2019, Windows Server 2016

Los contenedores deben su tamaño de imagen reducido al hecho de que se basan en el


host para proporcionar acceso limitado a varios recursos. Si el contenedor sabe que el
host podrá proporcionar la funcionalidad necesaria para realizar un conjunto específico
de acciones, el contenedor no necesita incluir el software pertinente en su imagen base.
Sin embargo, el grado del uso compartido de los recursos que tiene lugar puede afectar
de manera significativa al rendimiento y la seguridad del contenedor. Si se comparten
demasiados recursos, es posible que la aplicación también se ejecute como un proceso
en el host. Si los recursos se comparten demasiado poco, el contenedor no se distingue
de una VM. Ambas configuraciones son aplicables a muchos escenarios, pero la mayoría
de las personas que usan contenedores suelen optar por algo intermedio.

La seguridad de un contenedor de Windows se deriva del grado de uso compartido que


tiene lugar en el host. El límite de seguridad de un contenedor se establece mediante
los mecanismos de aislamiento que separan el contenedor del host. Más importante
aún, estos mecanismos de aislamiento definen qué procesos del contenedor pueden
interactuar con el host. Si el diseño de un contenedor permite que un proceso con
privilegios elevados (de administración) interactúe con el host, Microsoft no
considera que este contenedor tenga un límite de seguridad sólido.

Contenedores de Windows Server frente a


contenedores de Linux
Los contenedores de Windows Server y los contenedores de Linux aislados por procesos
comparten grados similares de aislamiento. Para ambos tipos de contenedor, el
desarrollador debe suponer que cualquier ataque que se pueda realizar a través de un
proceso con privilegios elevados en el host también se puede realizar a través de un
proceso con privilegios elevados en el contenedor. Ambos funcionan a través de las
funcionalidades primitivas que ofrecen sus respectivos kernels de host. Las imágenes de
contenedor se crean de modo que incluyen archivos binarios en modo de usuario que
usan las API proporcionadas por el kernel del host. El kernel del host proporciona las
mismas funcionalidades de administración y aislamiento de recursos a cada contenedor
que se ejecuta en el espacio de usuarios. Si el kernel está en peligro, también lo está
cada contenedor que comparte ese kernel.
El diseño fundamental de los contenedores de Linux y Windows Server canjea seguridad
por flexibilidad. Los contenedores de Windows Server y Linux se construyen sobre los
componentes primitivos proporcionados por el sistema operativo. Esto brinda la
flexibilidad para compartir recursos y espacios de nombres entre contenedores, pero
agrega complejidad adicional que abre la puerta a vulnerabilidades. En términos
generales, no consideramos que el kernel sea un límite de seguridad suficiente para
cargas de trabajo multiinquilino hostiles.

Aislamiento del kernel con contenedores


aislados por el hipervisor
Los contenedores aislados por el hipervisor ofrecen un mayor grado de aislamiento que
los contenedores de Windows Server o Linux con aislamiento de procesos, y se
consideran límites de seguridad sólidos. Los contenedores aislados por el hipervisor
constan de un contenedor de Windows Server encapsulado en una VM ultraligera y, a
continuación, se ejecutan junto con el sistema operativo host a través del hipervisor de
Microsoft. El hipervisor proporciona aislamiento a nivel del hardware, que incluye un
límite de seguridad muy sólido entre el host y otros contenedores. Incluso si una
vulnerabilidad traspasara el contenedor de Windows Server, quedaría contenida dentro
de la VM aislada por el hipervisor.

Ni los contenedores de Windows Server ni los contenedores de Linux brindan lo que


Microsoft considera un límite de seguridad sólido, y no deben usarse en escenarios
multiinquilino hostiles. Un contenedor debe limitarse a una VM dedicada para evitar que
un proceso de contenedor no autorizado interactúe con el host u otros inquilinos. El
aislamiento del hipervisor permite este grado de separación, a la vez que ofrece varias
mejoras de rendimiento frente a las VM tradicionales. Por lo tanto, se recomienda
encarecidamente que, en escenarios multiinquilino hostiles, los contenedores aislados
por el hipervisor sean los contenedores de elección.

Criterios de mantenimiento de la seguridad de


los contenedores
Microsoft se compromete a aplicar revisiones a todas las vulnerabilidades de seguridad
y fugas que traspasen el límite de aislamiento establecido de cualquier tipo de
contenedor de Windows. Sin embargo, solo las vulnerabilidades de seguridad que
traspasan un límite de seguridad se abordan a través del proceso del Centro de
respuestas de seguridad de Microsoft (MSRC). Solo los contenedores aislados por el
hipervisor logran un límite de seguridad, los contenedores aislados por procesos no.
La única manera de generar un error en caso de escape de un contenedor aislado por
procesos es si un proceso no administrativo puede acceder al host. Si una vulnerabilidad
de seguridad usa un proceso de administración para escapar el contenedor, Microsoft lo
considera un error que no es de seguridad y le aplicará una revisión según el proceso de
mantenimiento normal. Si una vulnerabilidad de seguridad usa un proceso no
administrativo para realizar una acción que infringe un límite de seguridad, Microsoft lo
investigará según los criterios de mantenimiento de seguridad establecidos .

¿Qué hace que una carga de trabajo


multiinquilino sea hostil?
Existen entornos multiinquilino cuando varias cargas de trabajo funcionan en recursos e
infraestructura compartidos. Si no se puede confiar en una o varias cargas de trabajo
que se ejecutan en una infraestructura, el entorno multiinquilino se considera hostil. Los
contenedores de Windows Server y Linux comparten el kernel del host, por lo que
cualquier vulnerabilidad de seguridad en un solo contenedor puede afectar a todas las
demás cargas de trabajo que se ejecutan en la infraestructura compartida.

Puede adoptar medidas para reducir la posibilidad de que se produzca una


vulnerabilidad de seguridad, por ejemplo, mediante directivas de seguridad de pods,
AppArmor y el control de acceso basado en roles (RBAC), pero no garantizan la
protección frente a un atacante. Se recomienda seguir nuestros procedimientos
recomendados para el aislamiento de clústeres en cualquier escenario multiinquilino.

Cuándo usar cuentas de usuario


ContainerAdmin y ContainerUser
Los contenedores de Windows Server ofrecen dos cuentas de usuario predeterminadas,
ContainerUser y ContainerAdministrator, cada una con su propio propósito específico.
La cuenta ContainerAdministrator permite usar el contenedor con fines administrativos:
instalar servicios y software (por ejemplo, habilitar IIS dentro de un contenedor), hacer
cambios de configuración y crear nuevas cuentas. Estas tareas son importantes para
distintos escenarios de TI que pueden ejecutarse en entornos de implementación locales
personalizados.

La cuenta ContainerUser existe para todos los demás escenarios en los que no se
necesitan privilegios de administrador en Windows. Por ejemplo, en Kubernetes si el
usuario es ContainerAdministrator y se permite montar volúmenes de host en el pod, el
usuario podría montar la carpeta .ssh y agregar una clave pública. Como ContainerUser,
este ejemplo no sería posible. Se trata de una cuenta de usuario restringida diseñada
exclusivamente para aplicaciones que no tienen que interactuar con el host. Se
recomienda encarecidamente que, al implementar un contenedor de Windows Server
en cualquier entorno multiinquilino, la aplicación se ejecute a través de la cuenta
ContainerUser. En un entorno multiinquilino, siempre es mejor seguir el principio del
mínimo de privilegios, ya que si un atacante pone en peligro la carga de trabajo, el
recurso compartido y las cargas de trabajo vecinas tendrán una menor probabilidad de
verse también afectados. La ejecución de contenedores con la cuenta ContainerUser
reduce considerablemente la posibilidad de que el entorno se vea en peligro en su
conjunto. Sin embargo, esto sigue sin brindar un límite de seguridad sólido, por lo que
cuando la seguridad sea una inquietud, debe usar contenedores aislados por el
hipervisor.

Para cambiar la cuenta de usuario, puede usar la instrucción USER en el dockerfile:

Dockerfile

USER ContainerUser

Como alternativa, puede crear un nuevo usuario.

Dockerfile

RUN net user username ‘<password>’ /ADD


USER username

Servicios de Windows
Los servicios de Microsoft Windows, anteriormente conocidos como servicios NT, le
permiten crear aplicaciones de larga ejecución que se ejecutan en sesiones propias de
Windows. Estos servicios se pueden iniciar automáticamente cuando se inicia el sistema
operativo, se pueden pausar y reiniciar y no mostrar ninguna interfaz de usuario.
También puede ejecutar servicios en el contexto de seguridad de una cuenta de usuario
específica que sea diferente del usuario conectado o de la cuenta de equipo
predeterminada.

Al incluir en contenedores y proteger una carga de trabajo que se ejecuta como servicio
de Windows, hay algunas consideraciones adicionales que debe tener en cuenta. En
primer lugar, el ENTRYPOINT del contenedor no va a ser la carga de trabajo, ya que el
servicio se ejecuta como un proceso en segundo plano, normalmente la ENTRYPOINT será
una herramienta como monitor de servicio ) o monitor de registro ). En segundo
lugar, la cuenta de seguridad en la que opera la carga de trabajo se configurará
mediante el servicio y no mediante la directiva USER en el dockerfile. Puede comprobar
en qué cuenta se ejecutará el servicio ejecutando Get-WmiObject win32_service -filter
"name='<servicename>'" | Format-List StartName .

Por ejemplo, al hospedar una aplicación web de IIS mediante la imagen de ASP.NET
(Registro de artefactos Microsoft ), el ENTRYPOINT del contenedor es
"C:\\ServiceMonitor.exe", "w3svc" . Esta herramienta se puede usar para configurar el

servicio IIS y, a continuación, supervisa el servicio para asegurarse de que permanece en


ejecución y sale, deteniendo así el contenedor, si el servicio se detiene por cualquier
motivo. De forma predeterminada, el servicio IIS y, por tanto, la aplicación web se
ejecuta con una cuenta con pocos privilegios dentro del contenedor, pero la
herramienta de supervisión de servicios requiere privilegios administrativos para
configurar y supervisar el servicio.
Creación de gMSA para contenedores
de Windows
Artículo • 05/02/2025

Se aplica a: Windows Server 2025, Windows Server 2022, Windows Server 2019

Las redes basadas en Windows suelen usar Active Directory (AD) para facilitar la
autenticación y autorización entre usuarios, equipos y otros recursos de red. Los
desarrolladores de aplicaciones empresariales suelen diseñar sus aplicaciones para que
se integren en AD y se ejecuten en servidores unidos a un dominio para aprovechar la
autenticación integrada de Windows, lo que facilita a los usuarios y otros servicios iniciar
sesión automáticamente y de forma transparente en la aplicación con sus identidades.
En este artículo se explica cómo empezar a usar cuentas de servicio administradas de
grupo de Active Directory con contenedores de Windows.

Aunque los contenedores de Windows no pueden estar unidos a un dominio, todavía


pueden usar identidades de dominio de Active Directory para admitir varios escenarios
de autenticación. Para ello, puede configurar un contenedor de Windows para que se
ejecute con una cuenta de servicio administrada de grupo (gMSA), que es un tipo
especial de cuenta de servicio introducida en Windows Server 2012 y diseñada para
permitir que varios equipos compartan una identidad sin necesidad de conocer su
contraseña. Los contenedores de Windows no se pueden unir a un dominio, pero
muchas aplicaciones de Windows que se ejecutan en contenedores de Windows todavía
necesitan autenticación de AD. Para usar la autenticación de AD, puede configurar un
contenedor de Windows para que se ejecute con una cuenta de servicio administrada
de grupo (gMSA).

Cuando se introdujo gMSA para contenedores de Windows inicialmente, requería que el


host de contenedor estuviera unido a un dominio, lo que creó una gran sobrecarga para
que los usuarios unan manualmente nodos de trabajo de Windows a un dominio. Esta
limitación se ha solucionado con la compatibilidad de gMSA para contenedores de
Windows con hosts de contenedor no unidos a un dominio. Continuaremos admitiendo
la funcionalidad de gMSA original para usar un host de contenedor unido a un dominio.

Entre las mejoras de gMSA al usar un host de contenedor no unido a un dominio se


incluyen:

El requisito de unir manualmente nodos de trabajo de Windows a un dominio se


elimina porque provocó una gran sobrecarga para los usuarios. Para escenarios de
escalado, el uso de un host de contenedor no unido a un dominio simplifica el
proceso.
En escenarios de actualización gradual, los usuarios ya no deben volver a unir el
nodo a un dominio.
La administración de las cuentas de máquina del nodo de trabajo para recuperar
contraseñas de cuenta de servicio gMSA es un proceso más sencillo.
La configuración de gMSA con Kubernetes es un proceso de un extremo a otro
menos complicado.

7 Nota

Para obtener información sobre cómo la comunidad de Kubernetes admite el uso


de gMSA con contenedores de Windows, consulte configuración de gMSA .

Arquitectura y mejoras de gMSA


Para abordar las limitaciones de la implementación inicial de gMSA para contenedores
de Windows, la nueva compatibilidad con gMSA para hosts de contenedor no unidos a
un dominio usa una identidad de usuario portátil en lugar de una cuenta de equipo host
para recuperar las credenciales de gMSA. Por lo tanto, la unión manual de nodos de
trabajo de Windows a un dominio ya no es necesaria, aunque todavía se admite. La
identidad o credenciales de usuario se almacenan en un almacén de secretos accesible
para el host de contenedor (por ejemplo, como un secreto de Kubernetes) donde los
usuarios autenticados pueden recuperarlo.
La compatibilidad de gMSA con hosts de contenedor no unidos a un dominio
proporciona la flexibilidad de crear contenedores con gMSA sin unir el nodo host al
dominio. A partir de Windows Server 2019, se admite ccg.exe que permite que un
mecanismo de complemento recupere las credenciales de gMSA de Active Directory.
Puede usar esa identidad para iniciar el contenedor. Para obtener más información
sobre este mecanismo de complemento, consulte la interfaz
ICcgDomainAuthCredentials.

7 Nota

En Azure Kubernetes Service en Azure Stack HCI, puede usar el complemento para
comunicarse desde ccg.exe a AD y, a continuación, recuperar las credenciales de
gMSA. Para más información, vea Configuración de cuentas de servicio
administrado de grupo con AKS en Azure Stack HCI.

Vea el diagrama siguiente para seguir los pasos del proceso de Container Credential
Guard:

1. Con un archivo CredSpec como entrada, el proceso de ccg.exe se inicia en el host


del nodo.

2. ccg.exe usa información del archivo CredSpec para iniciar un complemento y,


después, recuperar las credenciales de la cuenta en el almacén de secretos
asociado al complemento.

3. ccg.exe usa las credenciales de cuenta recuperadas para recuperar la contraseña


de gMSA de AD.

4. ccg.exe hace que la contraseña de gMSA esté disponible para un contenedor que
haya solicitado credenciales.

5. El contenedor se autentica en el controlador de dominio usando la contraseña


gMSA para obtener un ticket Kerberos Ticket-Granting (TGT).

6. Las aplicaciones que se ejecutan como servicio de red o sistema local en el


contenedor ahora pueden autenticarse y acceder a recursos de dominio, como
gMSA.
diagrama de

Prerrequisitos
Para ejecutar un contenedor de Windows con una cuenta de servicio administrada de
grupo, necesitará lo siguiente:

Un dominio de Active Directory con al menos un controlador de dominio que


ejecute Windows Server 2012 o posterior. No hay ningún requisito de nivel
funcional de bosque o dominio para usar gMSAs, pero las contraseñas de gMSAs
solo pueden ser distribuidas por controladores de dominio que ejecuten Windows
Server 2012 o una versión posterior. Para más información, vea Requisitos de
Active Directory para gMSA.
Permiso para crear una cuenta de gMSA. Para crear una cuenta de gMSA, deberá
ser Administrador de Dominios o usar una cuenta a la que se le haya delegado el
permiso Crear objetos msDS-GroupManagedServiceAccount.
Acceso a Internet para descargar el módulo de PowerShell CredentialSpec. Si
trabaja en un entorno desconectado, puede guardar el módulo en un equipo con
acceso a Internet y copiarlo en el equipo de desarrollo o host del contenedor.

Preparación única de Active Directory


Si aún no ha creado una gMSA en el dominio, deberá generar la clave raíz del Servicio
de distribución de claves (KDS). KDS es responsable de crear, rotar y liberar la
contraseña de gMSA a hosts autorizados. Cuando un host de contenedor necesite usar
la gMSA para ejecutar un contenedor, se pondrá en contacto con el KDS para recuperar
la contraseña actual.

Para comprobar si ya se ha creado la clave raíz de KDS, ejecute el siguiente cmdlet de


PowerShell como administrador de dominio en un controlador de dominio o miembro
de dominio con las herramientas de PowerShell de AD instaladas:

PowerShell

Get-KdsRootKey

Si el comando devuelve un identificador de clave, todos están configurados y pueden ir


directamente a la sección crear una cuenta de servicio administrada de grupo. De lo
contrario, continúe para crear la clave raíz de KDS.

) Importante

Solo debe crear una clave raíz de KDS por bosque. Si se crean varias claves raíz de
KDS, se empezarán a producir errores en la gMSA después de cambiar su
contraseña.

En un entorno de producción o en un entorno de prueba con varios controladores de


dominio, ejecute el siguiente cmdlet en PowerShell como administrador de dominio
para crear la clave raíz de KDS.

PowerShell

# For production environments


Add-KdsRootKey -EffectiveImmediately

Aunque el comando implica que la clave será efectiva inmediatamente, deberá esperar
10 horas antes de que se replique la clave raíz KDS y esté disponible para su uso en
todos los controladores de dominio.

Si solo tiene un controlador de dominios en su dominio, puede agilizar el proceso


estableciendo que la clave sea efectiva desde hace 10 horas.

) Importante

No use esta técnica en un entorno de producción.


PowerShell

# For single-DC test environments only


Add-KdsRootKey -EffectiveTime (Get-Date).AddHours(-10)

Creación de una cuenta de servicio


administrada de grupo
Cada contenedor que usa autenticación integrada de Windows necesita al menos una
gMSA. La gMSA principal se usa cada vez que las aplicaciones que se ejecutan como un
sistema o un servicio de red acceden a los recursos de la red. El nombre de la gMSA se
convertirá en el nombre del contenedor en la red, independientemente del nombre de
host asignado al contenedor. Los contenedores también se pueden configurar con
gMSA adicionales, en caso de que quiera ejecutar un servicio o una aplicación en el
contenedor como una identidad diferente de la cuenta de equipo contenedor.

Al crear una gMSA, también se crea una identidad compartida que se puede usar
simultáneamente en muchas máquinas diferentes. El acceso a la contraseña de gMSA
está protegido por una lista de control de acceso de Active Directory. Se recomienda
crear un grupo de seguridad para cada cuenta de gMSA y agregar los hosts de
contenedor pertinentes al grupo de seguridad para limitar el acceso a la contraseña.

Por último, dado que los contenedores no registran automáticamente ningún Service
Principal Name (SPN), deberá crear manualmente al menos un SPN de host para la
cuenta de gMSA.

Normalmente, el host o el SPN http se registran con el mismo nombre que la cuenta de
gMSA, pero es posible que tenga que usar otro nombre de servicio si los clientes
acceden a la aplicación contenedorizada desde detrás de un equilibrador de carga o un
nombre DNS distinto del nombre de gMSA.

Por ejemplo, si la cuenta gMSA se llama "WebApp01", pero los usuarios acceden al sitio
en mysite.contoso.com , debe registrar un SPN de http/mysite.contoso.com en la cuenta
gMSA.

Algunas aplicaciones pueden requerir SPN adicionales para sus protocolos únicos. Por
ejemplo, SQL Server requiere el SPN de MSSQLSvc/hostname .

En la tabla siguiente se enumeran los atributos necesarios para crear una gMSA.

ノ Expandir tabla
Propiedad gMSA Valor Ejemplo
obligatorio

Nombre Cualquier WebApp01


nombre de
cuenta válido.

DnsHostName Nombre de WebApp01.contoso.com


dominio
anexado al
nombre de
cuenta.

ServicePrincipalNames Establezca al 'host/WebApp01',


menos el SPN 'host/WebApp01.contoso.com'
de host y
agregue otros
protocolos
según sea
necesario.

PrincipalsAllowedToRetrieveManagedPassword El grupo de WebApp01Hosts


seguridad que
contiene los
hosts de
contenedor.

Una vez que haya decidido el nombre de la gMSA, ejecute los siguientes cmdlets en
PowerShell para crear el grupo de seguridad y gMSA.

 Sugerencia

Tendrá que usar una cuenta que pertenezca al grupo de seguridad de


administradores de dominio o que tenga delegado el permiso Crear objetos
msDS-GroupManagedServiceAccount para ejecutar los siguientes comandos. El
cmdlet New-ADServiceAccount forma parte de las herramientas de PowerShell de
AD de Herramientas de administración remota del servidor.

Se recomienda crear cuentas de gMSA independientes para los entornos de desarrollo,


prueba y producción.

Caso de uso para crear una cuenta de gMSA para hosts


de contenedor unidos a un dominio
PowerShell
# Replace 'WebApp01' and 'contoso.com' with your own gMSA and domain names,
respectively.

# To install the AD module on Windows Server, run Install-WindowsFeature


RSAT-AD-PowerShell
# To install the AD module on Windows 10 version 1809 or later, run Add-
WindowsCapability -Online -Name 'Rsat.ActiveDirectory.DS-
LDS.Tools~~~~0.0.1.0'
# To install the AD module on older versions of Windows 10, see
https://aka.ms/rsat

# Create the security group


New-ADGroup -Name "WebApp01 Authorized Hosts" -SamAccountName
"WebApp01Hosts" -GroupScope DomainLocal

# Create the gMSA


New-ADServiceAccount -Name "WebApp01" -DnsHostName "WebApp01.contoso.com" -
ServicePrincipalNames "host/WebApp01", "host/WebApp01.contoso.com" -
PrincipalsAllowedToRetrieveManagedPassword "WebApp01Hosts"

# Add your container hosts to the security group


Add-ADGroupMember -Identity "WebApp01Hosts" -Members "ContainerHost01$",
"ContainerHost02$", "ContainerHost03$"

Caso de uso para crear una cuenta de gMSA para hosts


de contenedor no unidos a un dominio
Al usar gMSA para contenedores con hosts no unidos a un dominio, en lugar de agregar
hosts de contenedor al grupo de seguridad WebApp01Hosts , cree y agregue una cuenta
de usuario estándar.

PowerShell

# Replace 'WebApp01' and 'contoso.com' with your own gMSA and domain names,
respectively.

# To install the AD module on Windows Server, run Install-WindowsFeature


RSAT-AD-PowerShell
# To install the AD module on Windows 10 version 1809 or later, run Add-
WindowsCapability -Online -Name 'Rsat.ActiveDirectory.DS-
LDS.Tools~~~~0.0.1.0'
# To install the AD module on older versions of Windows 10, see
https://aka.ms/rsat

# Create the security group


New-ADGroup -Name "WebApp01 Authorized Accounts" -SamAccountName
"WebApp01Accounts" -GroupScope DomainLocal

# Create the gMSA


New-ADServiceAccount -Name "WebApp01" -DnsHostName "WebApp01.contoso.com" -
ServicePrincipalNames "host/WebApp01", "host/WebApp01.contoso.com" -
PrincipalsAllowedToRetrieveManagedPassword "WebApp01Accounts"

# Create the standard user account. This account information needs to be


stored in a secret store and will be retrieved by the ccg.exe hosted plug-in
to retrieve the gMSA password. Replace 'StandardUser01' and 'p@ssw0rd' with
a unique username and password. We recommend using a random, long, machine-
generated password.
New-ADUser -Name "StandardUser01" -AccountPassword (ConvertTo-SecureString -
AsPlainText "p@ssw0rd" -Force) -Enabled 1

# Add your container hosts to the security group


Add-ADGroupMember -Identity "WebApp01Accounts" -Members "StandardUser01"

Preparación del host de contenedor

Caso de uso para preparar el host de contenedor para un


host de contenedor unido a un dominio
Cada host de contenedor que ejecutará un contenedor de Windows con una gMSA
debe estar unido a un dominio y tener acceso para recuperar la contraseña de gMSA.

1. Une el equipo al dominio de Active Directory.

2. Asegúrese de que el host pertenece al grupo de seguridad que controla el acceso


a la contraseña de gMSA.

3. Reinicie el equipo para obtener su nueva pertenencia al grupo.

4. Configure Docker Desktop para Windows 10 o Docker Desktop para


Windows Server .

5. (Recomendado) Compruebe que el host puede usar la cuenta de gMSA ejecutando


Test-ADServiceAccount. Si el comando devuelve False, siga las instrucciones de
solución de problemas de .

PowerShell

# To install the AD module on Windows Server, run Install-


WindowsFeature RSAT-AD-PowerShell
# To install the AD module on Windows 10 version 1809 or later, run
Add-WindowsCapability -Online -Name 'Rsat.ActiveDirectory.DS-
LDS.Tools~~~~0.0.1.0'
# To install the AD module on older versions of Windows 10, see
https://aka.ms/rsat
Test-ADServiceAccount WebApp01

Caso de uso para preparar el host de contenedor para un


host de contenedor que no esté unido a un dominio
Al usar gMSA para contenedores de Windows en hosts de contenedor no unidos a un
dominio, cada host de contenedor debe tener un complemento para ccg.exe instalado,
que se usará para recuperar la cuenta de usuario portátil y las credenciales especificadas
en el paso anterior. Los complementos son exclusivos del almacén de secretos utilizado
para proteger las credenciales de cuentas de usuario portátiles. Por ejemplo, se
necesitarían complementos diferentes para almacenar las credenciales de cuenta en
Azure Key Vault frente a en un almacén de secretos de Kubernetes.

Windows no ofrece actualmente un complemento predeterminado integrado. Las


instrucciones de instalación de los complementos serán específicas de la
implementación. Para obtener más información sobre cómo crear y registrar
complementos para ccg.exe, consulte interfaz ICcgDomainAuthCredentials.

Creación de una especificación de credenciales


Un archivo de especificación de credenciales es un documento JSON que contiene
metadatos sobre las cuentas de gMSA que desea que use un contenedor. Al mantener
la configuración de identidad independiente de la imagen de contenedor, puede
cambiar qué gMSA usa el contenedor simplemente intercambiando el archivo de
especificación de credenciales, no es necesario realizar ningún cambio en el código.

El archivo de especificación de credenciales se crea mediante el módulo de PowerShell


credentialSpec de en una máquina unida a un dominio. Una vez creado el archivo,
puede copiarlo en otros hosts de contenedor o en el orquestador de contenedores. El
archivo de especificación de credenciales no contiene ningún secreto, como la
contraseña de gMSA, ya que el host del contenedor recupera la gMSA en nombre del
contenedor.

Docker espera encontrar el archivo de especificación de credenciales en el directorio


CredentialSpecs en el directorio de datos de Docker. En una instalación
predeterminada, encontrará esta carpeta en C:\ProgramData\Docker\CredentialSpecs .

Para crear un archivo de especificación de credenciales en el host de contenedor:

1. Instalación de las herramientas de PowerShell de RSAT AD


Para Windows Server, ejecute Install-WindowsFeature RSAT-AD-PowerShell.
Para Windows 10, versión 1809 o posterior, ejecute Add-WindowsCapability
-Online -Name "Rsat.ActiveDirectory.DS-LDS.Tools~~~0.0.1.0".
Para versiones anteriores de Windows 10, consulta https://aka.ms/rsat .

2. Ejecute el siguiente cmdlet para instalar la versión más reciente del módulo
CredentialSpec de PowerShell :

PowerShell

Install-Module CredentialSpec

Si no tiene acceso a Internet en el host de contenedor, ejecute Save-Module


CredentialSpec en un equipo conectado a Internet y copie la carpeta del módulo

en C:\Program Files\WindowsPowerShell\Modules o en otra ubicación en


$env:PSModulePath en el host del contenedor.

3. Ejecute el siguiente cmdlet para crear el nuevo archivo de especificación de


credenciales:

PowerShell

# Replace 'WebApp01' with your own gMSA


New-CredentialSpec -AccountName WebApp01

De forma predeterminada, el cmdlet creará una especificación de credenciales con


el nombre de gMSA proporcionado como la cuenta de equipo del contenedor. El
archivo se guardará en el directorio CredentialSpecs de Docker, utilizando el
dominio gMSA y el nombre de cuenta como nombre de archivo.

Si desea guardar el archivo en otro directorio, use el parámetro -Path :

PowerShell

New-CredentialSpec -AccountName WebApp01 -Path


"C:\MyFolder\WebApp01_CredSpec.json"

También puede crear una especificación de credenciales que incluya cuentas de


gMSA adicionales si ejecuta un servicio o proceso como una gMSA secundaria en
el contenedor. Para ello, use el parámetro -AdditionalAccounts :

PowerShell
New-CredentialSpec -AccountName WebApp01 -AdditionalAccounts
LogAgentSvc, OtherSvc

Para obtener una lista completa de los parámetros admitidos, ejecute Get-Help
New-CredentialSpec -Full .

4. Puede mostrar una lista de todas las especificaciones de credenciales y su ruta de


acceso completa con el siguiente cmdlet:

PowerShell

Get-CredentialSpec

Este es un ejemplo de una especificación de credenciales:

JSON

{
"CmsPlugins": [
"ActiveDirectory"
],
"DomainJoinConfig": {
"Sid": "S-1-5-21-702590844-1001920913-2680819671",
"MachineAccountName": "webapp01",
"Guid": "56d9b66c-d746-4f87-bd26-26760cfdca2e",
"DnsTreeName": "contoso.com",
"DnsName": "contoso.com",
"NetBiosName": "CONTOSO"
},
"ActiveDirectoryConfig": {
"GroupManagedServiceAccounts": [
{
"Name": "webapp01",
"Scope": "contoso.com"
},
{
"Name": "webapp01",
"Scope": "CONTOSO"
}
]
}
}

Configuración adicional de la especificación de


credenciales para el caso de uso del host de contenedor
no unido a un dominio
Al usar gMSA con hosts de contenedor no unidos a un dominio, es necesario agregar
información sobre el complemento de ccg.exe que va a usar a la especificación de
credenciales. Esto se agregará a una sección de la especificación de credenciales
denominada HostAccountConfig. La sección hostAccountConfig tiene tres campos que
deben rellenarse:

PortableCcgVersion: debe establecerse en "1".


PluginGUID: CLSID COM para el complemento ccg.exe. Esto es único para el
complemento que se está usando.
PluginInput: entrada específica del complemento para recuperar la información de
la cuenta de usuario del almacén de secretos.

Este es un ejemplo de una especificación de credenciales con la sección


hostAccountConfig agregada:

JSON

{
"CmsPlugins": [
"ActiveDirectory"
],
"DomainJoinConfig": {
"Sid": "S-1-5-21-702590844-1001920913-2680819671",
"MachineAccountName": "webapp01",
"Guid": "56d9b66c-d746-4f87-bd26-26760cfdca2e",
"DnsTreeName": "contoso.com",
"DnsName": "contoso.com",
"NetBiosName": "CONTOSO"
},
"ActiveDirectoryConfig": {
"GroupManagedServiceAccounts": [
{
"Name": "webapp01",
"Scope": "contoso.com"
},
{
"Name": "webapp01",
"Scope": "CONTOSO"
}
],
"HostAccountConfig": {
"PortableCcgVersion": "1",
"PluginGUID": "{GDMA0342-266A-4D1P-831J-20990E82944F}",
"PluginInput": "contoso.com:gmsaccg:<password>"
}
}
}
Pasos siguientes
Ahora que ha configurado la cuenta de gMSA, puede usarla para:

Configurar aplicaciones
Ejecución de contenedores
Gestionar contenedores

Si tiene algún problema durante la instalación, consulte nuestra guía de solución de


problemas de para ver posibles soluciones.

Recursos adicionales
Para más información sobre las gMSA, vea la Información general de las cuentas
de servicio administradas de grupo.

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Configuración de una aplicación para
usar una gMSA
Artículo • 21/03/2023

Se aplica a: Windows Server 2022, Windows Server 2019

En la configuración típica, un contenedor solo recibe una cuenta de servicio


administrada de grupo (gMSA) que se usa siempre que la cuenta de equipo del
contenedor intenta autenticarse en los recursos de red. Es decir, la aplicación tendrá que
ejecutarse como sistema local o servicio de red si tiene que usar la identidad de la
gMSA. Los contenedores también se pueden configurar con gMSA adicionales, en caso
de que quieras ejecutar un servicio o una aplicación en el contenedor con una identidad
diferente de la cuenta de equipo del contenedor.

Ejecución un grupo de aplicaciones de IIS como


servicio de red
Si hospedas un sitio web de IIS en el contenedor, lo único que tienes que hacer para
aprovechar la gMSA es establecer la identidad del grupo de aplicaciones en Servicio de
red. Puedes hacerlo en el Dockerfile agregando el comando siguiente:

Dockerfile

RUN %windir%\system32\inetsrv\appcmd.exe set AppPool DefaultAppPool -


'processModel.identityType':NetworkService

Si anteriormente usaste credenciales de usuario estáticas para el grupo de aplicaciones


de IIS, considera la gMSA como el reemplazo de esas credenciales. Puedes cambiar la
gMSA entre los entornos de desarrollo, pruebas y producción, e IIS recogerá
automáticamente la identidad actual sin tener que cambiar la imagen del contenedor.

Ejecución de un servicio de Windows como


servicio de red
Si la aplicación en contenedor se ejecuta como servicio de Windows, puedes configurar
el servicio para que se ejecute como Servicio de red en Dockerfile:

Dockerfile
RUN sc.exe config "YourServiceName" obj= "NT AUTHORITY\NETWORK SERVICE"
password= ""

Ejecución de aplicaciones de consola arbitrarias


como servicio de red
En el caso de las aplicaciones de consola genéricas que no se hospedan en IIS ni en
Service Manager, a menudo es más fácil ejecutar el contenedor como Servicio de red,
por lo que la aplicación hereda automáticamente el contexto de la gMSA. Esta
característica está disponible a partir de Windows Server, versión 1709.

Agrega la siguiente línea a Dockerfile para que se ejecute como servicio de red de forma
predeterminada:

Dockerfile

USER "NT AUTHORITY\NETWORK SERVICE"

También puedes conectarte a un contenedor como servicio de red de forma única con
docker exec . Esto es especialmente útil si estás solucionando problemas de

conectividad en un contenedor en ejecución cuando el contenedor no se ejecuta


normalmente como servicio de red.

PowerShell

# Opens an interactive PowerShell console in the container (id = 85d) as the


Network Service account
docker exec -it --user "NT AUTHORITY\NETWORK SERVICE" 85d powershell

Pasos siguientes
Además de la configuración de aplicaciones, también puedes usar las gMSA para lo
siguiente:

Ejecución de contenedores
Orquestación de contenedores

Si tienes problemas durante la instalación, consulta nuestra guía de solución de


problemas para ver las posibles soluciones.
Ejecución de un contenedor con una gMSA
Artículo • 14/04/2025

Se aplica a: Windows Server 2025, Windows Server 2022, Windows Server 2019

Para ejecutar un contenedor con una cuenta de servicio administrada de grupo (gMSA),
proporcione el archivo de especificación de credenciales al parámetro --security-opt de
docker run :

PowerShell

docker run --security-opt "credentialspec=file://contoso_webapp01.json" --hostname


webapp01 -it mcr.microsoft.com/windows/server:ltsc2022 powershell

) Importante

En las versiones 1709 y 1803 de Windows Server 2016, el nombre de host del contenedor
debe coincidir con el nombre corto de gMSA.

En el ejemplo anterior, el nombre de cuenta sam de gMSA es webapp01, por lo que el nombre
de host del contenedor también se denomina webapp01.

En Windows Server 2019 y versiones posteriores, el campo nombre de host no es necesario,


pero el contenedor se seguirá identificando por el nombre de gMSA en lugar del nombre de
host, incluso si se proporciona explícitamente otro.

Para comprobar si la gMSA funciona correctamente, ejecute el siguiente cmdlet en el


contenedor:

PowerShell

# Replace contoso.com with your own domain


PS C:\> nltest /sc_verify:contoso.com

Flags: b0 HAS_IP HAS_TIMESERV


Trusted DC Name \\dc01.contoso.com
Trusted DC Connection Status Status = 0 0x0 NERR_Success
Trust Verification Status = 0 0x0 NERR_Success
The command completed successfully

Si Trusted DC Connection Status y Trust Verification Status no son NERR_Success , sigue las
instrucciones de solución de problemas para depurar el problema.
Para comprobar la identidad de gMSA desde el contenedor, ejecute el comando siguiente y
compruebe el nombre del cliente:

PowerShell

PS C:\> klist get webapp01

Current LogonId is 0:0xaa79ef8


A ticket to krbtgt has been retrieved successfully.

Cached Tickets: (2)

#0> Client: webapp01$ @ CONTOSO.COM


Server: krbtgt/webapp01 @ CONTOSO.COM
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40a10000 -> forwardable renewable pre_authent
name_canonicalize
Start Time: 3/21/2019 4:17:53 (local)
End Time: 3/21/2019 14:17:53 (local)
Renew Time: 3/28/2019 4:17:42 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0
Kdc Called: dc01.contoso.com

[...]

Para abrir PowerShell u otra aplicación de consola como la cuenta de gMSA, puede pedir al
contenedor que se ejecute en la cuenta de servicio de red en lugar de la cuenta normal
ContainerAdministrator (o ContainerUser para NanoServer):

PowerShell

# NOTE: you can only run as Network Service or SYSTEM on Windows Server 1709 and
later
docker run --security-opt "credentialspec=file://contoso_webapp01.json" --hostname
webapp01 --user "NT AUTHORITY\NETWORK SERVICE" -it
mcr.microsoft.com/windows/servercore:ltsc2019 powershell

Cuando se ejecuta como servicio de red, puede probar la autenticación de red como gMSA
intentando conectarse a SYSVOL en un controlador de dominio:

PowerShell

# This command should succeed if you're successfully running as the gMSA


PS C:\> dir \\contoso.com\SYSVOL

Directory: \\contoso.com\sysvol
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----l 2/27/2019 8:09 PM contoso.com

Contenido relacionado
Además de ejecutar contenedores, también puede usar gMSA para:

Configurar aplicaciones
Orquestación de contenedores
Con gMSA en el Servicio de Kubernetes de Azure

Si tiene algún problema durante la instalación, consulte nuestra guía de solución de problemas
de para ver posibles soluciones.
Orquestación de contenedores con una
gMSA
Artículo • 05/02/2025

Se aplica a: Windows Server 2025, Windows Server 2022, Windows Server 2019

En entornos de producción, a menudo usará un orquestador de contenedores, como el


servicio de Kubernetes hospedado, Azure Kubernetes Service (AKS), para implementar y
administrar las aplicaciones y los servicios de clúster. Cada orquestador tiene sus
propios paradigmas de administración y es responsable de aceptar especificaciones de
credenciales para proporcionar a la plataforma de contenedor de Windows.

Al orquestar contenedores con Cuentas de Servicio Administradas de Grupo (gMSAs),


asegúrese de que:

" Todos los hosts de contenedor que se pueden programar para ejecutar


contenedores con gMSA están unidos a un dominio
" Los anfitriones de contenedores tienen acceso para recuperar las contraseñas de
todos los gMSA utilizados por los contenedores.
" Los archivos de especificación de credenciales se crean y cargan en el orquestador
o se copian en cada host de contenedor, en función de cómo prefiera el
orquestador controlarlos.
" Las redes de contenedores permiten que los contenedores se comuniquen con los
controladores de dominio de Active Directory para obtener tickets gMSA.

Uso de gMSA con Kubernetes


Puede usar gMSA con AKS y también con AKS en Azure Stack HCI, que es la
implementación local del orquestador de AKS. Para más información sobre cómo usar
gMSA con Kubernetes, consulte Uso de gMSA en Azure Kubernetes Service en
contenedores de Windows y Configuración de una cuenta de servicio administrada de
grupo con AKS en Azure Stack HCI.

Para leer la información más reciente del sector sobre esta característica, vea
Configuración de gMSA para contenedores y pods de Windows .

Uso de gMSA con Service Fabric


Service Fabric admite la ejecución de contenedores de Windows con una gMSA al
especificar la ubicación de especificación de credenciales en el manifiesto de aplicación.
Deberá crear el archivo de especificación de credenciales y colocarlo en el
CredentialSpecs subdirectorio del directorio de datos de Docker en cada host para que
Service Fabric pueda localizarlo. Puede ejecutar el cmdlet Get-CredentialSpec, parte del
módulo de PowerShell CredentialSpec , para comprobar si la especificación de
credenciales está en la ubicación correcta.

Consulte Inicio rápido: Implementación de contenedores de Windows en Service Fabric


y Configuración de gMSA para contenedores de Windows que se ejecutan en Service
Fabric para obtener más información sobre cómo configurar la aplicación.

Uso de gMSA con Docker Swarm


Para usar una gMSA con contenedores administrados por Docker Swarm, ejecute el
comando docker service create con el parámetro --credential-spec :

PowerShell

docker service create --credential-spec "file://contoso_webapp01.json" --


hostname "WebApp01" <image name>

Consulte el ejemplo de Docker Swarm para obtener más información sobre cómo usar
las especificaciones de credenciales con los servicios de Docker.

Contenido relacionado
Además de orquestar contenedores, también puede usar gMSA para:

Configurar aplicaciones
Ejecución de contenedores

Si tiene algún problema durante la instalación, consulte nuestra guía de solución de


problemas de para ver posibles soluciones.

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Configuración de cuentas de servicio
administradas de grupo (gMSA) para
contenedores de Windows con Azure
Kubernetes Service en Windows Server
Artículo • 23/04/2025

Se aplica a: AKS en Windows Server

Para usar la autenticación de AD, puede configurar cuentas de servicio administradas de grupo
(gMSA) para contenedores Windows para que se ejecuten con un host que no está unido a un
dominio. Una cuenta de servicio administrada de grupo es un tipo especial de cuenta de
servicio que se introdujo en Windows Server 2012 y se ha diseñado para que varios equipos
compartan una identidad sin conocer la contraseña. Los contenedores de Windows no pueden
unirse a un dominio, pero muchas aplicaciones de Windows que se ejecutan en contenedores
de Windows siguen necesitando autenticación de AD.

7 Nota

Para información sobre cómo la comunidad de Kubernetes admite el uso de gMSA con
contenedores de Windows, consulte Configuración de gMSA .

Arquitectura de gMSA para contenedores con un


host no unido a un dominio
gMSA para contenedores con un host no unido a un dominio usa una identidad de usuario
portable en lugar de una identidad de host para recuperar las credenciales de gMSA. Por lo
tanto, ya no es necesario unir manualmente los nodos de trabajo de Windows a un dominio. La
identidad del usuario se guarda como un secreto en Kubernetes. En el diagrama siguiente se
muestra el proceso para configurar gMSA para contenedores con un host no unido a un
dominio:
gMSA para contenedores con un host no unido a un dominio proporciona flexibilidad para
crear contenedores con gMSA sin unir el nodo de host al dominio. A partir de Windows Server
2019, se admite ccg.exe, lo que permite que un mecanismo de complemento recupere las
credenciales de gMSA de Active Directory. Puede usar esa identidad para iniciar el contenedor.
Para más información sobre ccg.exe, vea Interfaz ICcgDomainAuthCredentials.

Comparación de gMSA para contenedores con un


host no unido a un dominio y un host unido a un
dominio
Cuando se introdujo gMSA, era necesario unir el host contenedor a un dominio, lo que
generaba una importante sobrecarga para unir los nodos de trabajo de Windows a un
dominio. Esta limitación se ha solucionado con gMSA para contenedores con un host no unido
a un dominio, por lo que los usuarios ahora pueden usar gMSA con hosts no unidos a un
dominio. Otras mejoras de gMSA incluyen las siguientes características:

Eliminación del requisito de unir manualmente nodos de trabajo de Windows a un


dominio, que suponía una importante sobrecarga. Para escenarios de escalado, esto
simplifica el proceso.
En escenarios de actualización gradual, los usuarios ya no tienen que volver a unir el
nodo a un dominio.
Un proceso más sencillo para administrar la máquina de nodos de trabajo consiste en
recuperar las contraseñas de las cuentas de servicio gMSA.
Un proceso integral menos complicado para configurar cuentas gMSA con Kubernetes.
Antes de empezar
Para ejecutar un contenedor de Windows con una cuenta de servicio administrada de grupo,
necesita los siguientes requisitos previos:

Un dominio de Active Directory con al menos un controlador de dominio que ejecute


Windows Server 2012 o posterior. No existen requisitos de nivel funcional de bosque o
dominio para utilizar los gMSA, pero solo los controladores de dominio que ejecutan
Windows Server 2012 o posterior pueden distribuir contraseñas de gMSA. Para más
información, consulta Requisitos de Active Directory para gMSA.
Permiso para crear una cuenta gMSA. Para crear una cuenta de gMSA, debe ser
administrador de dominio o usar una cuenta que tenga permisos para crear objetos
msDS-GroupManagedServiceAccount .
Acceda a Internet para descargar el módulo CredentialSpec de PowerShell. Si trabajas
en un entorno desconectado, puedes guardar el módulo en un equipo con acceso a
Internet y copiarlo en la máquina de desarrollo o en el host de contenedor.
Para garantizar que la autenticación de gMSA y AD funcione, asegúrese de que los nodos
del clúster de Windows Server están configurados para sincronizar su tiempo con un
controlador de dominio u otro origen de hora. También debe asegurarse de que Hyper-V
está configurado para sincronizar la hora con cualquier máquina virtual.

Preparación de la cuenta de gMSA en el


controlador de dominio
Siga estos pasos para preparar la gMSA en el controlador de dominio:

1. En el controlador de dominio, prepare Active Directory y cree la cuenta de gMSA.

2. Cree una cuenta de usuario de dominio. Estas credenciales de contraseña o cuenta de


usuario se guardan como un secreto de Kubernetes y se usan para recuperar la
contraseña de gMSA.

3. Para crear una cuenta de GMSA y conceder permiso de lectura de la contraseña para la
cuenta de gMSA creada en el paso 2, ejecute el siguiente comando New-
ADServiceAccount de PowerShell:

PowerShell

New-ADServiceAccount -Name "<gmsa account name>" -DnsHostName "<gmsa account


name>.<domain name>.com" -ServicePrincipalNames "host/<gmsa account name>",
"host/<gmsa account name>.<domain name>.com" -
PrincipalsAllowedToRetrieveManagedPassword <username you created earlier>
Para -PrincipalsAllowedToRetrieveManagedPassword , especifique el nombre de usuario de
dominio que creó anteriormente como se muestra en el ejemplo siguiente:

PowerShell

New-ADServiceAccount -Name "WebApp01" -DnsHostName "WebApp01.akshcitest.com"


-ServicePrincipalNames "host/WebApp01", "host/WebApp01.akshcitest.com" -
PrincipalsAllowedToRetrieveManagedPassword "testgmsa"

Preparación del archivo JSON de especificación de


credenciales de gMSA
Para preparar el archivo JSON de especificación de credenciales de gMSA, siga los pasos sobre
la creación de una especificación de credenciales.

Configurar gMSA para pods y contenedores de


Windows en el clúster
La comunidad de Kubernetes ya admite los nodos de trabajo de Windows unidos a un dominio
para gMSA . Aunque no es necesario unir a dominio un nodo de trabajador de Windows en
AKS en Windows Server, hay otros pasos de configuración necesarios. Estos pasos incluyen la
instalación del webhook, la definición de recursos personalizados (CRD) y la especificación de
credenciales y la habilitación del control de acceso basado en rol (rol RBAC). En los pasos
siguientes se usan comandos de PowerShell que se han creado para ayudar a simplificar el
proceso de configuración.

Antes de completar los pasos siguientes, asegúrese de que el módulo de PowerShell de


AksHci está instalado y kubectl puede conectarse al clúster.

1. Para instalar el webhook, ejecute el siguiente comando Install-AksHciGmsaWebhook de


PowerShell:

PowerShell

Install-AksHciGMSAWebhook -Name <cluster name>

Para comprobar que el pod de webhook se está ejecutando correctamente, utilice el


comando siguiente:

PowerShell
kubectl get pods -n kube-system | findstr gmsa

Deberías ver un pod con el prefijo gmsa-webhook que se está ejecutando.

2. Cree el objeto secreto que almacena la credencial de usuario de Active Directory.


Complete los siguientes datos de configuración y guarde la configuración en un archivo
denominado secret.yaml.

YAML

apiVersion: v1
kind: Secret
metadata:
name: <secret-name>
namespace: <secret under namespace other than the default>
type: Opaque
stringData:
domain: <FQDN of the domain, for example: akshcitest.com>
username: <domain user who can retrieve the gMSA password>
password: <password>

Después ejecute el siguiente comando para crear el objeto de secreto:

PowerShell

kubectl apply -f secret.yaml

7 Nota

Si crea un secreto en un espacio de nombres distinto al predeterminado, no olvide


establecer el espacio de nombres de la implementación en el mismo espacio de
nombres.

3. Utilice el cmdlet de PowerShell Add-AksHciGMSACredentialSpec para crear el CRD de


gMSA, activar el control de acceso basado en funciones (RBAC) y, a continuación, asignar
la función a las cuentas de servicio para utilizar un archivo específico de especificaciones
de credenciales de gMSA. Estos pasos se describen con más detalle en el artículo de
Kubernetes Configuración de gMSA para contenedores y pods de Windows .

Use la especificación de credenciales JSON como entrada para el siguiente comando de


PowerShell (los parámetros con asteriscos * son obligatorios):

PowerShell
Add-AksHciGMSACredentialSpec -Name <cluster name>*
-credSpecFilePath <path to JSON credspec>*
-credSpecName <name for credspec as the k8s GMSACredentialSpec object>*
-secretName <name of secret>*
-secretNamespace <namespace of secret>
-serviceAccount <name of service account to bind to clusterrole>
-clusterRoleName <name of clusterrole to use the credspec>*
-overwrite

Para ver un ejemplo, consulte el código siguiente:

PowerShell

Add-AksHciGMSACredentialSpec -Name mynewcluster


-credSpecFilePath .\credspectest.json
-credSpecName credspec-mynewcluster
-secretName mysecret
-clusterRoleName clusterrole-mynewcluster

Implementación de la aplicación
Cree el archivo YAML de implementación con la siguiente configuración de ejemplo. Las
entradas necesarias incluyen serviceAccountName , gmsaCredentialSpecName , volumeMounts y
dnsconfig .

1. Agregue la cuenta de servicio:

YAML

serviceAccountName: default
securityContext:
windowsOptions:
gmsaCredentialSpecName:

2. Agregue el objeto de especificación de credenciales:

YAML

securityContext:
windowsOptions:
gmsaCredentialSpecName: <cred spec name>

3. Instale el secreto para la implementación:

YAML
volumeMounts:
- name: <volume name>
mountPath: <vmount path>
readOnly: true
volumes:
- name: <volume name>
secret:
secretName: <secret name>
items:
- key: username
path: my-group/my-username

4. Agregue la dirección IP del controlador de dominio y el nombre de dominio en


dnsConfig:

YAML

dnsConfig:
nameservers:
- <IP address for domain controller>
searches:
- <domain>

Comprobación del funcionamiento del contenedor


con gMSA
Después de implementar el contenedor, compruebe su funcionamiento mediante los pasos
siguientes:

1. Obtenga el id. de contenedor para la implementación mediante la ejecución del siguiente


comando:

Consola

kubectl get pods

2. Abra PowerShell y ejecute el siguiente comando:

PowerShell

kubectl exec -it <container id> powershell

3. Una vez que esté en el contenedor, ejecute el siguiente comando:


Consola

Nltest /parentdomain
Nltest /sc_verify:<domain>

Resultados

Connection Status = 0 0x0 NERR_Success The command completed successfully.

Esta salida muestra que un controlador de dominio ha autenticado el equipo y existe un


canal seguro entre el equipo cliente y el controlador de dominio.

4. Compruebe si el contenedor puede obtener un servicio de concesión de vales (TGT) de


Kerberos válido.

Consola

klist get krbtgt

Resultados

A ticket to krbtgt has been retrieved successfully

Limpieza de la configuración de gMSA del clúster


Si necesita limpiar la configuración de gMSA, siga estos pasos de desinstalación.

Desinstalación de la especificación de credenciales


Para desinstalarla, ejecute el siguiente comando Remove-AksHcigmsaCredentialSpec de
PowerShell:

PowerShell

Remove-AksHciGMSACredentialSpec -Name <cluster name> -credSpecName <cred spec


object name> -clusterRoleName <clusterrole object name> -serviceAccount
<serviceaccount object name> -secretNamespace <namespace of the secret object>

Desinstalación de webhook
Para desinstalar el webhook, ejecute el siguiente comando Uninstall-AksHciGMSAWebhook de
PowerShell:

PowerShell

Uninstall-AksHciGMSAWebhook -Name <cluster name>

Pasos siguientes
Uso del volumen persistente en un clúster de Kubernetes
Supervisión de AKS en clústeres de Windows Server
Solución de problemas de gMSA para
contenedores de Windows
Artículo • 06/03/2025

Se aplica a: Windows Server 2025, Windows Server 2022, Windows Server 2019

Problemas conocidos

El nombre de host del contenedor debe coincidir con el


nombre de gMSA para Windows Server 2016 y Windows
10, versiones 1709 y 1803
Si ejecuta Windows Server 2016, versión 1709 o 1803, el nombre de host del contenedor
debe coincidir con el nombre de cuenta sam de gMSA.

Cuando el nombre de host no coincide con el nombre de gMSA, se producirá un error


en las solicitudes de autenticación NTLM entrantes y la traducción de nombre/SID (que
usan muchas bibliotecas, como el proveedor de roles de pertenencia ASP.NET). Kerberos
seguirá funcionando normalmente aunque el nombre de host y el nombre de gMSA no
coincidan.

Esta limitación se corrigió en Windows Server 2019, donde el contenedor ahora siempre
usará su nombre gMSA en la red independientemente del nombre de host asignado.

No puede usar gMSA con contenedores aislados Hyper-V


en las versiones 1703, 1709 y 1803 de Windows 10
La inicialización del contenedor se bloqueará o producirá un error al intentar usar una
gMSA con un contenedor aislado de Hyper-V en Windows 10 y Windows Server
versiones 1703, 1709 y 1803.

Este error se corrigió en Windows Server 2019 y Windows 10, versión 1809. También
puede ejecutar contenedores aislados Hyper-V con gMSA en Windows Server 2016 y
Windows 10, versión 1607.

Guía general de solución de problemas


Si se producen errores al ejecutar un contenedor con una gMSA, las instrucciones
siguientes pueden ayudarle a identificar la causa principal.

Hosts unidos a un dominio: asegúrese de que el host


puede usar gMSA
1. Compruebe que el host está unido a un dominio y puede acceder al controlador
de dominio.

2. Instale las herramientas de PowerShell de AD desde RSAT y ejecute Test-


ADServiceAccount para ver si el equipo tiene acceso para recuperar la gMSA. Si el
cmdlet devuelve False, el equipo no tiene acceso a la contraseña de gMSA.

PowerShell

# To install the AD module on Windows Server, run Install-


WindowsFeature RSAT-AD-PowerShell
# To install the AD module on Windows 10 version 1809 or later, run
Add-WindowsCapability -Online -Name 'Rsat.ActiveDirectory.DS-
LDS.Tools~~~~0.0.1.0'
# To install the AD module on older versions of Windows 10, see
https://aka.ms/rsat

Test-ADServiceAccount WebApp01

3. Si test-ADServiceAccount devuelve False, compruebe que el host pertenece a un


grupo de seguridad que pueda acceder a la contraseña de gMSA.

PowerShell

# Get the current computer's group membership


Get-ADComputer $env:computername | Get-ADPrincipalGroupMembership |
Select-Object DistinguishedName

# Get the groups allowed to retrieve the gMSA password


# Change "WebApp01" for your own gMSA name
(Get-ADServiceAccount WebApp01 -Properties
PrincipalsAllowedToRetrieveManagedPassword).PrincipalsAllowedToRetrieve
ManagedPassword

4. Si tu host pertenece a un grupo de seguridad autorizado para recuperar la


contraseña de gMSA, pero sigue fallando en la prueba Test-ADServiceAccount, es
posible que debas reiniciar el ordenador para obtener un nuevo ticket que refleje
sus membresías actuales de grupo.
Hosts no unidos a un dominio: asegúrese de que el host
está configurado para recuperar la cuenta de gMSA.
Compruebe que un complemento para usar gMSA con un host de contenedor no unido
a un dominio esté instalado correctamente en el host. Windows no incluye un
complemento integrado y requiere que proporcione un complemento que implemente
la interfaz ICcgDomainAuthCredentials. Los detalles de instalación serán específicos del
complemento.

Revisa el archivo de especificación de credenciales


1. Ejecute Get-CredentialSpec desde el módulo de PowerShell CredentialSpec para
buscar todas las especificaciones de credenciales en la máquina. Las
especificaciones de credenciales deben almacenarse en el directorio
"CredentialSpecs" en el directorio raíz de Docker. Para encontrar el directorio raíz
de Docker, ejecute docker info -f "{{.DockerRootDir}}".

2. Abra el archivo CredentialSpec y asegúrese de que los campos siguientes se


rellenan correctamente:

a. Para hosts de contenedor unidos a un dominio:

sid: el SID del dominio


MachineAccountName: gMSA SAM Account Name (no incluya el nombre
de dominio completo ni el signo de dólar).
DnsTreeName: FQDN del bosque de Active Directory
DnsName: el FQDN del dominio al que pertenece la gMSA
NetBiosName: nombre NETBIOS para el dominio al que pertenece la
gMSA
GroupManagedServiceAccounts/Name: el nombre de la cuenta SAM de
gMSA (no incluya el nombre de dominio completo ni el signo de dólar).
GroupManagedServiceAccounts/Scope: una entrada para el FQDN del
dominio y otra para NETBIOS

La entrada debe tener un aspecto similar al ejemplo siguiente de una


especificación de credenciales completa:

JSON

{
"CmsPlugins": [
"ActiveDirectory"
],
"DomainJoinConfig": {
"Sid": "S-1-5-21-702590844-1001920913-2680819671",
"MachineAccountName": "webapp01",
"Guid": "56d9b66c-d746-4f87-bd26-26760cfdca2e",
"DnsTreeName": "contoso.com",
"DnsName": "contoso.com",
"NetBiosName": "CONTOSO"
},
"ActiveDirectoryConfig": {
"GroupManagedServiceAccounts": [
{
"Name": "webapp01",
"Scope": "contoso.com"
},
{
"Name": "webapp01",
"Scope": "CONTOSO"
}
]
}
}

b. Para hosts no unidos a un dominio: Además de todos los campos host de


contenedor no unidos a un dominio, asegúrese de que la sección
"HostAccountConfig" está presente y de que los campos siguientes se definen
correctamente.

PortableCcgVersion: debe establecerse en "1".


PluginGUID: CLSID COM para el complemento ccg.exe. Esto es único para
el complemento que se está usando.
PluginInput: entrada específica del complemento para recuperar la
información de la cuenta de usuario del almacén de secretos.

La entrada debe tener un aspecto similar al ejemplo siguiente de una


especificación de credenciales completa:

JSON

{
"CmsPlugins": [
"ActiveDirectory"
],
"DomainJoinConfig": {
"Sid": "S-1-5-21-702590844-1001920913-2680819671",
"MachineAccountName": "webapp01",
"Guid": "56d9b66c-d746-4f87-bd26-26760cfdca2e",
"DnsTreeName": "contoso.com",
"DnsName": "contoso.com",
"NetBiosName": "CONTOSO"
},
"ActiveDirectoryConfig": {
"GroupManagedServiceAccounts": [
{
"Name": "webapp01",
"Scope": "contoso.com"
},
{
"Name": "webapp01",
"Scope": "CONTOSO"
}
],
"HostAccountConfig": {
"PortableCcgVersion": "1",
"PluginGUID": "{GDMA0342-266A-4D1P-831J-20990E82944F}",
"PluginInput": "contoso.com:gmsaccg:<password>"
}
}
}

3. Compruebe que la ruta de acceso al archivo de especificación de credenciales es


correcta para la solución de orquestación. Si usa Docker, asegúrese de que el
comando container run incluye --security-
opt="credentialspec=file://NAME.json" , donde "NAME.json" se reemplaza por el

nombre de salida por Get-CredentialSpec. El nombre es un nombre de archivo


plano, en relación con la carpeta CredentialSpecs en el directorio raíz de Docker.

Comprobación de la configuración de red

Comprobación de la configuración del firewall

Si usa una directiva de firewall estricta en el contenedor o la red host, puede bloquear
las conexiones necesarias al controlador de dominio de Active Directory o al servidor
DNS.

ノ Expandir tabla

Protocolo y puerto Propósito

TCP y UDP 53 DNS (Sistema de Nombres de Dominio)

TCP y UDP 88 Kerberos

TCP 139 NetLogon

TCP y UDP 389 LDAP

TCP 636 LDAP SSL


Es posible que tenga que permitir el acceso a puertos adicionales en función del tipo de
tráfico que envía el contenedor a un controlador de dominio. Vea Requisitos de puertos
de Active Directory y Active Directory Domain Services para obtener una lista completa
de los puertos usados por Active Directory.

Comprobación de la configuración dns del host de contenedor

Si usa gMSA con un host de contenedor unido a un dominio, DNS debe configurarse
automáticamente en el host para que pueda resolver y establecer correctamente una
conexión con el dominio. Si usa gMSA con un host no unido a un dominio, esta
configuración no se establecerá automáticamente. Debe comprobar que la red host está
configurada para que pueda resolver el dominio. Puede comprobar que el dominio se
puede resolver desde el host mediante:

PowerShell

nltest /sc_verify:contoso.com

Comprobación del contenedor


1. Si ejecuta una versión de Windows anterior a Windows Server 2019 o Windows 10,
versión 1809, el nombre de host del contenedor debe coincidir con el nombre de
gMSA. Asegúrese de que el parámetro --hostname coincide con el nombre corto
de gMSA (sin componente de dominio; por ejemplo, "webapp01" en lugar de
"webapp01.contoso.com").

2. Compruebe la configuración de red del contenedor para comprobar que el


contenedor puede resolver y acceder a un controlador de dominio para el dominio
de gMSA. Los servidores DNS mal configurados en el contenedor son un culpable
común de los problemas de identidad.

3. Compruebe si el contenedor tiene una conexión válida al dominio mediante la


ejecución del siguiente cmdlet en el contenedor (mediante docker exec o un
equivalente):

PowerShell

nltest /sc_verify:contoso.com

La comprobación de confianza debe devolver NERR_SUCCESS si la gMSA está


disponible y la conectividad de red permite al contenedor comunicarse con el
dominio. Si se produce un error, compruebe la configuración de red del host y el
contenedor. Ambos deben poder comunicarse con el controlador de dominio.

4. Compruebe si el contenedor puede obtener un vale de concesión de vales (TGT) de


Kerberos válido:

PowerShell

klist get <myapp>

Este comando debe devolver "Se ha recuperado correctamente un ticket a krbtgt"


y enumerar el controlador de dominio usado para recuperar el ticket. Si puede
obtener un TGT pero se produce un error en nltest del paso anterior, esto podría
ser una indicación de que la cuenta gMSA está mal configurada. Consulte y revise
la cuenta de gMSA para obtener más información.

Si no puede obtener un TGT dentro del contenedor, esto puede indicar problemas
de conectividad de red o DNS. Asegúrese de que el contenedor puede resolver un
controlador de dominio mediante el nombre DNS de dominio y que el controlador
de dominio es enrutable desde el contenedor.

5. Asegúrese de que la aplicación está configurada para usar la gMSA. La cuenta de


usuario dentro del contenedor no cambia cuando se usa una gMSA. En su lugar, la
cuenta del sistema usa la gMSA cuando se comunica con otros recursos de red.
Esto significa que la aplicación tendrá que ejecutarse como servicio de red o
sistema local para aprovechar la identidad de gMSA.

 Sugerencia

Si ejecutas whoami o utilizas otra herramienta para identificar tu contexto de


usuario actual en el contenedor, no verás el nombre del gMSA en sí. Esto se
debe a que siempre inicia sesión en el contenedor como un usuario local en
lugar de una identidad de dominio. La cuenta de computadora usa la gMSA
cada vez que se comunica con los recursos de red, por lo que la aplicación
debe ejecutarse como Servicio de Red o Sistema Local.

Comprobación de la cuenta de gMSA


1. Si el contenedor parece estar configurado correctamente, pero los usuarios u otros
servicios no se pueden autenticar automáticamente en la aplicación en
contenedor, compruebe los SPN en la cuenta de gMSA. Los clientes localizarán la
cuenta de gMSA mediante el nombre con el que acceden a su aplicación. Esto
puede significar que necesitarán más host SPNs para su gMSA si, por ejemplo, los
clientes se conectan a su aplicación a través de un balanceador de carga o un
nombre DNS diferente.

2. Para usar gMSA con un host de contenedor unido a un dominio, asegúrese de que
la gMSA y el host de contenedor pertenecen al mismo dominio de Active
Directory. El host del contenedor no podrá recuperar la contraseña de gMSA si la
gMSA pertenece a un dominio diferente.

3. Asegúrese de que solo haya una cuenta en el dominio con el mismo nombre que
la gMSA. Los objetos gMSA tienen signos de dólar ($) anexados a sus nombres de
cuenta SAM, por lo que es posible que una gMSA se llame "myaccount$" y una
cuenta de usuario no relacionada denominada "myaccount" en el mismo dominio.
Esto puede causar problemas si el controlador de dominio o la aplicación tiene
que buscar la gMSA por nombre. Puede buscar en AD objetos con nombre similar
con el siguiente comando:

PowerShell

# Replace "GMSANAMEHERE" with your gMSA account name (no trailing


dollar sign)
Get-ADObject -Filter 'sAMAccountName -like "GMSANAMEHERE*"'

4. Si ha habilitado la delegación sin restricciones en la cuenta de gMSA, asegúrese de


que el atributo UserAccountControl todavía tiene habilitada la marca
WORKSTATION_TRUST_ACCOUNT . Esta bandera es necesaria para que NETLOGON del

contenedor se comunique con el controlador de dominio, como es el caso cuando


una aplicación tiene que resolver un nombre en un SID o viceversa. Puede
comprobar si la marca está configurada correctamente con los siguientes
comandos:

PowerShell

$gMSA = Get-ADServiceAccount -Identity 'yourGmsaName' -Properties


UserAccountControl
($gMSA.UserAccountControl -band 0x1000) -eq 0x1000

Si los comandos anteriores devuelven False , use lo siguiente para agregar la


marca WORKSTATION_TRUST_ACCOUNT a la propiedad UserAccountControl de la cuenta
de gMSA. Este comando también borrará las marcas NORMAL_ACCOUNT ,
INTERDOMAIN_TRUST_ACCOUNT y SERVER_TRUST_ACCOUNT de la propiedad

UserAccountControl.
PowerShell

Set-ADObject -Identity $gMSA -Replace @{ userAccountControl =


($gmsa.userAccountControl -band 0x7FFFC5FF) -bor 0x1000 }

Hosts de contenedor no unidos a un dominio: use


registros de eventos para identificar problemas de
configuración.
El registro de eventos para usar gMSA con hosts de contenedor no unidos a un dominio
se puede usar para identificar problemas de configuración. Los eventos se registran en
el archivo de registro microsoft-Windows-Containers-CCG y se pueden encontrar en el
Visor de eventos en Registros de aplicaciones y
servicios\Microsoft\Windows\Containers-CCG\Admin. Si exporta este archivo de registro
desde el host de contenedor para leerlo, debe tener habilitada la característica de
contenedores en el dispositivo donde está intentando leer el archivo de registro y debe
estar en una versión de Windows que admita el uso de gMSA con hosts de contenedor
no unidos a dominio.

Eventos y descripciones

ノ Expandir tabla

Número Texto del evento Descripción


de
evento

1 Container Credential Guard ha Este evento indica que el complemento


instanciado el complemento especificado en la especificación de credenciales se
instaló y se pudo cargar. No es necesario realizar
ninguna acción.

2 Container Credential Guard ha Se trata de un evento informativo que indica que


capturado las credenciales de las credenciales de gMSA se capturaron
gMSA para %1 mediante el correctamente de AD. No es necesario realizar
complemento: %2 ninguna acción.

3 Container Credential Guard no Este evento indica un problema con la


pudo analizar la especificación especificación de credenciales. Esto puede ocurrir
de credenciales. Error: %1 si el GUID del complemento es incorrecto o si hay
otros campos con formato incorrecto. Revise el
manual de resolución de problemas de la
Número Texto del evento Descripción
de
evento

especificación de credenciales para comprobar el


formato y el contenido de la misma.

4 Container Credential Guard no Este evento indica que no se pudo cargar el


pudo crear una instancia del complemento. Debe comprobar que el
complemento: %1. Error: %2 complemento se instaló correctamente en el host.

6 Container Credential Guard no Este evento indica que el complemento ha sido


pudo capturar las credenciales cargado pero no pudo recuperar las credenciales
del complemento: %1. Error: necesarias para obtener la contraseña de gMSA de
%2 AD. Debe comprobar que la entrada del
complemento tiene el formato correcto en la
especificación de credenciales y que el host del
contenedor tiene los permisos necesarios para
acceder al almacén de secretos usado por el
complemento.

7 Container Credential Guard Se trata de un evento informativo. Este evento se


captura de nuevo las genera cuando la contraseña de gMSA ha expirado
credenciales mediante el y debe actualizarse mediante las credenciales
complemento: %1 capturadas por el complemento.

8 Container Credential Guard no Este evento indica que no se pudieron usar las
pudo capturar las credenciales credenciales capturadas mediante el complemento
de gmsa para %1 mediante el para capturar las credenciales de gMSA de AD.
complemento %2. Motivo del Debe comprobar que la cuenta que se captura
error: %3 desde el complemento tiene permisos en AD para
recuperar las credenciales de gMSA.

Comentarios
¿Le ha resultado útil esta página?  Sí  No
gMSA en Azure Kubernetes Service
Artículo • 05/02/2025

Las cuentas de servicio administradas de grupo (gMSA) se pueden usar en Azure


Kubernetes Service (AKS) para admitir aplicaciones que requieren Active Directory con
fines de autenticación. La configuración de gMSA en AKS requiere que configure
correctamente los siguientes servicios y opciones: AKS, Azure Key Vault, Active Directory,
especificaciones de credenciales, etc. Para simplificar este proceso, puede usar el
módulo de PowerShell siguiente. Este módulo se ha personalizado para simplificar el
proceso de configuración de gMSA en AKS mediante la eliminación de la complejidad
de la configuración de diferentes servicios.

Requisitos del entorno


Para implementar gMSA en AKS, necesitará lo siguiente:

Un clúster de AKS con nodos de Windows en funcionamiento. Si no tiene un


clúster de AKS listo, consulte la documentación de Azure Kubernetes Service.
El clúster debe estar autorizado para la gMSA en AKS. Para obtener más
información, consulte Habilitar cuentas de servicio administradas de grupo
(GMSA) para los nodos de Windows Server en el clúster de Azure Kubernetes
Service (AKS).
Un entorno de Active Directory configurado correctamente para gMSA. A
continuación se proporcionan detalles sobre cómo configurar el dominio.
Los nodos de Windows en AKS deben poder conectarse a los controladores de
dominio de Active Directory.
Credenciales de dominio de Active Directory con autorización delegada para
configurar la gMSA y un usuario de dominio estándar. Esta tarea se puede delegar
a personas autorizadas (si es necesario).

Instalación de gMSA en el módulo de


PowerShell de AKS
Para empezar, descargue el módulo de PowerShell desde la galería de PowerShell:

PowerShell

Install-Module -Name AksGMSA -Repository PSGallery -Force


7 Nota

El módulo gMSA en AKS PowerShell se actualiza constantemente. Si ejecutó los


pasos de este tutorial antes y ahora vuelve a comprobar las nuevas
configuraciones, asegúrese de actualizar el módulo a la versión más reciente. Puede
encontrar más información sobre el módulo en la página del PowerShell Gallery .

Requisitos del módulo


El módulo gMSA en AKS PowerShell se basa en diferentes módulos y herramientas. Para
instalar estos requisitos, ejecute lo siguiente en una sesión con privilegios elevados:

PowerShell

Install-ToolingRequirements

Inicio de sesión con la credencial de Azure


Tendrá que iniciar sesión en Azure con sus credenciales para el módulo gMSA en AKS
PowerShell para configurar correctamente el clúster de AKS. Para iniciar sesión en Azure
mediante PowerShell, ejecute lo siguiente:

PowerShell

Connect-AzAccount -DeviceCode -Subscription "<SUBSCRIPTION_ID>"

También debe iniciar sesión con la CLI de Azure, ya que el módulo de PowerShell
también lo usa en segundo plano:

PowerShell

az login --use-device-code
az account set --subscription "<SUBSCRIPTION_ID>"

Configuración de entradas necesarias para


gMSA en el módulo de AKS
A lo largo de la configuración de gMSA en AKS, se necesitarán muchas entradas, como:
el nombre del clúster de AKS, el nombre del grupo de recursos de Azure, la región para
implementar los recursos necesarios, el nombre de dominio de Active Directory y
mucho más. Para simplificar el proceso siguiente, creamos un comando de entrada que
recopilará todos los valores necesarios y lo almacenará en una variable que se usará en
los comandos siguientes.

Para empezar, ejecute lo siguiente:

PowerShell

$params = Get-AksGMSAParameters

Después de ejecutar el comando, proporcione las entradas necesarias hasta que finalice
el comando. Desde ahora, puede copiar y pegar los comandos como se muestra en esta
página.

Conexión al clúster de AKS


Al usar la gMSA en el módulo de PowerShell de AKS, se conectará al clúster de AKS que
desea configurar. La gMSA en el módulo de PowerShell AKs se basa en la conexión de
kubectl. Para conectar el clúster, ejecute lo siguiente: (Tenga en cuenta que, dado que
proporcionó las entradas anteriores, puede simplemente copiar y pegar el comando
siguiente en la sesión de PowerShell).

PowerShell

Import-AzAksCredential -Force `
-ResourceGroupName $params["aks-cluster-rg-name"] `
-Name $params["aks-cluster-name"]

Paso siguiente
Configure gMSA en AKS con el módulo de PowerShell

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Configuración de gMSA en Azure
Kubernetes Service con el módulo de
PowerShell
Artículo • 02/02/2025

En esta sección se explica cómo configurar gMSA en Azure Kubernetes Service mediante
la gMSA en el módulo de PowerShell de AKS. En los pasos siguientes se da por supuesto
que ha instalado la gMSA en el módulo de PowerShell de AKS, conectado a los clústeres
de AKS y ha proporcionado los parámetros necesarios. Si aún no lo ha hecho, asegúrese
de seguir los pasos de la sección primera de este tutorial.

Confirmación de que el clúster de AKS tiene la


característica gMSA configurada correctamente
Puede que su clúster de AKS ya esté configurado para gMSA o no. Para validar que el
clúster está listo para el uso de gMSA, ejecute el siguiente comando:

PowerShell

Confirm-AksGMSAConfiguration `
-AksResourceGroupName $params["aks-cluster-rg-name"] `
-AksClusterName $params["aks-cluster-name"] `
-AksGMSADomainDnsServer $params["domain-dns-server"] `
-AksGMSARootDomainName $params["domain-fqdn"]

Después de configurar el clúster, puede configurar la infraestructura restante necesaria


para que la gMSA funcione.

Configuración del entorno de Active Directory


El primer paso para preparar Active Directory es asegurarse de que el sistema de
distribución de claves está configurado. Para este paso, los comandos deben ejecutarse
con credenciales con la delegación adecuada, en un controlador de dominio. Esta tarea
se puede delegar a personas autorizadas.

Desde un controlador de dominio, ejecute lo siguiente para habilitar la clave raíz:

Para entornos de producción:


PowerShell

# You will need to wait 10 hours before the KDS root key is
# replicated and available for use on all domain controllers.
Add-KdsRootKey -EffectiveImmediately

Para entornos de prueba:

PowerShell

# For single-DC test environments ONLY.


Add-KdsRootKey -EffectiveTime (Get-Date).AddHours(-10)

Para los siguientes comandos, puede ejecutarlos en el controlador de dominio o en una


sesión remota de PowerShell. Si se ejecuta desde el controlador de dominio, quite los
parámetros "DomainControllerAddress", "DomainUser" y "DomainPassword" del
comando.

Si se ejecuta de forma remota, asegúrese de que el controlador de dominio está


configurado para la administración remota.

Creación del usuario de dominio estándar


PowerShell

# Creates the standard domain user.


New-GMSADomainUser `
-Name $params["gmsa-domain-user-name"] `
-Password $params["gmsa-domain-user-password"] `
-DomainControllerAddress $params["domain-controller-address"] `
-DomainAdmin "$($params["domain-fqdn"])\$($params["domain-admin-user-
name"])" `
-DomainAdminPassword $params["domain-admin-user-password"]

Creación de la gMSA
PowerShell

# Creates the gMSA account, and it authorizes only the standard domain
user.
New-GMSA `
-Name $params["gmsa-name"] `
-AuthorizedUser $params["gmsa-domain-user-name"] `
-DomainControllerAddress $params["domain-controller-address"] `
-DomainAdmin "$($params["domain-fqdn"])\$($params["domain-admin-user-
name"])" `
-DomainAdminPassword $params["domain-admin-user-password"]

Configuración de Azure Key Vault y identidad


administrada asignada por el usuario de Azure
Azure Key Vault (AKV) se usará para almacenar las credenciales usadas por los nodos de
Windows en AKS para comunicarse con los controladores de dominio de Active
Directory. Se usará una identidad administrada (MI) para proporcionar acceso adecuado
a AKV para los nodos de Windows.

Creación del almacén de claves de Azure


PowerShell

# The Azure key vault will have a secret with the credentials of the
standard
# domain user authorized to fetch the gMSA.
New-GMSAAzureKeyVault `
-ResourceGroupName $params["aks-cluster-rg-name"] `
-Location $params["azure-location"] `
-Name $params["akv-name"] `
-SecretName $params["akv-secret-name"] `
-GMSADomainUser "$($params["domain-fqdn"])\$($params["gmsa-domain-user-
name"])" `
-GMSADomainUserPassword $params["gmsa-domain-user-password"]

Creación de la identidad administrada asignada por el


usuario de Azure
PowerShell

New-GMSAManagedIdentity `
-ResourceGroupName $params["aks-cluster-rg-name"] `
-Location $params["azure-location"] `
-Name $params["ami-name"]

Concesión de acceso de AKV a los hosts de Windows de


AKS
PowerShell
# Appends the user-assigned managed identity to the AKS Windows agent pools
given as input parameter.
# Configures the AKV read access policy for the user-assigned managed
identity.
Grant-AkvAccessToAksWindowsHosts `
-AksResourceGroupName $params["aks-cluster-rg-name"] `
-AksClusterName $params["aks-cluster-name"] `
-AksWindowsNodePoolsNames $params["aks-win-node-pools-names"] `
-VaultResourceGroupName $params["aks-cluster-rg-name"] `
-VaultName $params["akv-name"] `
-ManagedIdentityResourceGroupName $params["aks-cluster-rg-name"] `
-ManagedIdentityName $params["ami-name"]

Configuración de la especificación de credenciales de


gMSA utilizando los recursos de RBAC
PowerShell

# Creates the gMSA credential spec.


# Configures the appropriate RBAC resources (ClusterRole and RoleBinding)
for the spec.
# Executes AD commands to get the appropriate domain information for the
credential spec.
New-GMSACredentialSpec `
-Name $params["gmsa-spec-name"] `
-GMSAName $params["gmsa-name"] `
-ManagedIdentityResourceGroupName $params["aks-cluster-rg-name"] `
-ManagedIdentityName $params["ami-name"] `
-VaultName $params["akv-name"] `
-VaultGMSASecretName $params["akv-secret-name"] `
-DomainControllerAddress $params["domain-controller-address"] `
-DomainUser "$($params["domain-fqdn"])\$($params["gmsa-domain-user-name"])"
`
-DomainUserPassword $params["gmsa-domain-user-password"]

En esta fase, se completa la configuración de gMSA en AKS. Ahora puede desplegar su


carga de trabajo en los nodos de Windows.

Paso siguiente
Validación de gMSA en AKS con el módulo de PowerShell

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Validación de gMSA en AKS con el
módulo de PowerShell
Artículo • 05/02/2025

Una vez configurado gMSA en AKS con el módulo de PowerShell, la aplicación está lista
para implementarse en los nodos de Windows en AKS. Sin embargo, si desea validar
aún más que la configuración está configurada correctamente, puede usar las
instrucciones siguientes para confirmar si la implementación está configurada
correctamente.

Validación
El módulo gMSA en AKS PowerShell proporciona un comando para validar si la
configuración del entorno está configurada correctamente. Compruebe que la
especificación de credenciales de gMSA funciona con el siguiente comando:

PowerShell

Start-GMSACredentialSpecValidation `
-SpecName $params["gmsa-spec-name"] `
-AksWindowsNodePoolsNames $params["aks-win-node-pools-names"]

Recopilación de registros de gMSA de los


nodos de Windows
El comando siguiente se puede usar para extraer registros de los hosts de Windows:

PowerShell

# Extracts the following logs from each Windows host:


# - kubelet logs.
# - CCG (Container Credential Guard) logs (as a .evtx file).
Copy-WindowsHostsLogs -LogsDirectory $params["logs-directory"]

Los registros se copiarán de cada host de Windows en el directorio local $params["logs-


directory"] . El directorio de registros tendrá un subdirectorio denominado después de

cada host del agente de Windows. El archivo de registro .evtx de CCG (Container
Credential Guard) se puede inspeccionar correctamente en el Visor de eventos, solo
después de cumplir los siguientes requisitos:
La característica Contenedores de Windows está instalada. Se puede instalar a
través de PowerShell mediante el siguiente comando:

PowerShell

# Needs computer restart


Install-WindowsFeature -Name Containers

El archivo de manifiesto de registro CCGEvents.man se registra mediante lo


siguiente:

PowerShell

wevtutil im CCGEvents.man

7 Nota

Microsoft debe proporcionar el archivo de manifiesto de registro.

Configuración de una aplicación de ejemplo


mediante gMSA
Además de simplificar la configuración de gMSA en AKS, el módulo de PowerShell
también proporciona una aplicación de ejemplo que puede usar con fines de prueba.
Para instalar la aplicación de ejemplo, ejecute lo siguiente:

PowerShell

Get-GMSASampleApplicationYAML `
-SpecName $params["gmsa-spec-name"] `
-AksWindowsNodePoolsNames $params["aks-win-node-pools-names"] | kubectl
apply -f -

Validación del acceso del grupo de agentes de


AKS a Azure Key Vault
Los grupos de nodos de AKS deben poder acceder al secreto de Azure Key Vault para
poder usar la cuenta que puede recuperar la gMSA en Active Directory. Es importante
que haya configurado este acceso correctamente para que los nodos puedan
comunicarse con el controlador de dominio de Active Directory. No acceder a los
secretos significa que la aplicación no podrá autenticarse. Por otro lado, es posible que
quiera asegurarse de que no se proporciona acceso a los grupos de nodos que no lo
necesiten necesariamente.

El módulo gMSA en AKS PowerShell permite validar qué grupos de nodos tienen acceso
a qué secretos de Azure Key Vault.

PowerShell

Get-AksAgentPoolsAkvAccess `
-AksResourceGroupName $params["aks-cluster-rg-name"] `
-AksClusterName $params["aks-cluster-name"] `
-VaultResourceGroupNames $params["aks-cluster-rg-name"]

Compartir comentarios
Para obtener comentarios, preguntas y sugerencias sobre la gMSA en el módulo de
PowerShell en AKS, visite el repositorio de contenedores de Windows en GitHub .

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Red de contenedores de Windows
Artículo • 30/01/2025

Se aplica a: Windows Server 2025, Windows Server 2022, Windows Server 2019,
Windows Server 2016

) Importante

Consulte Docker Container Networking para comandos, opciones y sintaxis


generales de Docker. A excepción de los casos descritos en características y
opciones de red no compatibles, todos los comandos de red de Docker se admiten
en Windows con la misma sintaxis que en Linux. Sin embargo, las pilas de red de
Windows y Linux son diferentes y, como tal, verá que algunos comandos de red de
Linux (por ejemplo, ifconfig ) no se admiten en Windows.

Arquitectura de red básica


En este tema se proporciona información general sobre cómo Docker crea y administra
redes host en Windows. Los contenedores de Windows funcionan de forma similar a las
máquinas virtuales en lo que respecta a las redes. Cada contenedor tiene un adaptador
de red virtual (vNIC) que se conecta a un conmutador virtual Hyper-V (vSwitch).
Windows admite cinco controladores o modos de red diferentes que se pueden crear a
través de Docker: nat, overlay, transparent, l2bridge y l2tunnel. En función de la
infraestructura de red física y de los requisitos de red de un solo host o de varios hosts,
debes elegir el controlador de red que mejor se adapte a tus necesidades.
La primera vez que se ejecuta docker Engine, crea una red NAT predeterminada, "nat",
que usa un vSwitch interno y un componente de Windows denominado WinNAT . Si hay
vSwitches externos preexistentes en el host que se crearon a través de PowerShell o el
Administrador de Hyper-V, también estarán disponibles para Docker mediante el
controlador de red transparente y se pueden ver al ejecutar el docker network ls
comando.

Un vSwitch interno es uno que no está conectado directamente a un adaptador de


red en el host del contenedor.
Un vSwitch externo es uno que está conectado directamente a un adaptador de
red en el host de contenedor.
La red "nat" es la red predeterminada para los contenedores que se ejecutan en
Windows. Los contenedores que se ejecutan en Windows sin marcas ni argumentos
para implementar configuraciones de red específicas se asociarán a la red "nat"
predeterminada y se asignará automáticamente una dirección IP desde el intervalo IP
interno de la red "nat". El prefijo IP interno predeterminado usado para "nat" es
172.16.0.0/16.

Administración de redes de contenedores con


el servicio de red host
El servicio de redes de host (HNS) y el servicio de proceso de host (HCS) funcionan
conjuntamente para crear contenedores y conectar puntos de conexión a una red.
Puede interactuar con HNS a través del módulo auxiliar de PowerShell de HNS.

Creación de red
HNS crea un conmutador virtual de Hyper-V para cada red.
HNS crea grupos de DIRECCIONES IP y NAT según sea necesario.

Creación de puntos de conexión


HNS crea un espacio de nombres de red por punto de conexión de contenedor
HNS/HCS coloca v(m)NIC dentro del espacio de nombres de red
HNS crea puertos (vSwitch)
HNS asigna la dirección IP, la información de DNS, las rutas, etc. (sujeto al modo
de red) al punto de conexión.

Creación de directivas
Para la red predeterminada de traducción de direcciones de red (NAT), HNS crea
las reglas de reenvío de puertos WinNAT y las asignaciones con las reglas ALLOW
de Firewall de Windows correspondientes.
Para todas las demás redes, HNS utiliza la Plataforma de filtrado virtual (VFP) para
la creación de directivas que incluye equilibrio de carga, ACL y encapsulación. Para
más información sobre las API de HNS y el esquema, consulte Api de servicio de
red de proceso de host (HCN) para máquinas virtuales y contenedores.
Características no admitidas y opciones de red
Actualmente no se admiten las siguientes opciones de red en Windows:

Desde Windows Server 2022 y versiones posteriores, los contenedores de


Windows tienen la siguiente compatibilidad con las redes IPv6:
Los contenedores conectados a redes l2bridge admiten la pila IPv6.
Los contenedores conectados a redes transparentes admiten la comunicación
mediante IPv6 con direcciones IP autoasignadas, pero no admiten la asignación
de direcciones IP proporcionadas por HNS y otros servicios de red, como
equilibrio de carga y ACL.
Los contenedores de Windows conectados a redes NAT y de superposición no
admiten la comunicación a través de la pila IPv6.
Comunicación de contenedor cifrada a través de IPsec.
Redes en modo host.
Redes en la infraestructura de Azure virtualizada a través del controlador de red
transparente.

ノ Expandir tabla
Comando Opción no admitida

docker run --ip6 , --dns-option

docker network --aux-address , --internal , --ip-range , --ipam-driver , --ipam-opt , , --


create ipv6 --opt encrypted

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Controladores de red de contenedores
de Windows
Artículo • 05/02/2025

Se aplica a: Windows Server 2025, Windows Server 2022, Windows Server 2019,
Windows Server 2016

Además de aprovechar la red "nat" predeterminada creada por Docker en Windows, los
usuarios pueden definir redes de contenedor personalizadas. Las redes definidas por el
usuario se pueden crear mediante el comando docker network create -d <NETWORK
DRIVER TYPE> <NAME> de la CLI de Docker. En Windows, están disponibles los
siguientes tipos de controladores de red:

Controlador de red NAT


Los contenedores conectados a una red creada con el controlador "nat" se conectarán a
un conmutador de Hyper-V interno de y recibirán una dirección IP del prefijo IP
especificado por el usuario ( --subnet ). Se admite el reenvío o asignación de puertos
desde el host del contenedor a los puntos finales del contenedor.

 Sugerencia

Es posible personalizar la subred utilizada por la red "nat" predeterminada


mediante el valor fixed-cidr del archivo de configuración del demonio de
Docker .

7 Nota

Las redes NAT creadas en Windows Server 2019 (o superior) ya no se conservan


después del reinicio.

Creación de una red NAT


Para crear una nueva red NAT con subred 10.244.0.0/24 :

PowerShell
docker network create -d "nat" --subnet "10.244.0.0/24" my_nat

Controlador de red transparente


Los contenedores conectados a una red creada con el controlador "transparente" se
conectarán directamente a la red física a través de un conmutador de Hyper-V externo.
Las direcciones IP de la red física se pueden asignar estáticamente (requiere la opción -
-subnet especificada por el usuario) o dinámicamente mediante un servidor DHCP

externo.

7 Nota

Debido al siguiente requisito, no se admite la conexión de los hosts de contenedor


a través de una red transparente en máquinas virtuales de Azure.

Obligatorio: cuando este modo se usa en un escenario de virtualización (el host de


contenedor es una máquina virtual) la suplantación de direcciones MAC es
obligatoria.

Creación de una red transparente


Para crear una nueva red transparente con subred 10.244.0.0/24 , puerta de enlace
10.244.0.1 , servidor DNS 10.244.0.7 e id. de VLAN 7 :

PowerShell

docker network create -d "transparent" --subnet 10.244.0.0/24 --gateway


10.244.0.1 -o com.docker.network.windowsshim.vlanid=7 -o
com.docker.network.windowsshim.dnsservers="10.244.0.7" my_transparent

Superponer controlador de red


Utilizados habitualmente por orquestadores como Docker Swarm y Kubernetes, los
contenedores conectados a una red de superposición pueden comunicarse con otros
contenedores conectados a la misma red en varios hosts de contenedores. Cada red de
superposición se crea con su propia subred IP, definida por un prefijo IP privado. El
controlador de red superpuesta utiliza la encapsulación VXLAN para lograr el
aislamiento del tráfico de red entre redes de contenedores de distintos inquilinos y
permite reciclar direcciones IP entre redes superpuestas.
Requiere: Asegúrese de que su entorno cumpla estos requisitos previos para crear
redes de superposición.

Requiere: En Windows Server 2019, esto requiere KB4489899 .

Requiere: En Windows Server 2016, esto requiere KB4015217 .

7 Nota

En Windows Server 2019 y versiones posteriores, las redes de superposición


creadas por Docker Swarm aprovechan las reglas NAT de VFP para la conectividad
saliente. Esto significa que un contenedor determinado recibe 1 dirección IP.
También significa que las herramientas basadas en ICMP, como ping o Test-
NetConnection , deben configurarse mediante sus opciones TCP/UDP en situaciones

de depuración.

Creación de una red superpuesta


Para crear una nueva red de superposición con subred 10.244.0.0/24 , servidor DNS
168.63.129.16 y VSID 4096 :

PowerShell

docker network create -d "overlay" --attachable --subnet "10.244.0.0/24" -o


com.docker.network.windowsshim.dnsservers="168.63.129.16" -o
com.docker.network.driver.overlay.vxlanid_list="4096" my_overlay

Controlador de red L2bridge


Los contenedores conectados a una red creada con el controlador "l2bridge" se
conectarán a la red física a través de un conmutador de Hyper-V externo. En l2bridge, el
tráfico de red del contenedor tendrá la misma dirección MAC que el host debido a la
operación de traducción de direcciones de capa 2 (reescritura MAC) de entrada y salida.
En los centros de datos, esto ayuda a aliviar el estrés en los conmutadores que tienen
que aprender direcciones MAC de contenedores a veces de corta duración. Las redes
L2bridge se pueden configurar de dos maneras diferentes:

1. La red L2bridge está configurada con la misma subred IP que el host de


contenedor.
2. La red L2bridge está configurada con una nueva subred IP personalizada

En la configuración 2, los usuarios deberán agregar un punto de conexión en el


compartimiento de red host que actúa como puerta de enlace y configurar las
funcionalidades de enrutamiento para el prefijo designado.

Creación de una red l2bridge

Para crear una nueva red l2bridge con subred 10.244.0.0/24 , puerta de enlace
10.244.0.1 , servidor DNS 10.244.0.7 e id. de VLAN 7:

PowerShell

docker network create -d "l2bridge" --subnet 10.244.0.0/24 --gateway


10.244.0.1 -o com.docker.network.windowsshim.vlanid=7 -o
com.docker.network.windowsshim.dnsservers="10.244.0.7" my_l2bridge

 Sugerencia

Las redes L2bridge son altamente programables; Puede encontrar más detalles
sobre cómo configurar l2bridge aquí .

Controlador de red L2tunnel


La creación es idéntica a l2bridge, pero este controlador solo se debe usar en una pila de
Microsoft Cloud (Azure). La única diferencia con respecto a l2bridge es que todo el
tráfico de contenedor se envía al host de virtualización donde se aplica la directiva de
SDN, lo que permite características como las de grupos de seguridad de red de Azure
para los contenedores.

Topologías de red e IPAM


En la tabla siguiente se muestra cómo se proporciona conectividad de red para
conexiones internas (contenedor a contenedor) y externas para cada controlador de red.

Modos de red/controladores de Docker

ノ Expandir tabla
Controlador de Usos típicos Contenedor a Contenedor a Contenedor a
red de Windows contenedor externo (nodo único contenedor
de Docker (nodo único) + varios nodos) (varios nodos)

NAT Bueno para Misma Enrutado mediante la No se admite


(predeterminado) desarrolladores subred: vNIC de directamente: es
conexión administración necesario
con puente (enlazada a WinNAT) exponer puertos
desde el mediante el host
conmutador
virtual de
Hyper-V
Entre
subredes:
no
compatible
(solo un
prefijo
interno
NAT)

Transparente Bueno para Misma Enrutado a través del Enrutado a


desarrolladores o subred: host de contenedor través del host
implementaciones conexión con acceso directo al de contenedor
pequeñas con puente adaptador de red con acceso
desde el (físico) directo al
conmutador adaptador de
virtual de red (físico)
Hyper-V
Entre
subredes:
se enruta
mediante el
host de
contenedor

Superposición Bueno para varios Misma No se admite Misma subred o


nodos; subred: directamente: se entre subredes:
obligatorio para conexión necesita un segundo el tráfico de red
Docker Swarm, con puente punto de conexión de se encapsula
disponible en desde el contenedor mediante VXLAN
Kubernetes conmutador conectado a la red y se enruta a
virtual de NAT en través de mgmt
Hyper-V Windows Server 2016, vNIC
Subred o bien una regla NAT
cruzada: el de VFP en
tráfico de Windows Server 2019.
red se
Controlador de Usos típicos Contenedor a Contenedor a Contenedor a
red de Windows contenedor externo (nodo único contenedor
de Docker (nodo único) + varios nodos) (varios nodos)

encapsula y
se enruta a
través de
mgmt vNIC

L2Bridge Se usa para Misma Dirección MAC del Misma


Kubernetes y subred: contenedor reescrita subred:
Microsoft SDN conexión en la entrada y a la conexión
con puente salida puenteda
desde el Entre
conmutador subredes:
virtual de se enruta
Hyper-V mediante
Entre la vNIC
subredes: la Mgmt en
dirección WSv1809 y
MAC del versiones
contenedor posteriores
se reescribe
durante la
entrada y la
salida, y se
enruta

L2Tunnel Solo Azure Misma subred o El tráfico debe pasar Misma subred o
entre subredes: por la puerta de entre subredes:
anclada al enlace de red virtual anclada al
conmutador de Azure conmutador
virtual de Hyper-V virtual de Hyper-
del host físico a V del host físico
donde se aplica la a donde se
directiva aplica la directiva

IPAM
Las direcciones IP se reparten y asignan de manera diferente para cada controlador de
red. Windows usa el Servicio de redes de host (HNS) para proporcionar IPAM para el
controlador NAT y funciona con el modo Docker Swarm (KVS interno) a fin de
proporcionar IPAM para la superposición. Todos los demás controladores de red usan
un IPAM externo.
ノ Expandir tabla

Modo de IPAM
red/Controlador

NAT Asignación y asignación dinámica de IP por el Servicio de redes de host


(HNS) desde el prefijo de subred NAT interno

Transparente Asignación y distribución de direcciones IP estáticas o dinámicas


(mediante un servidor DHCP externo) a partir de direcciones IP dentro del
prefijo de red del host del contenedor

Superposición Asignación dinámica de IP desde prefijos gestionados por el modo Swarm


del motor Docker y asignación mediante HNS

L2Bridge Asignación dinámica de IP por el Servicio de Red de Host (HNS) a partir


del prefijo de subred proporcionado

L2Tunnel Solo para Azure: asignación y atribución dinámica de IP desde el


complemento

Detección de servicios
La detección de servicios solo se admite para determinados controladores de red de
Windows.

ノ Expandir tabla

Nombre del controlador Detección de servicios locales Detección de servicios globales

nat SÍ SÍ con Docker EE

superposición SÍ SÍ con Docker EE o kube-dns

transparente NO NO

l2bridge SÍ con kube-dns SÍ con kube-dns

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Compatibilidad con varias subredes en
el servicio de redes de host
Artículo • 05/02/2025

Se aplica a: Windows Server 2025, Windows Server 2022

Ahora se admite el uso de varias subredes por red en el servicio de redes de host (HNS)
para contenedores de Windows. Anteriormente, HNS restringía las configuraciones de
puntos de conexión de contenedores de Kubernetes para usar solo la longitud del
prefijo de la subred subyacente. HNS se ha mejorado para que pueda usar subredes
más restrictivas, como subredes con una longitud de prefijo más larga, así como varias
subredes por nodo de trabajo de Windows. La primera interfaz de red de contenedor
(CNI) que puede esta funcionalidad es Calico para Windows. Calico Network Policies es
una solución de seguridad de red y red de código abierto fundada por Tigera .

Puede utilizar varias subredes en HNS solo para los controladores de red l2bridge,
l2tunnel y overlay. Estos controladores de red pueden exponer varias subredes y, a
continuación, permitir que cada punto de conexión se enlace a una de estas subredes.

HNS y el servicio de computación del host (HCS) funcionan conjuntamente para crear
contenedores y conectar puntos de conexión a una red. Puede interactuar con HNS
mediante el módulo HNS PowerShell Helper .

Requisitos de Calico
La compatibilidad con varias subredes para el CNI de Calico requiere subdividir la
subred en bloques IP más pequeños. Todos los bloques IP deben compartir la misma
puerta de enlace, pero cada bloque IP puede tener su propio dominio de difusión
independiente. Para maximizar la asignación de IPV4 para que sea lo más eficaz posible,
Calico requiere crear bloques IP muy pequeños (tan pequeños como un bloque = cuatro
direcciones IP), además de establecer prefijos muy pequeños en los puntos de conexión
de contenedor (tan pequeños como /32).

Una implementación completa de la administración de direcciones IP (IPAM) de Calico


funciona de la siguiente manera:

La función IPAM de Calico está diseñada para asignar direcciones IP a cargas de trabajo
a petición. Calico también admite varios grupos de direcciones IP para la agrupación
administrativa. Al configurar una asignación para una carga de trabajo determinada, el
conjunto de grupos permitidos puede estar limitado por la configuración, lo que
permite varios casos de uso. Siga las instrucciones siguientes para diferentes casos de
uso:

Utilice varios grupos disjuntos para aumentar la capacidad.


Para las redes l2bridge dentro de un bastidor, configure un grupo de direcciones IP
por bastidor donde los hosts de un bastidor solo pueden realizar la asignación
desde un grupo determinado.
Use un grupo de IP por capa de pila donde los pods de front-end obtienen sus
direcciones de un grupo de front-end (que podría ser público), pero los pods de
back-end (potencialmente en el mismo host) reciben direcciones de otro intervalo.
Esto permite que Calico se ajuste a los exigentes requisitos de creación de
particiones de red (según sea necesario para trabajar con firewalls heredados).
Use micro grupos muy pequeños, uno para cada nivel de una pila. Dado que estos
grupos son tan pequeños, requieren que cada host admita cargas de trabajo de
varios grupos.

Las direcciones IP siempre se asignan desde bloques y esos bloques pueden ser afín a
un host determinado. Un host siempre intentará asignar direcciones IP desde uno de sus
propios bloques affine si hay espacio (y solo si el bloque procede de un grupo
permitido para la carga de trabajo determinada). Si ninguno de los bloques existentes
del host tiene espacio, este intentará reclamar un nuevo bloque de un grupo permitido.
Si no hay bloques vacíos disponibles, el host tomará prestado una dirección IP de
cualquier bloque de un grupo permitido que tenga espacio libre disponible, incluso si
ese bloque es afín a otro host.

Calico se basa en el de enrutamiento de coincidencias de prefijo más largo para admitir la


agregación. Cada host anuncia rutas para todos sus bloques afines y anuncia rutas /32
para cualquier IP que haya tomado prestada. Como una ruta /32 es más específica, los
hosts remotos que necesitan reenviar a /32 usarán la ruta /32 en lugar de la ruta /26
más amplia al host con el bloque afín.

Puesto que Calico es una red L3 enrutada, vale la pena señalar que las rutas /26 no
están pensadas para ser subredes. Por ejemplo, no hay ninguna dirección de red o
difusión; y las direcciones "0" y "255" de un bloque se usan como direcciones IP
normales.

Requisitos del plano de datos HNS de Calico


Hay varios requisitos de conectividad y directivas de Calico para habilitar varias
subredes en HNS:
Todas las cargas de trabajo del mismo host deben tener conectividad entre sí y con
pods remotos.
Todas las rutas de paquetes entre pods deben cumplir lo siguiente, ya sea que el
remitente y el receptor estén ubicados en el mismo host o si se acceden
mutuamente, ya sea de forma directa o a través de la IP del clúster de servicios:
Las directivas de salida y entrada de la lista de control de acceso (ACL) deben
aplicarse.
Tanto la directiva de salida del pod de envío como la directiva de entrada del
pod receptor deben permitir el tráfico.
Todas las reglas de ACL programadas por Calico deben poder ver las
direcciones IP del pod.
Los hosts y pods deben poder comunicarse entre sí y llegar a pods en otros hosts
mediante rutas aprendidas por medio del Protocolo de puerta de enlace de borde
(BGP).

Requisitos para varios bloques IP por host


Para admitir varios bloques ip por host, revise los siguientes requisitos:

En el caso de un único grupo de IP determinado, el plano de datos debe permitir


que los pods se agreguen con IP de diferentes bloques de IP disjuntos. Por
ejemplo, el grupo de direcciones IP puede ser 10.0.0.0/16, pero un host puede
reclamar un par de bloques aleatorios: 10.0.123.0/26 y 10.0.200.0/26.
No es necesario conocer el grupo y el tamaño de los bloques antes de la primera
asignación. Esto es muy recomendable.
Otros bloques del mismo conjunto pueden estar presentes en otros servidores.
El prefijo común de los distintos bloques puede superponerse con la propia
dirección IP del host.

Requisitos para apoyar los préstamos de propiedad


intelectual.
Calico IPAM asigna direcciones IP para hospedar en bloques con fines de agregación. Si
el grupo de direcciones IP está lleno, los nodos también pueden tomar prestadas
direcciones IP del bloque de otro nodo. En términos de BGP, el prestatario anuncia
entonces una ruta más específica /32 para la dirección IP prestada y, a continuación, el
tráfico de esa dirección IP se enruta al host prestatario.

Los nodos de Windows no admiten este mecanismo de préstamo. No tomarán


prestadas direcciones IP incluso si el grupo de direcciones IP está lleno, y marcan sus
bloques para que los nodos de Linux tampoco los tomen prestados.
Requisitos para admitir microgrupos
Para usar micropools, se quita el requisito de reservar cuatro direcciones IP por bloque.
En el caso de uso de micropool, se usan grupos muy pequeños y bloques muy
pequeños, por lo que cuatro direcciones IP por bloque desperdician la mayoría de las
direcciones IP. Puede requerir un pequeño número de direcciones IP reservadas por
host o por grupo. Un procedimiento recomendado consiste en eliminar todas las
restricciones de compatibilidad de capa 2 (por ejemplo, no debe haber compatibilidad
con la difusión y no hay direcciones IP reservadas).

Creación de una subred y una subred de IP


mediante PowerShell
Antes de continuar, asegúrese de tener instalado el módulo HNS.V2.psm1 desde la
galería HNS de PowerShell .

En los pasos siguientes se explica cómo crear una subred y una subred IP mediante
ejemplos.

1. Para crear una red l2bridge con una subred 192.168.0.0/16 que contiene una
subred IP 192.168.1.0/24 y una subred IP 192.168.2.0/24, ejecute el siguiente
comando:

PowerShell

$net1 = New-HnsNetwork -Type L2Bridge -Name Test1 -AddressPrefix


"192.168.0.0/16" -Gateway "192.168.0.1" -Verbose -IPSubnets
@(@{"IpAddressPrefix"="192.168.1.0/24";"Flags"=0},@{"IpAddressPrefix"="
192.168.2.0/24";"Flags"=[IPSubnetFlags]::EnableBroadcast})

2. Para agregar una nueva subred 172.16.0.0/16 que contenga una subred IP
172.16.1.0/16 a la red l2bridge, ejecute el siguiente comando:

PowerShell

New-HnsSubnet -NetworkID $net1.ID -Subnets @{


"IpAddressPrefix"="172.16.0.0/16";

"Routes"=@(@{"NextHop"="172.16.0.1";"DestinationPrefix"="0.0.0.0"});
"IpSubnets"=@(@{"IpAddressPrefix"="172.16.1.0/24"})

3. Para agregar una nueva subred IP 172.16.2.0/24 a la subred 172.16.0.0/16, ejecute


el siguiente comando:
PowerShell

New-HnsIPSubnet -NetworkID $net1.ID -SubnetID $net2.Subnets[1].ID -


IPSubnets @{"IpAddressPrefix"="172.16.2.0/24";"Flags"=0}

Para quitar las subredes IP, siga estos pasos:

1. Para quitar la subred IP 172.16.2.0/24, ejecute el siguiente comando:

PowerShell

$net2 = Get-HnsNetwork -ID $net1.ID


Remove-HnsIpSubnet -NetworkID $net1.ID -SubnetID $net2.Subnets[1].ID
-IPSubnets @{"ID"=$net2.Subnets[1].IPSubnets[1].ID}

2. Para quitar la subred 172.16.0.0/16, ejecute el siguiente comando:

PowerShell

Remove-HnsSubnet -NetworkID $net1.ID -Subnets


@{"ID"=$net2.Subnets[1].ID}

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Aislamiento y seguridad de red
Artículo • 05/02/2025

Se aplica a: Windows Server 2022, Windows Server 2019, Windows Server 2016

Aislamiento con espacios de nombres de red


Cada punto de conexión de contenedor se coloca en su propio espacio de nombres de
red. El adaptador de red virtual del host de administración y la pila de red del host se
encuentran en el espacio de nombres de red predeterminado. Para aplicar el aislamiento
de red entre contenedores en el mismo host, se crea un espacio de nombres de red
para cada contenedor de Windows Server y los contenedores se ejecutan bajo el
aislamiento Hyper-V, en el cual se instala el adaptador de red para el contenedor. Los
contenedores de Windows Server usan un adaptador de red virtual host para conectarse
al conmutador virtual. El aislamiento de Hyper-V utiliza un adaptador de red de
máquina virtual sintético (no expuesto a la máquina virtual de utilidad) para conectarse
al conmutador virtual.
Ejecute el siguiente cmdlet de PowerShell para obtener todos los compartimientos de
red en la pila de protocolos:

PowerShell

Get-NetCompartment

Seguridad de red
Según el contenedor y controlador de red que se use, las ACL de puerto se aplican
mediante una combinación del Firewall de Windows y Azure Virtual Filtering Platform
(VFP) .

Contenedores de Windows Server


Los siguientes valores utilizan el firewall de los hosts de Windows (habilitado con
espacios de nombres de red) y VFP:

Salida predeterminada: PERMITIR TODO


Entrada predeterminada: PERMITIR TODO (TCP, UDP, ICMP, IGMP) tráfico de red
no solicitado
Deniega todo el resto del tráfico de red que no proceda de estos protocolos

7 Nota

Antes de Windows Server versión 1709 y Windows 10 Fall Creators Update, la regla
de entrada predeterminada era DENY all. Los usuarios que ejecutan estas versiones
anteriores pueden crear reglas ALLOW entrantes con docker run -p (reenvío de
puertos).

Aislamiento de Hyper-V
Los contenedores que operan en aislamiento Hyper-V tienen su propio núcleo aislado y,
por tanto, ejecutan su propia instancia de Firewall de Windows con la siguiente
configuración:

Predeterminado PERMITIR TODO en el Firewall de Windows (que se ejecuta en la


VM de utilidad) y VFP.
aislamiento de

de firewall

Pods de Kubernetes
En un pod de Kubernetes , primero se crea un contenedor de infraestructura al que se
adjunta un punto de conexión. Los contenedores que pertenecen al mismo pod,
incluidos los contenedores de infraestructura y trabajo, comparten un espacio de
nombres de red común (como la misma dirección IP y espacio de puerto).
Personalización de ACL de puerto predeterminadas
Si quiere modificar las ACL de puerto predeterminadas, revise el tema Servicio de redes
de host antes de cambiar los puertos. Deberá actualizar las directivas dentro de los
siguientes componentes:

7 Nota

Para el aislamiento de Hyper-V en modo transparente y NAT, actualmente no se


pueden volver a configurar las ACL de puerto predeterminadas, lo que se indica
con una "X" en la tabla siguiente.

ノ Expandir tabla

Controlador de red Contenedores de Windows Server Aislamiento de Hyper-V

Transparente Windows Firewall X

NAT Windows Firewall X

L2Bridge Ambos VFP

L2Tunnel Ambos VFP


Controlador de red Contenedores de Windows Server Aislamiento de Hyper-V

Superposición Ambos VFP

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Opciones avanzadas de red en Windows
Artículo • 17/01/2024

Se aplica a: Windows Server 2022, Windows Server 2019, Windows Server 2016

Se admiten varias opciones de controlador de red para aprovechar las funcionalidades y


características específicas de Windows.

Cambio de equipo insertado con redes de


Docker
Se aplica a todos los controladores de red

Puede aprovechar las ventajas de Switch Embedded Teaming al crear redes host de
contenedor para usarlas mediante Docker especificando varios adaptadores de red
(separados por comas) con la -o com.docker.network.windowsshim.interface opción .

C:\> docker network create -d transparent -o


com.docker.network.windowsshim.interface="Ethernet 2", "Ethernet 3"
TeamedNet

Establecer el identificador de VLAN para una


red
Se aplica a los controladores de red transparentes y l2bridge

Para establecer un identificador de VLAN para una red, use la opción para -o
com.docker.network.windowsshim.vlanid=<VLAN ID> el docker network create comando .

Por ejemplo, puede usar el siguiente comando para crear una red transparente con un
identificador de VLAN de 11:

C:\> docker network create -d transparent -o


com.docker.network.windowsshim.vlanid=11 MyTransparentNetwork
Al establecer el identificador de VLAN para una red, se establece el aislamiento de VLAN
para los puntos de conexión de contenedor que se asociarán a esa red.

Asegúrese de que el adaptador de red host (físico) está en modo troncal para
permitir que el vSwitch procese todo el tráfico etiquetado con el puerto vNIC (punto
de conexión de contenedor) en modo de acceso en la VLAN correcta.

Especificar la directiva OutboundNAT para una


red
Se aplica a las redes l2bridge

Normalmente, cuando se crea una l2bridge red de contenedor mediante docker


network create , los puntos de conexión de contenedor no tienen aplicada una directiva

outboundNAT de HNS, lo que provoca que los contenedores no puedan acceder al


mundo exterior. Si va a crear una red, puede usar la opción de aplicar la -o
com.docker.network.windowsshim.enable_outboundnat=<true|false> directiva de HNS

outboundNAT para conceder a los contenedores acceso al mundo exterior:

C:\> docker network create -d l2bridge -o


com.docker.network.windowsshim.enable_outboundnat=true MyL2BridgeNetwork

Si hay un conjunto de destinos (por ejemplo, se necesita un contenedor para la


conectividad de contenedor) para el lugar en el que no queremos que se produzca NAT,
también es necesario especificar una exceptionList:

C:\> docker network create -d l2bridge -o


com.docker.network.windowsshim.enable_outboundnat=true -o
com.docker.network.windowsshim.outboundnat_exceptions=10.244.10.0/24

Especificar el nombre de una red al servicio


HNS
Se aplica a todos los controladores de red
Normalmente, cuando se crea una red de contenedor mediante docker network create ,
el servicio de Docker usa el nombre de red que proporciona, pero no el servicio HNS. Si
va a crear una red, puede especificar el nombre proporcionado por el servicio HNS
mediante la opción , -o com.docker.network.windowsshim.networkname=<network name> en
el docker network create comando . Por ejemplo, puede usar el siguiente comando
para crear una red transparente con un nombre especificado en el servicio HNS:

C:\> docker network create -d transparent -o


com.docker.network.windowsshim.networkname=MyTransparentNetwork
MyTransparentNetwork

Enlace de una red a una interfaz de red


específica
Se aplica a todos los controladores de red excepto "nat"

Para enlazar una red (conectada a través del conmutador virtual de Hyper-V) a una
interfaz de red específica, use la opción para -o
com.docker.network.windowsshim.interface=<Interface> el docker network create

comando . Por ejemplo, puede usar el siguiente comando para crear una red
transparente que esté conectada a la interfaz de red "Ethernet 2":

C:\> docker network create -d transparent -o


com.docker.network.windowsshim.interface="Ethernet 2" TransparentNet2

Nota: El valor de com.docker.network.windowsshim.interface es el nombre del


adaptador de red, que se puede encontrar con:

PS C:\> Get-NetAdapter

Especificar el sufijo DNS o los servidores DNS


de una red
Se aplica a todos los controladores de red

Use la opción para -o com.docker.network.windowsshim.dnssuffix=<DNS SUFFIX>


especificar el sufijo DNS de una red y la opción para -o
com.docker.network.windowsshim.dnsservers=<DNS SERVER/S> especificar los servidores

DNS de una red. Por ejemplo, puede usar el siguiente comando para establecer el sufijo
DNS de una red en "example.com" y los servidores DNS de una red en 4.4.4.4 y 8.8.8.8:8:

C:\> docker network create -d transparent -o


com.docker.network.windowsshim.dnssuffix=abc.com -o
com.docker.network.windowsshim.dnsservers=4.4.4.4,8.8.8.8
MyTransparentNetwork

VFP
Consulte este artículo para más información.

Recomendaciones y Ideas
Esta es una lista de sugerencias y conclusiones útiles, inspiradas en preguntas comunes
sobre redes de contenedores de Windows que escuchamos de la comunidad...

HNS requiere que IPv6 esté habilitado en máquinas host de


contenedor.
Como parte de KB4015217 HNS requiere que IPv6 esté habilitado en hosts de
contenedor de Windows. Si tiene un error como el siguiente, existe la posibilidad de que
IPv6 esté deshabilitado en el equipo host.

docker: Error response from daemon: container


e15d99c06e312302f4d23747f2dfda4b11b92d488e8c5b53ab5e4331fd80636d encountered
an error during CreateContainer: failure in a Windows system call: Element
not found.

Estamos trabajando en los cambios de la plataforma para detectar o evitar este


problema automáticamente. Actualmente, se puede usar la siguiente solución
alternativa para asegurarse de que IPv6 está habilitado en el equipo host:
C:\> reg delete
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters /v
DisabledComponents /f

Contenedores de Linux en Windows


NUEVO: Estamos trabajando para que sea posible ejecutar contenedores de Linux y
Windows en paralelo sin la máquina virtual Moby Linux. Consulte esta entrada de blog
sobre contenedores de Linux en Windows (LCOW) para obtener más información.
Aquí se muestra cómo empezar.

NOTA: LCOW está en desuso en la máquina virtual Linux de Moby y usará el VSwitch
interno de HNS predeterminado.

Las máquinas virtuales Linux de Moby usan el conmutador


DockerNAT con Docker para Windows (un producto de Docker
CE )

Docker para Windows (el controlador de Windows para el motor de Docker CE) en
Windows 10 usará un vSwitch interno denominado "DockerNAT" para conectar
máquinas virtuales Linux de Moby al host de contenedor. Los desarrolladores que usan
máquinas virtuales Linux de Moby en Windows deben tener en cuenta que sus hosts
usan dockerNAT vSwitch en lugar del vSwitch "nat" creado por el servicio HNS (que es el
conmutador predeterminado que se usa para los contenedores de Windows).

Para usar DHCP para la asignación de IP en un host de contenedor


virtual, habilite MACAddressSpoofing
Si el host de contenedor está virtualizado y desea usar DHCP para la asignación de IP,
debe habilitar MACAddressSpoofing en el adaptador de red de la máquina virtual. De lo
contrario, el host de Hyper-V bloqueará el tráfico de red de los contenedores de la
máquina virtual con varias direcciones MAC. Puede habilitar MACAddressSpoofing con
este comando de PowerShell:

PS C:\> Get-VMNetworkAdapter -VMName ContainerHostVM | Set-VMNetworkAdapter


-MacAddressSpoofing On
Si ejecuta VMware como hipervisor, deberá habilitar el modo promiscuo para que
funcione. Los detalles se pueden encontrar aquí

Creación de varias redes transparentes en un único host de


contenedor
Si desea crear más de una red transparente, debe especificar a qué adaptador de red
(virtual) debe enlazar el conmutador virtual externo de Hyper-V. Para especificar la
interfaz de una red, use la sintaxis siguiente:

# General syntax:
C:\> docker network create -d transparent -o
com.docker.network.windowsshim.interface=<INTERFACE NAME> <NETWORK NAME>

# Example:
C:\> docker network create -d transparent -o
com.docker.network.windowsshim.interface="Ethernet 2" myTransparent2

No olvide especificar --subnet y --gateway al usar la asignación de


IP estática.

Al usar la asignación de IP estática, primero debe asegurarse de que los parámetros --


subnet y --gateway se especifican cuando se crea la red. La subred y la dirección IP de
puerta de enlace deben ser las mismas que la configuración de red para el host de
contenedor, es decir, la red física. Por ejemplo, este es el modo en que puede crear una
red transparente y, a continuación, ejecutar un punto de conexión en esa red mediante
la asignación de IP estática:

# Example: Create a transparent network using static IP assignment


# A network create command for a transparent container network corresponding
to the physical network with IP prefix 10.123.174.0/23
C:\> docker network create -d transparent --subnet=10.123.174.0/23 --
gateway=10.123.174.1 MyTransparentNet
# Run a container attached to MyTransparentNet
C:\> docker run -it --network=MyTransparentNet --ip=10.123.174.105
windowsservercore cmd

No se admite la asignación de IP DHCP con redes L2Bridge


Solo se admite la asignación de DIRECCIONES IP estáticas con redes de contenedor
creadas mediante el controlador l2bridge. Como se indicó anteriormente, recuerde usar
los parámetros --subnet y --gateway para crear una red configurada para la asignación
de IP estática.

Las redes que aprovechan vSwitch externo deben tener su propio


adaptador de red.
Tenga en cuenta que si se crean varias redes que usan un vSwitch externo para la
conectividad (por ejemplo, Transparente, Puente L2, L2 Transparente) en el mismo host
de contenedor, cada una de ellas requiere su propio adaptador de red.

Asignación de IP en contenedores detenidos frente a contenedores


en ejecución
La asignación de IP estática se realiza directamente en el adaptador de red del
contenedor y solo se debe realizar cuando el contenedor está en estado DETENIDO. No
se admite la "adición activa" de adaptadores de red de contenedor o cambios en la pila
de red (en Windows Server 2016) mientras se ejecuta el contenedor.

El vSwitch existente (no visible para Docker) puede bloquear la


creación de red transparente.
Si se produce un error al crear una red transparente, es posible que haya un vSwitch
externo en el sistema que Docker no detectó automáticamente y, por tanto, impide que
la red transparente esté enlazada al adaptador de red externo del host de contenedor.

Al crear una red transparente, Docker crea un vSwitch externo para la red y, a
continuación, intenta enlazar el conmutador a un adaptador de red (externo): el
adaptador podría ser un adaptador de red de máquina virtual o el adaptador de red
físico. Si ya se ha creado un vSwitch en el host de contenedor y es visible para Docker, el
motor de Docker de Windows usará ese modificador en lugar de crear uno nuevo. Sin
embargo, si el vSwitch que se creó fuera de banda (es decir, creado en el host de
contenedor mediante el Administrador de HYper-V o PowerShell) y aún no está visible
para Docker, el motor de Docker de Windows intentará crear un nuevo vSwitch y, a
continuación, no podrá conectar el nuevo conmutador al adaptador de red externo del
host de contenedor (ya que el adaptador de red ya estará conectado al conmutador que
se creó fuera de banda).

Por ejemplo, este problema surgiría si primero creara un nuevo vSwitch en el host
mientras se estaba ejecutando el servicio docker y, a continuación, intente crear una red
transparente. En este caso, Docker no reconocería el modificador que creó y crearía un
nuevo vSwitch para la red transparente.

Hay tres enfoques para resolver este problema:

Por supuesto, puede eliminar el vSwitch que se creó fuera de banda, lo que
permitirá a Docker crear un nuevo vSwitch y conectarlo al adaptador de red host
sin problema. Antes de elegir este enfoque, asegúrese de que el vSwitch fuera de
banda no está siendo utilizado por otros servicios (por ejemplo, Hyper-V).
Como alternativa, si decide usar un vSwitch externo que se creó fuera de banda,
reinicie los servicios docker y HNS para que el conmutador sea visible para Docker.

PS C:\> restart-service hns


PS C:\> restart-service docker

Otra opción es usar la opción "-o com.docker.network.windowsshim.interface" para


enlazar el vSwitch externo de la red transparente a un adaptador de red específico
que aún no está en uso en el host de contenedor (es decir, un adaptador de red
distinto del que usa el vSwitch que se creó fuera de banda). La opción "-o" se
describe más adelante en la sección Creación de varias redes transparentes en un
único host de contenedor de este documento.

Entornos de trabajo de Windows Server 2016


Aunque seguimos agregando nuevas características e impulsamos el desarrollo, algunas
de estas características no se migrarán a plataformas anteriores. En su lugar, el mejor
plan de acción es "ponerse en el tren" para las actualizaciones más recientes de
Windows 10 y Windows Server. En la sección siguiente se enumeran algunas soluciones
alternativas y advertencias que se aplican a Windows Server 2016 y versiones anteriores
de Windows 10 (es decir, antes de 1704 Creators Update)

Varias redes NAT en el host de contenedor WS2016


Las particiones de las nuevas redes NAT deben crearse en el prefijo de red NAT interno
más grande. El prefijo se puede encontrar ejecutando el siguiente comando desde
PowerShell y haciendo referencia al campo "InternalIPInterfaceAddressPrefix".
PS C:\> Get-NetNAT

Por ejemplo, el prefijo interno de red NAT del host podría ser 172.16.0.0/16. En este
caso, Docker se puede usar para crear redes NAT adicionales siempre que sean un
subconjunto del prefijo 172.16.0.0/16. Por ejemplo, se podrían crear dos redes NAT con
los prefijos IP 172.16.1.0/24 (puerta de enlace, 172.16.1.1) y 172.16.2.0/24 (puerta de
enlace, 172.16.2.1).

C:\> docker network create -d nat --subnet=172.16.1.0/24 --


gateway=172.16.1.1 CustomNat1
C:\> docker network create -d nat --subnet=172.16.2.0/24 --
gateway=172.16.1.1 CustomNat2

Las redes recién creadas se pueden enumerar mediante:

C:\> docker network ls

Docker Compose
Docker Compose se puede usar para definir y configurar redes de contenedor junto
con los contenedores o servicios que usarán esas redes. La clave "networks" de
Compose se usa como clave de nivel superior para definir las redes a las que se
conectarán los contenedores. Por ejemplo, la sintaxis siguiente define la red NAT
preexistente creada por Docker para que sea la red "predeterminada" para todos los
contenedores o servicios definidos en un archivo compose determinado.

networks:
default:
external:
name: "nat"

Del mismo modo, se puede usar la sintaxis siguiente para definir una red NAT
personalizada.

Nota: La "red NAT personalizada" definida en el ejemplo siguiente se define como


una partición del prefijo interno NAT existente del host de contenedor. Consulte la
sección anterior, "Varias redes NAT", para obtener más contexto.

networks:
default:
driver: nat
ipam:
driver: default
config:
- subnet: 172.16.3.0/24

Para obtener más información sobre cómo definir o configurar redes de contenedor
mediante Docker Compose, consulte la referencia de archivo de Compose.
Introducción a Container Storage
Artículo • 05/02/2025

En este tema se proporciona información general sobre las distintas formas en que los
contenedores usan el almacenamiento en Windows. Los contenedores se comportan de
forma diferente a las máquinas virtuales en lo que respecta al almacenamiento. Por
naturaleza, los contenedores están construidos para evitar que una aplicación que se
ejecute dentro de ellos registre el estado en todo el sistema de archivos del host. Los
contenedores usan un espacio "temporal" de manera predeterminada, pero Windows
también proporciona un medio para conservar el almacenamiento.

Espacio temporal
Los contenedores de Windows usan de forma predeterminada almacenamiento efímero.
Toda la E/S del contenedor se produce en un "espacio temporal" y cada contenedor
obtiene su propio espacio temporal. La creación de archivos y las escrituras de archivos
se registran en el espacio de temporal y no llegan al host. Cuando se detiene una
instancia de contenedor, se eliminan todos los cambios que se hayan producido en el
espacio temporal. Cuando se inicia una nueva instancia de contenedor, se le
proporciona un nuevo espacio de trabajo temporal.

Almacenamiento de capas
Como se describe en la información general de contenedores de , las imágenes de
contenedor son un conjunto de archivos expresados como una serie de capas. El
almacenamiento de capas es todos los archivos integrados en el contenedor. Cada vez
que docker pull , se aplica a docker run ese contenedor, es lo mismo.

Dónde se almacenan las capas y cómo cambiarla


En una instalación predeterminada, las capas se almacenan en C:\ProgramData\docker y
se dividen entre los directorios "image" y "windowsfilter". Puede cambiar dónde se
almacenan las capas mediante la configuración de docker-root , como se muestra en la
documentación del motor de Docker de en Windows.

7 Nota
Solo se admite NTFS para el almacenamiento de capas. No se admiten ReFS y
volúmenes compartidos del clúster (CSV).

No debe modificar ningún archivo de los directorios de capa; se administran


cuidadosamente mediante comandos como:

docker images
docker rmi
docker pull
docker load
docker save

Operaciones admitidas en el almacenamiento en capas


Los contenedores en ejecución pueden utilizar la mayoría de las operaciones NTFS con
la excepción de las transacciones. Esto incluye la configuración de ACL y todas las ACL
se comprueban dentro del contenedor. Si desea ejecutar procesos como varios usuarios
dentro de un contenedor, puede crear usuarios en el Dockerfile con RUN net user
/create ... , establecer ACL de archivo y, a continuación, configurar procesos para que

se ejecuten con ese usuario mediante la directiva USER de Dockerfile .

Almacenamiento persistente
Los contenedores de Windows admiten mecanismos para proporcionar almacenamiento
persistente mediante montajes de enlace y volúmenes. Para más información, consulte
Almacenamiento Persistente en Contenedores.

Límites de almacenamiento
Un patrón común para las aplicaciones de Windows es consultar la cantidad de espacio
libre en disco antes de instalar o crear nuevos archivos o como desencadenador para
limpiar archivos temporales. Con el objetivo de maximizar la compatibilidad de
aplicaciones, la unidad C: en un contenedor de Windows representa un tamaño libre
virtual de 20 GB.

Es posible que algunos usuarios quieran invalidar este valor predeterminado y


configurar el espacio libre en un valor menor o mayor. Esto se puede lograr con la
opción "size" dentro de la configuración "storage-opt".

Ejemplo
Línea de comandos: docker run --storage-opt "size=50GB"
mcr.microsoft.com/windows/servercore:ltsc2019 cmd

O bien, puede cambiar el archivo de configuración de Docker directamente:

Docker

"storage-opts": [
"size=50GB"
]

 Sugerencia

Este método también funciona para la compilación de Docker. Consulte el


documento configuración de docker para obtener más información sobre cómo
modificar el archivo de configuración de Docker.

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Almacenamiento persistente en
contenedores
Artículo • 23/01/2025

Puede haber casos en los que sea importante que una aplicación pueda conservar los
datos en un contenedor o en los que quieras mostrar los archivos en un contenedor que
no se incluyeron en el tiempo de compilación del contenedor. El almacenamiento
persistente se puede proporcionar a los contenedores de un par de maneras:

Enlazar montajes
Volúmenes con nombre

Docker tiene una excelente introducción de cómo usar volúmenes por lo que es mejor
leerla primero. El resto de esta página se centra en las diferencias entre Linux y Windows
y proporciona ejemplos en Windows.

Enlazar montajes
Enlazar montajes permite que un contenedor comparta un directorio con el host. Esto
es útil si quieres un lugar para almacenar archivos en la máquina local que están
disponibles si reinicias un contenedor o quieres compartirlos con varios contenedores.
Si quieres que el contenedor se ejecute en varias máquinas con acceso a los mismos
archivos, debe usarse en su lugar un volumen con nombre o el montaje SMB.

7 Nota

No se admite el montaje de enlace directamente en volúmenes compartidos de


clúster (CSV), las máquinas virtuales que funcionan como host de contenedores se
pueden ejecutar en un volumen CSV.

Permisos
El modelo de permiso utilizado para enlazar montajes varía según el nivel de
aislamiento de tu contenedor.

Los contenedores que usan el aislamiento de Hyper-V utilizan un modelo simple de


permisos de solo lectura o de lectura y escritura. Se acceden a los archivos en el host
mediante la cuenta LocalSystem . Si obtienes acceso denegado en el contenedor,
asegúrate de que LocalSystem tenga acceso a ese directorio en el host. Cuando se usa
la marca de solo lectura, los cambios realizados en el volumen dentro del contenedor no
se mostrarán ni permanecerán en el directorio del host.

Los contenedores de Windows con aislamiento de procesos son ligeramente diferentes,


ya que usan la identidad del proceso dentro del contenedor para acceder a datos, lo
que significa que se aceptan las ACL de archivos. La identidad del proceso que se
ejecuta en el contenedor ("ContainerAdministrator" en Windows Server Core y
"ContainerUser" en contenedores de Nano Server, de manera predeterminada) se
utilizará para tener acceso a los archivos y directorios en el volumen montado en lugar
de LocalSystem y necesitará tener acceso para usar los datos.

Dado que estas identidades solo existen en el contexto del contenedor, no en el host
donde se almacenan los archivos, debes usar un grupo de seguridad conocido, como
Authenticated Users al configurar las ACL para tener acceso a los contenedores.

2 Advertencia

No unas mediante enlace directorios confidenciales, como por ejemplo, C:\ en un


contenedor que no es de confianza. Esto le permitiría cambiar archivos en el host al
que normalmente no tendría acceso y podría crear una infracción de seguridad.

Ejemplo de uso:

docker run -v c:\ContainerData:c:\data:RO para acceso de solo lectura


docker run -v c:\ContainerData:c:\data:RW para acceso de lectura y escritura

docker run -v c:\ContainerData:c:\data para acceso de lectura y escritura (opción

predeterminada)

Symlinks
Symlinks se resuelven en el contenedor. Si unes mediante enlace una ruta de acceso de
host a un contenedor que es un symlink o incluye symlinks: el contenedor no podrá
tener acceso a ellos.

Montajes de SMB
En Windows Server, versión 1709 y posteriores, una característica denominada
"Asignación global de SMB" hace posible montar un recurso compartido de SMB en el
host y luego pasar los directorios del recurso compartido a un contenedor. El
contenedor no debe configurarse con un servidor, recurso compartido, nombre de
usuario o contraseña en concreto: todo se administra en el host en su lugar. El
contenedor funcionará de la misma forma que si tuviera el almacenamiento local.

Pasos de configuración

1. En el host de contenedor, asigna globalmente el recurso compartido SMB remoto:

$creds = Get-Credential
New-SmbGlobalMapping -RemotePath \\contosofileserver\share1 -Credential
$creds -LocalPath G:

Este comando usará las credenciales para autenticarse en el servidor SMB remoto.
Después asigna la ruta de acceso de recurso compartido remoto a la letra de
unidad G: (puede ser cualquier otra letra de unidad disponible). Los contenedores
creados en este host del contenedor ahora pueden tener sus volúmenes de datos
asignados a una ruta de acceso en la unidad G:.

7 Nota

Al usar la asignación global de SMB para contenedores, todos los usuarios en


el host del contenedor pueden acceder al recurso compartido remoto.
Cualquier aplicación que se ejecuta en el host del contenedor también tendrá
acceso al recurso compartido remoto asignado.

2. Cree contenedores con volúmenes de datos asignados a Docker de recurso


compartido de SMB montado globalmente. Ejecute -it --name demo -v
g:\ContainerData:c:\AppData1 mcr.microsoft.com/windows/servercore:ltsc2019
cmd.exe.

Dentro del contenedor, c:\AppData1 se asignará al directorio "ContainerData" del


recurso compartido remoto. Todos los datos almacenados en el recurso
compartido remoto asignado globalmente estarán disponibles para aplicaciones
dentro del contenedor. Varios contenedores pueden obtener acceso de lectura y
escritura a estos datos compartidos con el mismo comando.

Esta compatibilidad de asignación global de SMB es una característica de cliente de


SMB que puede funcionar en la parte superior de cualquier servidor SMB compatible,
entre los que se incluyen:
Servidor de archivos de escalabilidad horizontal en la parte superior de Storage
Spaces Direct (S2D) o una SAN tradicional
Azure Files (recurso compartido de SMB)
Servidor de archivos tradicional
Implementación de terceros del protocolo SMB (ejemplo: dispositivos NAS)

7 Nota

La asignación global de SMB no admite carpetas de espacios de nombres DFS


(DFSN). Por ejemplo, si asigna un recurso compartido raíz DFSN con New-
SmbGlobalMapping -LocalPath Z: -RemotePath \\contoso.com\share1' , al leer los

destinos de carpeta de la raíz se devolverá el error "No se puede acceder a la


ubicación de red".

Volúmenes con nombre


Los volúmenes con nombre te permiten crear un volumen según el nombre, asignarle a
un contenedor y reutilizarlo más adelante con el mismo nombre. No tienes que realizar
un seguimiento de la ruta de acceso real de dónde se creó, solo el nombre. Docker
Engine en Windows tiene un complemento de volumen con nombre integrado que
puede crear volúmenes en la máquina local. Un complemento adicional es necesario si
quieres usar volúmenes con nombre en varias máquinas.

Pasos de ejemplo:

1. docker volume create unwound : Crear un volumen denominado "unwound"


2. docker run -v unwound:c:\data microsoft/windowsservercore : Iniciar un
contenedor con el volumen asignado a c:\data.
3. Escribir algunos archivos en c:\data en el contenedor y luego detener el
contenedor
4. docker run -v unwound:c:\data microsoft/windowsservercore : Iniciar un nuevo
contenedor
5. Ejecutar dir c:\data en el contenedor nuevo: los archivos siguen estando ahí

7 Nota

Windows Server convertirá los nombres de las rutas de acceso de destino (la ruta
de acceso dentro del contenedor) en minúsculas; es decir, -v unwound:c:\MyData , o
-v unwound:/app/MyData en contenedores de Linux, hará que se asigne (y se cree si
no existe) un directorio dentro del contenedor de c:\mydata , o /app/mydata en
contenedores de Linux.

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Dispositivos en contenedores en
Windows
Artículo • 05/02/2025

De forma predeterminada, los contenedores de Windows tienen acceso mínimo a los


dispositivos host, al igual que los contenedores de Linux. Hay ciertas cargas de trabajo
en las que es beneficioso, o incluso imperativo, tener acceso y comunicarse con
dispositivos de hardware host. En esta guía se tratan los dispositivos que se admiten en
contenedores y cómo empezar.

Prerrequisitos
Para que esta característica funcione, el entorno debe cumplir los siguientes requisitos:

El host de contenedor debe ejecutar Windows Server 2019 o Windows 10, versión
1809 o posterior.
La versión de la imagen base del contenedor debe ser 1809 o posterior.
Los contenedores deben ser contenedores de Windows que se ejecutan en modo
aislado del proceso.
El host de contenedor debe ejecutar Docker Engine 19.03 o posterior.

Ejecución de un contenedor con un dispositivo


Para iniciar un contenedor con un dispositivo, use el siguiente comando:

shell

docker run --isolation=process --device="class/{interface class GUID}"


mcr.microsoft.com/windows/servercore:1809

Debe reemplazar {interface class guid} por un GUID de clase de interfaz de


dispositivo adecuado, que se puede encontrar en la sección siguiente.

Para iniciar un contenedor con varios dispositivos, use el siguiente comando y encadene
varios argumentos de --device .

shell

docker run --isolation=process --device="class/{interface class GUID}" --


device="class/{interface class GUID}"
mcr.microsoft.com/windows/servercore:1809

En Windows, todos los dispositivos declaran una lista de clases de interfaz que
implementan. Al pasar este comando a Docker, se asegurará de que todos los
dispositivos que se identifiquen como implementando la clase solicitada se integrarán
en el contenedor.

Esto significa que no va a asignar el dispositivo fuera del host. En su lugar, el anfitrión lo
comparte con el contenedor. Del mismo modo, dado que va a especificar un GUID de
clase, todos los dispositivos que implementan ese GUID se compartirán con el
contenedor.

Qué dispositivos son compatibles


Actualmente se admiten los siguientes dispositivos (y sus GUID de clase de interfaz de
dispositivo):

ノ Expandir tabla

Tipo de dispositivo GUID de clase de interfaz

GPIO 916EF1CB-8426-468D-A6F7-9AE8076881B3

Bus I2C A11EE3C6-8421-4202-A3E7-B91FF90188E4

Puerto COM 86E0D1E0-8089-11D0-9CE4-08003E301F73

Bus SPI DCDE6AF9-6610-4285-828F-CAAF78C424CC

Aceleración de DirectX por GPU Vea la documentación sobre aceleración de la GPU

) Importante

La compatibilidad con dispositivos depende del controlador. Intentar pasar los


GUIDs de clase no definidos en la tabla anterior puede dar lugar a un
comportamiento indefinido.

Compatibilidad con contenedores de Windows


aislados de Hyper-V
Actualmente no se admite la asignación de dispositivos y el uso compartido de
dispositivos para cargas de trabajo en contenedores de Windows aislados de Hyper-V.
Compatibilidad con contenedores Linux
aislados por Hyper-V
Actualmente no se admite la asignación de dispositivos y el uso compartido de
dispositivos para cargas de trabajo en contenedores de Linux aislados de Hyper-V.

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Aceleración de GPU en contenedores de
Windows
Artículo • 05/02/2025

Para muchas cargas de trabajo en contenedor, los recursos de proceso de CPU


proporcionan un rendimiento suficiente. Sin embargo, para una determinada clase de
carga de trabajo, la potencia de proceso paralela masiva que ofrecen las GPU (unidades
de procesamiento de gráficos) puede acelerar las operaciones por órdenes de
magnitud, lo que reduce el costo y mejora enormemente el rendimiento.

Las GPU ya son una herramienta común para muchas cargas de trabajo populares,
desde la representación tradicional y la simulación hasta el entrenamiento e inferencia
del aprendizaje automático. Los contenedores de Windows admiten la aceleración de
GPU para DirectX y todos los marcos basados en él.

7 Nota

Esta característica está disponible en Docker Desktop, versión 2.1 y Motor de


Docker: Enterprise, versión 19.03 o posterior.

Prerrequisitos
Para que esta característica funcione, el entorno debe cumplir los siguientes requisitos:

El host de contenedor debe ejecutar Windows Server 2019 o Windows 10, versión
1809 o posterior.
La imagen base del contenedor debe ser mcr.microsoft.com/windows:1809 o
posterior. Actualmente no se admiten imágenes de contenedor de Windows Server
Core y Nano Server.
El host de contenedor debe ejecutar Docker Engine 19.03 o posterior.
El host de contenedor debe tener una GPU que ejecute controladores de pantalla
versión WDDM 2.5 o posterior.

Para comprobar la versión de WDDM de los controladores de pantalla, ejecute directX


Diagnostic Tool (dxdiag.exe) en el host del contenedor. En la pestaña "Pantalla" de la
herramienta, busque en la sección "Controladores" como se indica a continuación.
Ejecución de un contenedor con aceleración de
GPU
Para iniciar un contenedor con aceleración de GPU, ejecute el siguiente comando:

shell

docker run --isolation process --device class/5B45201D-F2F2-4F3B-85BB-


30FF1F953599 mcr.microsoft.com/windows:1809

) Importante

DirectX (y todos los marcos basados en él) son las únicas API que se pueden
acelerar con una GPU en la actualidad. No se admiten marcos de terceros.

Compatibilidad con contenedores de Windows


con aislamiento de Hyper-V
Actualmente no se admite la aceleración de GPU para cargas de trabajo en
contenedores de Windows aislados de Hyper-V.

Compatibilidad con contenedores de Linux con


aislamiento de Hyper-V
Actualmente no se admite la aceleración de GPU para cargas de trabajo en
contenedores de Linux aislados de Hyper-V.

Más información
Para obtener un ejemplo completo de una aplicación DirectX en contenedor que
aprovecha la aceleración de GPU, consulte ejemplo de contenedor de DirectX .

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Optimización antivirus para
contenedores de Windows
Artículo • 15/06/2023

La información de esta página se aplica a:

Windows 10, versiones 1607 y posteriores


Windows Server 2016 y versiones posteriores
Productos antivirus (AV) que se ejecutan en el host

En este tema se describen las optimizaciones que los productos av pueden usar para
evitar el examen redundante de los archivos de contenedor de Windows y ayudar a
mejorar el tiempo de inicio del contenedor.

Información general sobre contenedores


La característica Contenedor de Windows está diseñada para simplificar la distribución y
la implementación de aplicaciones. Para obtener más información, consulte la
introducción a los contenedores de Windows.

Los contenedores se construyen a partir de cualquier número de capas de paquete. El


paquete del sistema operativo base de Windows forma la primera capa.

Cada contenedor tiene un volumen aislado que representa el volumen del sistema en
ese contenedor. Un filtro de aislamiento de contenedor (wcifs.sys) proporciona una
superposición virtual de capas de paquete en este volumen de contenedor. La
superposición se logra mediante marcadores de posición (puntos de reanálisis). El
volumen se inicializa con marcadores de posición antes de que el contenedor acceda
primero a la ruta de acceso superpuesta. Las lecturas de los archivos de marcador de
posición se dirigen al archivo del paquete de respaldo. De este modo, varios volúmenes
de contenedor pueden acceder al mismo flujo de datos del archivo de paquete
subyacente.

Si un contenedor modifica un archivo, el filtro de aislamiento realiza la copia en escritura


y reemplaza el marcador de posición por el contenido del archivo de paquete. Esto
interrumpe la "vinculación" con el archivo de paquete para ese contenedor
determinado.

Redireccionamiento de lectura
El filtro de aislamiento redirige las lecturas de un archivo de marcador de posición a la
capa de paquete adecuada. El redireccionamiento se realiza en el nivel del filtro. Dado
que el filtro está debajo del intervalo de AV, los filtros av no verán el redireccionamiento
de lectura. AV tampoco verá las aperturas de los archivos de paquete realizados para
configurar el redireccionamiento.

Un filtro AV tiene una vista completa de todas las operaciones en el volumen del
sistema de contenedor. Ve las operaciones en los archivos de marcador de posición, así
como en las modificaciones del archivo o en las nuevas adiciones de archivos.

Problema de examen redundante


Es probable que haya muchos contenedores en función de las mismas capas de
paquete. El mismo flujo de datos de un archivo de paquete determinado proporcionará
los datos para los marcadores de posición en varios volúmenes del sistema de
contenedor. Como resultado, existe la posibilidad de realizar exámenes de AV
redundantes de los mismos datos en cada contenedor. Esto tiene un impacto negativo
innecesario en el rendimiento de los contenedores. Se trata de un costo significativo
dado que se espera que los contenedores se inicien rápidamente y que pueden ser de
corta duración.

Enfoque recomendado
Para evitar el examen redundante en contenedores, se recomienda que un producto av
modifique su comportamiento, como se describe a continuación. Es el producto av para
determinar el beneficio de riesgo y recompensa a sus clientes para este enfoque. Para
obtener más información sobre esto, consulte la sección Ventajas y riesgos en la parte
inferior de esta página.

1. Instalación del paquete


Durante la instalación del paquete, las herramientas de administración diseñarán
archivos en el paquete bajo la raíz de la capa. El filtro av debe continuar examinando los
archivos a medida que se colocan en la raíz del paquete y normalmente lo haría. Esto
garantiza que todos los archivos de las capas estén inicialmente limpios con respecto al
malware.

2. Inicio y ejecución del contenedor


Para el examen en tiempo real de un volumen de contenedor, los VV deben examinarse
de forma que evite la redundancia. Los archivos de marcador de posición necesitan
tener en cuenta especial. Los archivos modificados por el contenedor o los nuevos
archivos creados en el contenedor no se redirigen, por lo que el examen redundante no
es un problema.

Para evitar exámenes redundantes, el filtro AV primero debe identificar volúmenes de


contenedor y marcadores de posición en esos volúmenes. Por varias razones, no hay
ninguna manera directa de que un filtro av consulte si un volumen es un volumen de
contenedor o si un archivo determinado es un archivo de marcador de posición. El filtro
de aislamiento oculta el punto de reanálisis del marcador de posición por motivos de
compatibilidad de aplicaciones (algunas aplicaciones no se comportan correctamente si
reconocen que están accediendo a puntos de reanálisis). Además, un volumen es solo
un volumen de contenedor mientras se ejecuta un contenedor. El contenedor se puede
detener y el volumen puede permanecer remontado. En su lugar, en la creación previa,
el filtro av debe consultar el objeto de archivo para determinar si se abre en el contexto
de un contenedor. A continuación, puede adjuntar y ECP a la creación y recibir el estado
del marcador de posición al finalizar la creación.

Los siguientes cambios son necesarios en el producto av:

Durante la creación previa en un volumen de contenedor, adjunte un ECP a


Create CallbackData que recibirá la información del marcador de posición. Estas
creaciones se pueden identificar consultando los parámetros SILO desde el objeto
fileobject mediante IoGetSiloParameters. Tenga en cuenta que el filtro debe
especificar el tamaño en la estructura WCIFS_REDIRECTION_ECP_CONTEXT . Todos
los demás campos son campos out establecidos si se confirma el ECP.

En la creación posterior, si se confirma el ECP, examine las marcas de


redireccionamiento de ECP. Las marcas indicarán si se ha realizado el servicio
abierto desde la capa de paquete o desde la raíz temporal (archivos nuevos o
modificados). Las marcas también indicarán si la capa de paquete está registrada y
si es remota.

En el caso de las aperturas que se aparecen desde una capa remota, AV debe
omitir el examen del archivo. Esto se indica mediante las marcas de
redireccionamiento: WCIFS_REDIRECTION_FLAGS_CREATE_SERVICED_FROM_LAYER &&
WCIFS_REDIRECTION_FLAGS_CREATE_SERVICED_FROM_REMOTE_LAYER

Se puede suponer que las capas remotas se han examinado en el host remoto.
Los paquetes de contenedor de Hyper-V son remotos a la máquina virtual de la
utilidad que hospeda el contenedor. Esos paquetes se examinarán normalmente
en el host de Hyper-V cuando la máquina virtual de la utilidad acceda a ellos a
través del bucle de bucle SMB.

Dado que VolumeGUID y FileId no se aplican a través de remote, estos campos


no se establecerán.

En el caso de las aperturas que se aparecen desde una capa registrada, AV debe
omitir el examen del archivo. Esto se indica mediante las marcas de
redireccionamiento: WCIFS_REDIRECTION_FLAGS_CREATE_SERVICED_FROM_LAYER &&
WCIFS_REDIRECTION_FLAGS_CREATE_SERVICED_FROM_REGISTERED_LAYER

La capa registrada se debe examinar de forma asincrónica durante la instalación


del paquete y después de la actualización de la firma.

7 Nota

Es posible que el sistema no identifique las capas registradas en el futuro.


En este caso, los archivos de capa local deben identificarse individualmente
como se describe en la última viñeta.

Para las aperturas que se proporcionan desde una capa de paquete local, AV
debe usar volumeGUID y FileId proporcionados del archivo de capa para
determinar si el archivo debe examinarse. Esto probablemente requerirá av para
compilar una memoria caché de archivos examinados indexados por guid de
volumen y FileId. Esto se indica mediante la marca de redireccionamiento:
WCIFS_REDIRECTION_FLAGS_CREATE_SERVICED_FROM_LAYER

En el caso de los archivos nuevos o modificados en la ubicación temporal, el


producto av debe examinar los archivos y realizar su corrección normal. Esto se
indica mediante la marca de redireccionamiento:
WCIFS_REDIRECTION_FLAGS_CREATE_SERVICED_FROM_SCRATCH

Dado que no hay ningún archivo de capa en este caso, No se establecerá


VolumeGUID ni FileId.

No guarde "este archivo se envía desde la capa" como marcador permanente


en su contexto de flujo. Un archivo que se abastezó inicialmente desde la raíz
de la capa se puede modificar después de la creación. En este caso, una
creación posterior para el mismo archivo puede indicar que se está realizando el
servicio de creación desde el volumen del contenedor. El filtro av debe
comprender que esto puede ocurrir.
No use la clave del Registro
LayerRootLocations.
En el pasado, se recomienda usar la clave del LayerRootLocations Registro para obtener
la ubicación de la imagen base. Los productos av ya no deben usar esta clave del
Registro. En su lugar, use el enfoque recomendado en este tema para evitar el examen
redundante.

La ubicación del Registro que se había usado para registrar las capas de paquete:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows

NT\CurrentVersion\Virtualization\LayerRootLocations

Ventajas y riesgos
Tenga en cuenta las siguientes ventajas y riesgos para usar estas nuevas optimizaciones
para los productos av.

Ventajas
No afecta al inicio o tiempo de ejecución del contenedor (incluso para el primer
contenedor).
Evita el examen del mismo contenido en varios contenedores.
Funciona para contenedores de Windows Server. Para el contenedor de Hyper-V,
esto funciona para los paquetes, pero requiere trabajo adicional para ejecutar el
contenedor.

Riesgos
Si se inicia un contenedor en el tiempo entre la actualización de firma y el siguiente
examen antimalware proactivo programado, los archivos ejecutados en el contenedor
no se examinan con respecto a las firmas antimalware más recientes. Para mitigar este
riesgo, el producto av podría omitir los exámenes de los archivos redirigidos solo si no
ha habido una actualización de firma desde el último examen proactivo. Esto limitaría la
degradación del rendimiento del contenedor hasta que se complete un examen
proactivo con las firmas más recientes. Opcionalmente, el producto av puede
desencadenar un examen proactivo en esta situación para que los lanzamientos
posteriores de contenedores sean más eficaces.
Herramientas de plataforma de
contenedor en Windows
Artículo • 05/02/2025

La plataforma de contenedor de Windows se está expandiendo. Docker fue la primera


parte del recorrido del contenedor, ahora estamos creando otras herramientas de
plataforma de contenedor.

containerd/cri : novedad en Windows Server 2019 y Windows 10 1809.


runhcs : un host de contenedores de Windows equivalente a runc.
hcs: el Servicio de proceso de host y adaptadores útiles para facilitar el uso.
hcsshim
dotnet-computevirtualization

En este artículo se habla de la plataforma de contenedor Windows y Linux, así como de


cada herramienta de plataforma de contenedor.

Plataforma de contenedor de Windows y Linux


En entornos de Linux, las herramientas de administración de contenedores como Docker
se basan en un conjunto más granular de herramientas de contenedor: runc y
containerd .
arquitectura de Docker en Linux

runc es una herramienta de línea de comandos de Linux para crear y ejecutar

contenedores según la especificación de tiempo de ejecución del contenedor de OCI de


.

containerd es un demonio que administra el ciclo de vida del contenedor desde la

descarga y el desempaquetado de la imagen de contenedor a su ejecución y


supervisión.

En Windows, hemos tomado un enfoque diferente. Cuando empezamos a trabajar con


Docker para admitir contenedores de Windows, nos basamos directamente en el HCS
(Servicio de proceso de host). Esta entrada de blog está llena de información sobre
por qué creamos hcS y por qué tomamos este enfoque para los contenedores
inicialmente.
En este momento, Docker todavía llama directamente a HCS. Sin embargo, en el futuro,
las herramientas de administración de contenedores se expandirán para incluir
contenedores de Windows y el host de contenedor de Windows, y podrían llamar a
containerd y runhcs de la misma manera que llaman a containerd y runc en Linux.

runhcs
runhcs es una bifurcación de runc . Al igual que runc , runhcs es un cliente de línea de

comandos para ejecutar aplicaciones empaquetadas según el formato Open Container


Initiative (OCI) y es una implementación compatible de la especificación Open Container
Initiative.

Las diferencias funcionales entre runc y runhcs incluyen:

runhcs se ejecuta en Windows. Se comunica con el HCS para crear y administrar

contenedores.

runhcs puede ejecutar una variedad de tipos de contenedor diferentes.

Aislamiento de Hyper-V de Windows y Linux


Contenedores de procesos de Windows (la imagen de contenedor debe
coincidir con el host del contenedor)

Uso:
Símbolo del sistema de Windows

runhcs run [ -b bundle ] <container-id>

<container-id> es el nombre de la instancia de contenedor que va a iniciar. El nombre

debe ser único en el host del contenedor.

El directorio de paquete (con -b bundle ) es opcional. Al igual que con runc, los
contenedores se configuran mediante agrupaciones. El paquete de un contenedor es el
directorio con el archivo de especificación OCI del contenedor, "config.json". El valor
predeterminado de "bundle" es el directorio actual.

El archivo de especificación OCI, "config.json", tiene que tener dos campos para
ejecutarse correctamente:

Ruta de acceso al espacio temporal del contenedor


Ruta de acceso al directorio de capa del contenedor

Los comandos de contenedor disponibles en runhcs incluyen:

Herramientas para crear y ejecutar un contenedor


run crea y ejecuta un contenedor
create crea un contenedor

Herramientas para administrar procesos que se ejecutan en un contenedor:


iniciar ejecuta el proceso definido por el usuario en un contenedor creado
exec ejecuta un nuevo proceso dentro del contenedor
pause suspende todos los procesos dentro del contenedor
reanudar reanuda todos los procesos que fueron pausados anteriormente
ps ps muestra los procesos que se ejecutan dentro de un contenedor

Herramientas para administrar el estado de un contenedor


estado muestra el estado de un contenedor
kill envía la señal especificada (valor predeterminado: SIGTERM) al proceso de
inicialización del contenedor
delete elimina los recursos mantenidos por el contenedor que a menudo se
usan con el contenedor desasociado

El único comando que se podría considerar multicontenedor es list. Enumera los


contenedores en ejecución o en pausa iniciados por runhcs con la raíz especificada.

HCS
Tenemos dos contenedores disponibles en GitHub para interactuar con HCS. Dado que
HCS es una API de C, los contenedores facilitan la llamada a HCS desde lenguajes de
nivel superior.

hcsshim - HCSShim está escrito en Go y es la base para runhcs. Toma la versión


más reciente de AppVeyor o céntela tú mismo.
dotnet-computevirtualization : es un contenedor de C# para HCS.

Si desea usar el HCS (ya sea directamente o a través de un contenedor), o desea hacer
un contenedor Rust/Haskell/InsertYourLanguage alrededor del HCS, deje un comentario.

Para un análisis más profundo de HCS, vea Presentación de DockerCon de John Stark .

containerd/cri

) Importante

La compatibilidad con CRI solo está disponible en Windows Server 2019/Windows


10 1809 y versiones posteriores.

Aunque las especificaciones de OCI definen un único contenedor, CRI (interfaz en


tiempo de ejecución de contenedor) describe los contenedores como cargas de trabajo
en un espacio compartido llamado pod. Los pods pueden contener una o más cargas de
trabajo de contenedor. Los pods permiten a los orquestadores de contenedores, como
Kubernetes y Service Fabric Mesh, controlar las cargas de trabajo agrupadas que deben
estar en el mismo host con algunos recursos compartidos, como memoria y vNET.

Aunque runHCS y containerd pueden administrarse en cualquier sistema Windows


Server 2016 o posterior, el soporte de Pods (grupos de contenedores) requirió cambios
significativos en las herramientas de contenedores en Windows. La compatibilidad con
CRI está disponible en Windows Server 2019/Windows 10 1809 y versiones posteriores.

Comentarios
¿Le ha resultado útil esta página?  Sí  No
LICENCIA COMPLEMENTARIA DE
SOFTWARE DE MICROSOFT PARA LA
IMAGEN BASE DE CONTENEDOR DE
WINDOWS
Artículo • 23/01/2025

Esta licencia complementaria es para la imagen base de contenedor de Windows


("Imagen de contenedor"). Si cumple los términos de esta licencia complementaria,
puede usar la imagen de contenedor como se describe a continuación.

IMAGEN SE SISTEMA OPERATIVO DE


CONTENEDOR
La imagen de contenedor solo se puede usar con una copia con licencia válida de:

Software windows Server Standard o Windows Server Datacenter (colectivamente


"Software de host de servidor") o software del sistema operativo Microsoft Windows
(versión 10) ("Software de host de cliente") o Windows 10 IoT Enterprise y Windows 10
IoT Core (colectivamente "Software de host de IoT"). El software host de servidor, el
software de host de cliente y el software de host de IoT se conocen colectivamente
como "software de host" y una licencia para el software host es una "licencia de host".

Es posible que no use la imagen de contenedor si no tiene una versión y edición


correspondientes de la licencia de host. Se pueden aplicar ciertas restricciones y
términos adicionales, que se describen en este documento. Si los términos de licencia
entran en conflicto con la licencia de host, esta licencia complementaria rige con
respecto a la imagen de contenedor. AL ACEPTAR ESTA LICENCIA COMPLEMENTARIA O
USAR LA IMAGEN DE CONTENEDOR, ACEPTA TODOS ESTOS TÉRMINOS. SI NO ACEPTA
NI CUMPLE ESTOS TÉRMINOS, ES POSIBLE QUE NO USE LA IMAGEN DE CONTENEDOR.

DEFINICIONES
Contenedor de Windows Server (sin aislamiento de Hyper-V) es una característica del
software de Microsoft Windows Server.

Contenedor de Windows Server con aislamiento de Hyper-V. La sección 2(k) de los


términos de licencia de Microsoft Windows Server se elimina en su totalidad y se
reemplaza por los términos revisados como se muestra en "ACTUALIZADO" a
continuación.

ACTUALIZADO: Contenedor de Windows Server con aislamiento de Hyper-V


(anteriormente conocido como contenedor de Hyper-V) es una tecnología de
contenedor en Windows Server que utiliza un entorno de sistema operativo virtual para
hospedar uno o varios contenedores de Windows Server. Cada instancia de aislamiento
de Hyper-V que se usa para hospedar uno o varios contenedores de Windows Server se
considera un entorno de sistema operativo virtual.

TÉRMINOS DE LICENCIA
Licencia de host. Los términos de licencia de host se aplican al uso de la imagen de
contenedor y los contenedores de Windows creados con la imagen de contenedor que
son distintas y independientes de una máquina virtual.

Derechos de uso. La imagen de contenedor se puede usar para crear un entorno de


sistema operativo Windows virtualizado aislado al que se agrega la funcionalidad
principal y significativa ("Imagen consolidada"). Puede usar la imagen de contenedor
para crear, compilar y ejecutar la imagen consolidada en el software host y distribuir la
imagen de contenedor solo como parte de la imagen consolidada. Novedades al
software host no puede actualizar la imagen de contenedor para que pueda volver a
crear contenedores de Windows basados en una imagen de contenedor actualizada.

Restricciones. Es posible que no quite este archivo de documento de licencia


complementaria de la imagen de contenedor. Es posible que no habilite el acceso
remoto a las aplicaciones que ejecute dentro del contenedor para evitar las tarifas de
licencia aplicables. No puede realizar ingeniería inversa, descompilar o desensamblar la
imagen de contenedor, o intentar hacerlo, excepto y solo en la medida en que requieran
los términos de licencia de terceros que rigen el uso de determinados componentes de
código abierto que se pueden incluir con el software. Se pueden aplicar restricciones
adicionales en la licencia de host.

TÉRMINOS ADICIONALES
Software de host de cliente. Al ejecutar una imagen de contenedor en el software host
de cliente, puede ejecutar cualquier número de la imagen de contenedor creada como
contenedores de Windows para fines de prueba o desarrollo únicamente. Es posible que
no use estos contenedores de Windows en un entorno de producción en software host
de cliente.
Software de host de IoT. Al ejecutar una imagen de contenedor en el software host de
IoT, puede ejecutar cualquier número de la imagen de contenedor creada como
contenedores de Windows para fines de prueba o desarrollo únicamente. Solo puede
usar la imagen de contenedor en un entorno de producción si ha acordado los Términos
de uso comerciales de Microsoft para Windows 10 imágenes principales en tiempo de
ejecución o la licencia de dispositivo de Windows 10 IoT Enterprise ("Contrato comercial
de Windows IoT"). Se aplican términos y restricciones adicionales en los contratos de IoT
Windows Commercial al uso de la imagen de contenedor en un entorno de producción.

Software de terceros. La imagen de contenedor puede incluir aplicaciones de terceros


con licencia bajo esta licencia complementaria o bajo sus propios términos. Los
términos de licencia, los avisos y las confirmaciones, si existen, para las aplicaciones de
terceros pueden ser accesibles en línea o https://aka.ms/thirdpartynotices en un
archivo de avisos adjuntos. Incluso si estas aplicaciones se rigen por otros acuerdos, la
declinación de responsabilidades, limitaciones y exclusiones de daños en la licencia de
host también se aplican en la medida permitida por la ley aplicable.

Componentes de código abierto. La imagen de contenedor puede contener software


con derechos de autor de terceros con licencia de código abierto licencias con
obligaciones de disponibilidad de código fuente. Las copias de esas licencias se incluyen
en el archivo ThirdPartyNotices u otro archivo de avisos adjuntos. Puede obtener el
código fuente correspondiente completo de Microsoft si y según sea necesario en la
licencia de código abierto pertinente mediante el envío de un pedido de dinero o un
cheque de $5.00 a: Equipo de cumplimiento del código fuente, Microsoft Corporation, 1
Microsoft Way, Redmond, WA 98052, EE. UU. Incluya el nombre "Licencia
complementaria de software de Microsoft para la imagen base de contenedor de
Windows", el nombre del componente de código abierto y el número de versión en la
línea de notas del pago. También puede encontrar una copia del origen en
https://aka.ms/getsource .

Comentarios
¿Le ha resultado útil esta página?  Sí  No
Solución de problemas
Artículo • 05/02/2025

¿Tiene problemas para configurar la máquina o ejecutar un contenedor? Hemos creado


un script de PowerShell para comprobar si hay problemas comunes. Inténtelo primero
para ver lo que encuentra y compartir los resultados.

PowerShell

Invoke-WebRequest https://aka.ms/Debug-ContainerHost.ps1 -UseBasicParsing |


Invoke-Expression

En el archivo Léame del script encontrará una lista de todas las pruebas que se
ejecutan, junto con soluciones comunes.

Si eso no ayuda a encontrar el origen del problema, publique la salida del script en el
foro de contenedores . Este es el mejor lugar para obtener ayuda de la comunidad,
incluidos los desarrolladores y windows Insider.

Búsqueda de registros
Hay varios servicios que se usan para administrar contenedores de Windows. En las
secciones siguientes se muestra dónde obtener registros para cada servicio.

Registros de contenedor de Docker


El comando docker logs captura los registros de un contenedor de STDOUT/STDERR,
las ubicaciones de depósito de registros de aplicaciones estándar para las aplicaciones
Linux. Normalmente, las aplicaciones de Windows no inician sesión en STDOUT/STDERR;
en su lugar, inician sesión en ETW, registros de eventos o archivos de registro, entre
otros.

Log Monitor , una herramienta de código abierto compatible con Microsoft, ya está
disponible en github. Log Monitor puentea los registros de aplicaciones de Windows a
STDOUT/STDERR. El Monitor de registro se configura a través de un archivo de
configuración.

Uso del monitor de registro


LogMonitor.exe y LogMonitorConfig.json deben incluirse en el mismo directorio de
LogMonitor.

El Monitor de registro se puede usar en un patrón de uso de SHELL:

Output

SHELL ["C:\\LogMonitor\\LogMonitor.exe", "cmd", "/S", "/C"]


CMD c:\windows\system32\ping.exe -n 20 localhost

O un patrón de uso de ENTRYPOINT.

Output

ENTRYPOINT C:\LogMonitor\LogMonitor.exe c:\windows\system32\ping.exe -n 20


localhost

Ambos usos de ejemplo encapsulan la aplicación ping.exe. Otras aplicaciones (como


IIS.ServiceMonitor ) se pueden anidar con Log Monitor de forma similar:

Output

COPY LogMonitor.exe LogMonitorConfig.json C:\LogMonitor\


WORKDIR /LogMonitor
SHELL ["C:\\LogMonitor\\LogMonitor.exe", "powershell.exe"]

# Start IIS Remote Management and monitor IIS


ENTRYPOINT Start-Service WMSVC; `
C:\ServiceMonitor.exe w3svc;

El Monitor de registro inicia la aplicación encapsulada como un proceso secundario y


supervisa la salida STDOUT de la aplicación.

Tenga en cuenta que, en el patrón de uso de SHELL, la instrucción CMD/ENTRYPOINT


debe especificarse en el formulario SHELL y no en forma exec. Cuando se usa la forma
exec de la instrucción CMD/ENTRYPOINT, SHELL no se inicia y la herramienta Log
Monitor no se iniciará dentro del contenedor.

Puede encontrar más información de uso en la wiki de Log Monitor . Puede encontrar
archivos de configuración de ejemplo para escenarios clave de contenedor de Windows
(IIS, etc.) en el repositorio de github de . Puede encontrar contexto adicional en esta
entrada de blog .

Motor de Docker
El motor de Docker registra en el registro de eventos "Aplicación" de Windows, en lugar
de hacerlo en un archivo. Estos registros se pueden leer, ordenar y filtrar fácilmente
mediante Windows PowerShell.

Por ejemplo, esto mostrará los registros del motor de Docker de los últimos 5 minutos a
partir del más antiguo.

Output

Get-EventLog -LogName Application -Source Docker -After (Get-


Date).AddMinutes(-5) | Sort-Object Time

Esto también podría canalizarse fácilmente a un archivo CSV para que lo lea otra
herramienta o hoja de cálculo.

Output

Get-EventLog -LogName Application -Source Docker -After (Get-


Date).AddMinutes(-30) | Sort-Object Time | Export-CSV ~/last30minutes.CSV

Habilitación del registro de depuración


También puede habilitar el registro en modo de depuración en el motor de Docker. Esto
puede resultar útil para solucionar problemas si los registros normales no tienen
suficientes detalles.

En primer lugar, abra un símbolo del sistema con privilegios elevados y ejecute el
comando sc.exe qc docker para obtener la línea de comandos actual del servicio
Docker. Ejemplo:

Output

C:\> sc.exe qc docker


[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: docker
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : "C:\Program Files\Docker\dockerd.exe" --run-
service
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : Docker Engine
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem

Tome el BINARY_PATH_NAME actual y modifíquelo:

Agregar un -D al final
Aplique escape con \ a cada instancia de "
Incluya todo el comando en "

A continuación, ejecute sc.exe config docker binpath= seguido de la nueva cadena. Por
ejemplo:

Output

sc.exe config docker binpath= "\"C:\Program Files\Docker\dockerd.exe\" --


run-service -D"

Ahora, reinicie el servicio Docker.

Output

sc.exe stop docker


sc.exe start docker

Esto registrará muchos más detalles en el registro de eventos de la aplicación, por lo


que es mejor quitar la opción -D una vez que termines de solucionar problemas. Siga
los mismos pasos anteriores sin -D y reinicie el servicio para deshabilitar el registro de
depuración.

Una alternativa a lo anterior consiste en ejecutar el demonio docker en modo de


depuración desde un símbolo del sistema de PowerShell con privilegios elevados, y
capturar la salida directamente en un archivo.

PowerShell

sc.exe stop docker


<path\to\>dockerd.exe -D > daemon.log 2>&1

Obtención del volcado de pila


Por lo general, esto solo es útil si el soporte técnico de Microsoft lo solicita
explícitamente o los desarrolladores de Docker. Se puede usar para ayudar a
diagnosticar una situación en la que Docker parece haberse bloqueado.
Descargue docker-signal.exe .

Uso:

PowerShell

docker-signal --pid=$((Get-Process dockerd).Id)

El archivo de salida se ubicará en el directorio raíz de datos en el que se ejecuta docker.


El directorio predeterminado es C:\ProgramData\Docker . El directorio real se puede
confirmar ejecutando docker info -f "{{.DockerRootDir}}" .

El archivo será goroutine-stacks-<timestamp>.log .

Tenga en cuenta que goroutine-stacks*.log no contiene información personal.

Servicio de cómputo de host


El motor de Docker depende de un servicio de proceso de host específico de Windows.
Tiene registros independientes:

Microsoft-Windows-Hyper-V:Compute-Admin
Microsoft-Windows-Hyper-V:Compute-Operational

Son visibles en el Visor de eventos y también se pueden consultar con PowerShell.

Por ejemplo:

PowerShell

Get-WinEvent -LogName Microsoft-Windows-Hyper-V-Compute-Admin


Get-WinEvent -LogName Microsoft-Windows-Hyper-V-Compute-Operational

Captura de registros analíticos y de depuración de HCS


Para habilitar los registros analíticos y de depuración para el proceso de Hyper-V y
guardarlos en hcslog.evtx .

PowerShell

# Enable the analytic logs


wevtutil.exe sl Microsoft-Windows-Hyper-V-Compute-Analytic /e:true /q:true

# <reproduce your issue>


# Export to an evtx
wevtutil.exe epl Microsoft-Windows-Hyper-V-Compute-Analytic <hcslog.evtx>

# Disable
wevtutil.exe sl Microsoft-Windows-Hyper-V-Compute-Analytic /e:false /q:true

Captura del seguimiento detallado de HCS


Por lo general, estos solo son útiles si el soporte técnico de Microsoft lo solicita.

Descargar hcsTraceProfile.wprp

PowerShell

# Enable tracing
wpr.exe -start HcsTraceProfile.wprp!HcsArgon -filemode

# <reproduce your issue>

# Capture to HcsTrace.etl
wpr.exe -stop HcsTrace.etl "some description"

Proporcione HcsTrace.etl al contacto de soporte técnico.

Comentarios
¿Le ha resultado útil esta página?  Sí  No

También podría gustarte