¿Qué es Docker?
Docker es una herramienta que nos permite ejecutar procesos en espacios 'aislados' (conocidos como containers) de los demás procesos del sistema operativo del host. Esto significa que los procesos que ejecute en mi host, no van a comunicarse, ni ‘chocar’ con los procesos que levante Docker, una idea similar a la de las máquinas virtuales (VM: Virtual Machines), pero entonces, ¿Cuál es la diferencia entre levantar Docker y una máquina virtual?Docker vs Máquinas Virtuales
La diferencia clave entre VMs y Docker está en el ‘como’ se realiza el aislamiento de procesos.Una máquina virtual es una abstracción del hardware (emulado a través de software), que necesita un propio sistema operativo, su propio banco de recursos físicos; memoria RAM, disco, procesador para poder ejecutar un proceso. La emulación permite separar la ejecución de procesos del sistema operativo del host.
En cambio Docker realiza una estrategia diferente, emplea funcionalidades de Linux para poder aislar la ejecución de procesos. Estas funcionalidades son namespaces y cgroups. Mientras que los namespaces permiten ejecutar procesos aislados de los del sistema operativo anfitrión, con cgroups se le puede asignar una cantidad de recursos a cada uno de los procesos. A diferencia de las máquinas virtuales, los procesos se ejecutan en el kernel del sistema operativo anfitrión.
Si querés conocer más sobre lo que es un hipervisor y la diferencia entre hipervisores de tipo 1 y 2, visita este link
¿Cuál me conviene?
Hay varias cuestiones a tener en cuenta:1) Recursos: Las máquinas virtuales requieren una mayor cantidad de recursos, porque debajo del proceso que necesitamos ejecutar, se encuentra un sistema operativo del hardware virtualizado, con todo el consumo de recursos extra que requiere RAM, CPU y disco. En los containers de Docker, la ejecución corre por cuenta del sistema operativo anfitrión dado que utiliza su mismo kernel (núcleo), por lo que nos ahorramos el consumo de RAM, CPU y disco empleado por el sistema operativo virtualizado.
2) Tiempo de arranque: Hay que tener en cuenta que las VM tienen su propio sistema operativo, esto va a implicar que para ejecutar un proceso, primero tenemos que esperar que cargue el sistema operativo virtualizado. En cambio, en Docker no necesitamos esperar ese tiempo, por lo que el tiempo de arranque será menor que en el de las máquinas virtuales.
3) Seguridad: El ‘como’ se aisla la ejecución de procesos tiene implicancias en la seguridad de ambos. Debido a que las VM no comparten el kernel con el sistema operativo del host, son menos vulnerables que los containers. Las vulnerabilidades del host se comparten con las del container.
4) Mantenimiento: Supongamos que nuestro proceso virtualizado se ejecuta en un sistema operativo propietario, esto implicaría el uso de licencias. En cambio, y dado que los containers comparten el kernel con el sistema operativo del host, el mantenimiento en las licencias del sistema operativo es menor.
Sintetizando: