Modos de aislamiento

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

Los contenedores de Windows ofrecen dos modos distintos de aislamiento en tiempo de ejecución: aislamiento 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 usan las mismas imágenes del contenedor. La diferencia entre los modos de aislamiento radica en el grado de aislamiento que 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 información general sobre los contenedores de Windows. Con el aislamiento de procesos, varias instancias de contenedor pueden ejecutarse simultáneamente en un host dado con aislamiento proporcionado a través de otras tecnologías de aislamiento de procesos, espacios de nombres y control de recursos. Al ejecutarse en este modo, los contenedores comparten el mismo kernel con el host y también entre sí. Esto equivale aproximadamente al modo en que se ejecutan los contenedores de Linux.

Diagrama que muestra un contenedor lleno de aplicaciones aisladas del sistema operativo y del hardware.

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, el sistema de archivos es probablemente el espacio de nombres más conocido. Hay numerosos espacios de nombres en Windows que se aíslan por contenedor:

  • sistema de archivos
  • Registro
  • puertos de red
  • espacio del identificador de proceso y subproceso
  • Espacio de nombres del Administrador de objetos

Traspasar el límite de aislamiento

Hay casos en los que resulta útil traspasar el límite de aislamiento. El usuario debe solicitar deliberadamente estas operaciones y se deben realizar con cuidado, ya que puede poner en peligro la posición de seguridad del contenedor. Los contenedores de Windows admiten lo siguiente:

Los contenedores de Windows no admiten actualmente:

  • memoria compartida
  • uso compartido de objetos de sincronización (semáforos, exclusiones mutuas, etc.)
  • espacios de nombres de procesos compartidos

Aislamiento de Hyper-V

Este modo de aislamiento ofrece seguridad mejorada y mayor compatibilidad entre las versiones del host y del contenedor. Con el aislamiento de Hyper-V, varias instancias de contenedor se ejecutan simultáneamente en un host; sin embargo, cada contenedor se ejecuta dentro de una máquina virtual altamente optimizada y, de hecho, obtiene su propio kernel. La presencia de la máquina virtual proporciona aislamiento de nivel de hardware entre cada contenedor y el host de contenedor.

Diagrama de un contenedor que se aísla dentro de un sistema operativo de una máquina visual que se ejecuta en un sistema operativo dentro de un equipo físico.

Ejemplos de aislamiento

Crear contenedor

La administración de contenedores con aislamiento de Hyper-V mediante Docker es casi idéntica a la administración de contenedores con aislamiento de procesos. Para crear un contenedor con el 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 a través de Docker, usa 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 se ejecutan de forma 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 con Windows 10 Pro o Enterprise pueden ejecutar un contenedor de Windows con aislamiento de procesos. Los usuarios tienen que solicitar directamente el aislamiento de procesos mediante la marca --isolation=process.

Advertencia

La ejecución con el aislamiento de procesos en Windows 10 Pro y Enterprise está pensada para desarrollo y pruebas. El host debe ejecutar Windows 10, compilación 17763 o superior, y debe tener una versión de Docker con el motor 18.09 o posterior.

Debes seguir usando Windows Server como host para las implementaciones de producción. Con esta característica en Windows 10 Pro y Enterprise, también debes asegurarte de que las etiquetas de la versión del contenedor y del host coinciden; de lo contrario, el contenedor puede no iniciarse 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 de Hyper-V.

En este caso, se implementa un contenedor con aislamiento de procesos que hospedará un proceso de ping de ejecución prolongada.

docker run -d mcr.microsoft.com/windows/servercore:ltsc2019 ping localhost -t

Mediante el comando docker top, el proceso de ping se devuelve tal como se muestra dentro del contenedor. El proceso de este ejemplo tiene el identificador 3964.

docker top 1f8bf89026c8f66921a55e773bac1c60174bb6bab52ef427c6c8dbc8698f9d7a

3964 ping

En el host de contenedor, puede usarse el comando get-process para devolver los procesos de ping que se están ejecutando en el host. En este ejemplo hay uno, y el identificador del proceso coincide con el del contenedor. Se trata del mismo proceso visible en el contenedor y en 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, puede usarse docker top para devolver los procesos que se están ejecutando en el contenedor.

docker top 5d5611e38b31a41879d37a94468a1e11dc1086dcd009e2640d36023aa1663e62

1732 ping

Pero cuando se busca el proceso de host de contenedor, no se encuentra ningún 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, puede verse el proceso vmwp, que es la máquina virtual que encapsula el contenedor en ejecución y que 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