Saltar al contenido

Docker vs máquina virtual

Contenedores Docker y máquinas virtuales resuelven un problema similar (aislar y empaquetar aplicaciones) pero con un nivel de virtualización completamente distinto.

Qué virtualizaEl sistema operativo (procesos aislados)El hardware completo
ArranqueSegundos (o menos)Minutos
Tamaño típicoMegabytesGigabytes
KernelCompartido con el hostPropio, independiente
AislamientoA nivel de proceso (namespaces, cgroups)Total, a nivel de hardware virtualizado
Densidad por servidor físicoMuy alta (decenas/cientos de contenedores)Menor (limitada por recursos de cada VM)

Una máquina virtual virtualiza el hardware completo: un hipervisor (VMware, KVM, Hyper-V) simula una CPU, memoria, disco y red virtuales sobre los que se instala un sistema operativo invitado completo, con su propio kernel, totalmente independiente del sistema anfitrión. Esto da un aislamiento muy fuerte —dos VMs no comparten prácticamente nada— a costa de más consumo de recursos y tiempos de arranque de minutos.

Docker (y los contenedores en general) toman un enfoque distinto: en lugar de virtualizar hardware, aíslan procesos dentro del mismo kernel del sistema operativo anfitrión, usando funcionalidades del propio kernel Linux (namespaces para aislar vista de procesos/red/filesystem, cgroups para limitar recursos). El resultado es que un contenedor arranca en segundos, pesa órdenes de magnitud menos que una VM, y se pueden ejecutar muchos más contenedores que VMs en el mismo servidor físico.

La contrapartida es el aislamiento: al compartir el kernel del host, una vulnerabilidad grave del kernel podría en teoría afectar a todos los contenedores que corren sobre él, algo que no ocurre entre VMs distintas. Por eso en entornos multi-tenant muy sensibles a veces se combinan ambas técnicas: VMs para el aislamiento fuerte entre clientes, y contenedores dentro de cada VM para la densidad y velocidad de despliegue.

Para el desarrollo y despliegue de aplicaciones modernas, Docker (y su orquestación con Kubernetes) se ha convertido en el estándar de facto: empaquetar una aplicación con todas sus dependencias en una imagen reproducible, desplegable igual en el portátil del desarrollador que en producción, resuelve el clásico problema de "en mi máquina funciona". Las máquinas virtuales siguen siendo imprescindibles para aislar cargas de trabajo completas, ejecutar sistemas operativos distintos al del host, o cuando se necesita el aislamiento más fuerte posible.

Herramientas relacionadas

Preguntas frecuentes

¿Un contenedor Docker es menos seguro que una VM?

Tiene un aislamiento más débil por compartir kernel, pero con buenas prácticas (imágenes mínimas, usuarios sin privilegios, escaneo de vulnerabilidades) es perfectamente adecuado para la inmensa mayoría de cargas de trabajo en producción.

¿Puedo correr contenedores Windows en un host Linux?

No directamente: los contenedores comparten el kernel del host, así que un contenedor Windows necesita un host Windows (o una capa de virtualización intermedia que emule ese kernel).

¿Docker sustituye a las máquinas virtuales por completo?

No para todos los casos: siguen siendo necesarias cuando se requiere aislamiento fuerte entre inquilinos, ejecutar sistemas operativos distintos, o cumplir requisitos de seguridad que exigen separación a nivel de hardware.