- Las principales diferencias entre la emulación y la virtualización, entenderlas es clave si buscamos virtualizar.
- ¿En dónde entra Docker? No usa emulación ni virtualización, ejecuta el código completo directamente en la CPU y el sistema host, sin sobrecarga de virtualización.
La emulación y virtualización hacen lo mismo: ejecutar otro SO en una máquina virtual. La única diferencia es que lo hacen de una manera distinta; al usarlo nos damos cuenta de que la virtualización funciona de manera más fluida. Pero ¿Qué tiene que ver Docker en esto?
Todo se reduce en el rendimiento
Si tenemos que buscar una respuesta resumida, entonces simplemente podríamos decir que la emulación es considerablemente más lenta que la virtualización; esto se reduce a las optimizaciones de hardware.
La emulación es la manera más simple y básica de poder ejecutar una app en un host no deseado o ideado para eso. Un emulador toma los comandos que fueron destinados al sistema original y los traduce en algo que el ordenador host pueda entender y ejecutar.
Para que esto funcione, significa que tiene que emular códigos de operación y registros de la CPU. Si tenemos que buscar ejemplos que sean simples de comprender, podemos ver los emuladores de consolas antiguas como Nintendo 64 o NES para PC.
La PC no puede ejecutar los juegos de Nintendo 64 o NES de forma directa, no fueron diseñados para dichos entornos, pero el emulador puede tomar las instrucciones que fueron destinadas a dichas consolas y ejecutarlas de forma idéntica.
Generalmente cuando escuchamos la palabra “Emulación” lo primero que se nos viene a la mente es emulación de videojuegos. Sin embargo, también se usa para aplicaciones comerciales; por ejemplo, contamos con una pieza crítica de software heredado, el cual tiene que ejecutarse en un sistema como DOS. Ejecutarlo en un emulador en un servidor nuevo en muchas ocasiones es mucho más simple que ejecutarlo en una máquina desde el momento. También es posible que haga referencia a una pieza de software que emula los efectos de hardware heredado, como la emulación de controladores de red antiguos.
El problema es que la emulación puede ser lenta en muchísimas ocasiones. El caso común sería ejecutar varias máquinas virtuales de Linux en un sistema operativo Host. Si la máquina host es la misma que la máquina virtual, entonces emular toda una CPU se vuelve algo bastante lento si lo comparamos con la ejecución directa y normal.
De esta forma, la gran mayoría de máquinas virtuales usan la virtualización optimizada por hardware. En Intel, se llama Intel-VT y en AMD, AMD-V. Los dos consiguen lo mismo, virtualizar aplicaciones x86.
La virtualización se usa, generalmente, en una especie de combinación con un hipervisor, se trata de un SO que es bastante básico y que controla múltiples servidores privados virtuales. Para que nos demos una leve idea, si adquirimos un VPS de una empresa como AWS, es muy posible que se ejecute un hipervisor como Nitro, Proxmox o Hyper-V de AWS. Estos hipervisores son capaces de conseguir y rendimiento muy cercano al original. Aunque siempre existe la sobrecarga, es mejor que tener que emularlo, definitivamente.
En la mayoría de los casos, la virtualización siempre funciona mejor. Las CPU x86 de AMD e Intel, se pueden virtualizar sistemas operativos como Linux o Windows.
¿En dónde entra Docker?
En el caso de Docker, nos da la posibilidad de ejecutar aplicaciones en contenedores; estos son paquetes asilados los cuales tienen el código que hace falta para ejecutar una aplicación. Es algo bastante seguro; una máquina virtual puede tener varios contendores Docker ejecutándose al mismo tiempo sin que interfieran entre sí.
Generalmente, Docker logra el mismo objetivo de ejecutar una gran cantidad de aplicaciones en máquinas virtuales privadas de Linux. Pero, evidentemente, cuando indagamos un poco más profundo, las cosas funcionan de manera distinta.
En el caso de Docker, este no utiliza emulación, ni virtualización. En este caso, ejecuta todo el código de forma directa en la CPU y el sistema host, sin sobrecarga de virtualización. Entonces para poder instalar los contenedores, utiliza de manera inteligente los espacios de nombres de Linux, entre varias características que permiten asilar los procesos en, podríamos decir, una especie de “Prisión de contenedores”. Los procesos que se encuentran en estos contenedores no pueden ver y mucho menos interactuar con los archivos, procesos o recursos del sistema que no han sido asignados a estos.
Gracias a esto, nos encontramos con un sistema que permite que varias aplicaciones se pueden ejecutar en un mismo sistema host sin tener ninguna clase de sobrecarga para cada servidor privado virtual. Esto se traduce, para un proveedor como AWS, en un ahorro significativo de dinero.
Por lo tanto, si queremos virtualizar, pero una de las grandes preocupaciones es el rendimiento. Entonces Docker no genera gastos generales en comparación con la ejecución de aplicaciones en hardware.