Modos de aislamiento
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
.
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
.
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
.
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.
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.
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