Contenedores frente a máquinas virtuales

En este tema se describen algunas de las similitudes y diferencias clave entre contenedores y máquinas virtuales, y cuándo es aconsejable usar cada uno. 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 información general sobre los contenedores, consulta 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 puede considerarse la fontanería del sistema operativo), y solo puede contener aplicaciones y algunas API ligeras de sistema operativo y servicios que se ejecutan en modo de usuario, tal como se muestra en este diagrama.

Diagrama arquitectónico en el que se muestra cómo se ejecutan los contenedores en un nivel superior del kernel

Arquitectura de la máquina virtual

A diferencia de un contenedor, las máquinas virtuales ejecutan un sistema operativo completo, incluido su propio kernel, tal como se muestra en este diagrama.

Diagrama arquitectónico en el que se muestra cómo las máquinas virtuales ejecutan un sistema operativo completo junto al sistema operativo host

Contenedores frente a máquinas virtuales

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

Característica Máquina virtual Contenedor
Aislamiento Proporciona un aislamiento completo del sistema operativo host y de otras máquinas virtuales. Esto resulta útil cuando es crítico tener un límite de seguridad fuerte, como el hospedaje de aplicaciones de compañías competidoras en el mismo servidor o clúster. Normalmente proporciona aislamiento ligero del host y otros contenedores, pero no proporciona un límite de seguridad fuerte como una máquina virtual. (Puede aumentar la seguridad con el modo de aislamiento de Hyper-V para aislar cada contenedor en una máquina virtual ligera).
Sistema operativo Ejecuta un sistema operativo completo incluido el kernel, lo que requiere más recursos del sistema (CPU, memoria y almacenamiento). Ejecuta la parte del modo de usuario de un sistema operativo y se puede personalizar para que contenga solo los servicios necesarios para la aplicación, con menos recursos del sistema.
Compatibilidad de invitado Ejecuta prácticamente cualquier sistema operativo dentro de la máquina virtual. Se ejecuta en la misma versión del sistema operativo que el host (el aislamiento de Hyper-V permite ejecutar versiones anteriores del mismo sistema operativo en un entorno de máquina virtual ligera).
Implementación Implementa máquinas virtuales individuales mediante Windows Admin Center o el administrador de Hyper-V; implementa varias máquinas virtuales mediante PowerShell o System Center Virtual Machine Manager. Implementa contenedores individuales mediante Docker a través de la línea de comandos; implementa varios contenedores con un orquestador como Azure Kubernetes Service.
Actualizaciones del sistema operativo Descarga e instala las actualizaciones del sistema operativo en cada máquina virtual. La instalación de una nueva versión del sistema operativo requiere actualizar o, a menudo, simplemente crear una máquina virtual totalmente nueva. Esto puede llevar mucho tiempo, especialmente si tienes una gran cantidad de máquinas virtuales... Actualizar los archivos del sistema operativo dentro de un contenedor es lo mismo:
  1. Edita el archivo de compilación de la imagen de contenedor (conocido como Dockerfile) para que apunte a la versión más reciente de la imagen base de Windows.
  2. Vuelve a compilar la imagen de contenedor con esta nueva imagen base.
  3. Inserta la imagen de contenedor en el registro de contenedor.
  4. Vuelve a implementar con un orquestador.
    El orquestador proporciona una automatización eficaz para hacerlo a escala. Para obtener más información, consulta Tutorial: Actualización de una aplicación en Azure Kubernetes Service.
Almacenamiento persistente Usa un disco duro virtual (VHD) para el almacenamiento local para una sola máquina virtual o un recurso compartido de archivos SMB para el almacenamiento compartido por varios servidores. Usa discos de Azure para el almacenamiento local para un solo nodo o Azure Files (recursos compartidos de SMB) para el almacenamiento compartido por varios nodos o servidores.
Equilibrio de carga El equilibrio de carga de máquinas virtuales mueve máquinas virtuales en ejecución a otros servidores de un clúster de conmutación por error. Los propios contenedores no se mueven; en su lugar, un orquestador puede iniciar o detener automáticamente contenedores en nodos de clúster para administrar los cambios de carga y disponibilidad.
Tolerancia a errores Las máquinas virtuales pueden conmutar por error a otro servidor de un clúster, reiniciando el sistema operativo de la máquina virtual en el nuevo servidor. Si se produce un error en un nodo del clúster, el orquestador vuelve a crear rápidamente los contenedores que se ejecutan en él en otro nodo del clúster.
Redes Usa adaptadores de red virtual. Usa una vista aislada de un adaptador de red virtual, lo que proporciona un poco menos de virtualización: el firewall del host se comparte con los contenedores, a la vez que se usan menos recursos. Para más información, consulta Redes de contenedores de Windows.