Si has empezado con Docker, seguro que has oído (o pensado) eso de que «un contenedor es como una máquina virtual ligera». Es la comparación más repetida… y es incorrecta. Entender la diferencia real entre Docker y las máquinas virtuales no es un detalle técnico: cambia cómo diseñas, despliegas y escalas tus aplicaciones. Vamos a aclararlo de una vez.
Qué es una máquina virtual (VM)
Una máquina virtual emula un ordenador completo. Sobre tu hardware corre un hipervisor (VirtualBox, VMware, KVM, Hyper-V…) que reparte los recursos físicos entre varias VMs. Y aquí está la clave: cada VM lleva su propio sistema operativo completo, con su kernel, sus drivers y sus gigas de archivos.
La pila de una VM se ve así:
┌─────────────────────────────┐
│ App A │ App B │
├─────────────────────────────┤
│ SO completo │ SO completo │ ← cada una, su sistema operativo
├─────────────────────────────┤
│ Hipervisor │
├─────────────────────────────┤
│ Hardware │
└─────────────────────────────┘Resultado: son pesadas (varios GB), tardan en arrancar (como encender un PC entero) y consumen muchos recursos, porque cada una mantiene un sistema operativo entero en marcha.
Qué es un contenedor Docker
Un contenedor no virtualiza hardware ni lleva un sistema operativo propio. En su lugar, comparte el kernel del sistema anfitrión y aísla tu aplicación como un proceso independiente, con su propio sistema de archivos, red y variables de entorno. Ese aislamiento lo consigue con funciones del kernel de Linux (namespaces y cgroups).
La pila de Docker se ve así:
┌─────────────────────────────┐
│ App A │ App B │
├─────────────────────────────┤
│ Docker Engine │ ← NO hay un SO por app
├─────────────────────────────┤
│ Kernel del anfitrión │ ← compartido
├─────────────────────────────┤
│ Hardware │
└─────────────────────────────┘Un contenedor es, en esencia, un proceso aislado, no un ordenador entero. Por eso pesa megas (no gigas) y arranca en segundos o milisegundos.
La diferencia clave, en una frase
Una máquina virtual virtualiza el hardware y lleva su propio sistema operativo. Un contenedor virtualiza el sistema operativo (comparte el kernel) y solo empaqueta tu aplicación y sus dependencias.
Comparativa rápida
| Aspecto | Máquina Virtual | Contenedor (Docker) |
|---|---|---|
| Tamaño | Gigas (SO completo) | Megas (solo la app) |
| Arranque | Minutos | Segundos / milisegundos |
| Sistema operativo | Uno por VM | Comparte el del anfitrión |
| Recursos | Altos (RAM/CPU por SO) | Mínimos |
| Aislamiento | Muy fuerte (hardware) | A nivel de proceso |
| Portabilidad | Pesada | Altísima («funciona igual en todos lados») |
| Densidad | Pocas por máquina | Muchísimas por máquina |
Entonces, ¿cuándo uso cada uno?
Usa Docker cuando…
- Despliegas aplicaciones y microservicios (webs, APIs, backends).
- Quieres un entorno de desarrollo reproducible («funciona en mi máquina» se acabó).
- Necesitas escalar rápido y levantar muchas instancias.
- Buscas CI/CD ágil y despliegues ligeros.
Usa una máquina virtual cuando…
- Necesitas un sistema operativo distinto al del anfitrión (p. ej. Windows sobre Linux, o un kernel concreto).
- Requieres aislamiento muy fuerte por seguridad o cumplimiento (cada carga totalmente separada).
- Ejecutas software legado que depende de un SO completo y concreto.
El matiz que casi nadie cuenta: no son rivales
La pregunta «¿Docker o máquinas virtuales?» tiene trampa, porque muchas veces se usan juntos. En la nube, lo habitual es tener contenedores Docker corriendo dentro de máquinas virtuales: la VM aporta el aislamiento fuerte y la separación entre clientes, y dentro Docker aporta la agilidad y la densidad. No es uno u otro: es la herramienta adecuada en cada capa.
Dos mitos que conviene enterrar
- «Docker es más seguro que una VM.» No por defecto. Al compartir el kernel, un contenedor mal configurado tiene menos aislamiento que una VM. La seguridad en Docker se trabaja (usuarios no root, imágenes mínimas, secretos fuera de la imagen…).
- «Las VMs están obsoletas.» Para nada. Siguen siendo la base de la nube y la opción correcta cuando necesitas SO distintos o aislamiento máximo.
Conclusión
Docker no es «una máquina virtual ligera»: es un enfoque distinto. Las VM virtualizan hardware y cargan un sistema operativo entero; los contenedores comparten el kernel y empaquetan solo tu aplicación, lo que los hace ligeros, rápidos y portables. Para desarrollo y despliegue de aplicaciones modernas, Docker es casi siempre la respuesta; las VM brillan cuando necesitas aislamiento fuerte o sistemas operativos distintos. Y en el mundo real, conviven.
¿Quieres dominar Docker de verdad, de cero a producción? En freekyland tienes el curso Docker para Backend: imágenes, Docker Compose, optimización, CI/CD y despliegue en un servidor real con Nginx y SSL. Gratis y paso a paso. 🐳



