Docker no es una metodología de virtualización. Se basa en otras herramientas que realmente implementan la virtualización basada en contenedores o la virtualización a nivel del sistema operativo. Para eso, Docker inicialmente usaba el controlador LXC, luego se movió a libcontainer, que ahora se renombra como runc. Docker se centra principalmente en automatizar la implementación de aplicaciones dentro de contenedores de aplicaciones. Los contenedores de aplicaciones están diseñados para empaquetar y ejecutar un solo servicio, mientras que los contenedores del sistema están diseñados para ejecutar múltiples procesos, como máquinas virtuales. Por lo tanto, Docker se considera una herramienta de administración de contenedores o de implementación de aplicaciones en sistemas en contenedores.
Para saber cómo es diferente de otras virtualizaciones, veamos la virtualización y sus tipos. Entonces, sería más fácil entender cuál es la diferencia allí.
Virtualización
En su forma concebida, se consideró un método de división lógica de mainframes para permitir que varias aplicaciones se ejecuten simultáneamente. Sin embargo, el escenario cambió drásticamente cuando las compañías y las comunidades de código abierto pudieron proporcionar un método para manejar las instrucciones privilegiadas de una forma u otra y permitir que múltiples sistemas operativos se ejecuten simultáneamente en un solo sistema basado en x86.
Hipervisor
El hipervisor maneja la creación del entorno virtual en el que operan las máquinas virtuales invitadas. Supervisa los sistemas invitados y se asegura de que los recursos se asignen a los invitados según sea necesario. El hipervisor se encuentra entre la máquina física y las máquinas virtuales y proporciona servicios de virtualización a las máquinas virtuales. Para darse cuenta, intercepta las operaciones del sistema operativo invitado en las máquinas virtuales y emula la operación en el sistema operativo de la máquina host.
El rápido desarrollo de las tecnologías de virtualización, principalmente en la nube, ha impulsado el uso de la virtualización aún más al permitir que se creen múltiples servidores virtuales en un solo servidor físico con la ayuda de hipervisores, como Xen, VMware Player, KVM, etc., y incorporación de soporte de hardware en procesadores básicos, como Intel VT y AMD-V.
Tipos de virtualización
El método de virtualización se puede clasificar en función de cómo imita el hardware a un sistema operativo invitado y emula un entorno operativo invitado. Principalmente, hay tres tipos de virtualización:
- Emulación
- Paravirtualización
- Virtualización basada en contenedores
Emulación
La emulación, también conocida como virtualización completa, ejecuta el núcleo del sistema operativo de la máquina virtual completamente en software. El hipervisor utilizado en este tipo se conoce como hipervisor tipo 2. Se instala en la parte superior del sistema operativo host que se encarga de traducir el código del kernel del sistema operativo invitado a las instrucciones del software. La traducción se realiza completamente en software y no requiere participación de hardware. La emulación permite ejecutar cualquier sistema operativo no modificado que admita el entorno que se emula. La desventaja de este tipo de virtualización es una sobrecarga de recursos del sistema adicional que conduce a una disminución en el rendimiento en comparación con otros tipos de virtualizaciones.
Los ejemplos en esta categoría incluyen VMware Player, VirtualBox, QEMU, Bochs, Parallels, etc.
Paravirtualización
La paravirtualización, también conocida como hipervisor Tipo 1, se ejecuta directamente en el hardware o "bare metal" y proporciona servicios de virtualización directamente a las máquinas virtuales que se ejecutan en él. Ayuda al sistema operativo, al hardware virtualizado y al hardware real a colaborar para lograr un rendimiento óptimo. Estos hipervisores suelen tener una huella bastante pequeña y, por sí mismos, no requieren amplios recursos.
Los ejemplos en esta categoría incluyen Xen, KVM, etc.
Virtualización basada en contenedores
La virtualización basada en contenedores, también conocida como virtualización a nivel del sistema operativo, permite múltiples ejecuciones aisladas dentro de un solo núcleo del sistema operativo. Tiene el mejor rendimiento y densidad posibles y presenta una gestión dinámica de recursos. El entorno de ejecución virtual aislado que proporciona este tipo de virtualización se denomina contenedor y se puede ver como un grupo de procesos rastreados.
El concepto de contenedor es posible gracias a la función de espacios de nombres agregada a la versión 2.6.24 del kernel de Linux. El contenedor agrega su ID a cada proceso y agrega nuevas verificaciones de control de acceso a cada llamada al sistema. Se accede mediante la llamada al sistema clone () que permite crear instancias separadas de espacios de nombres previamente globales.
Los espacios de nombres se pueden usar de muchas maneras diferentes, pero el enfoque más común es crear un contenedor aislado que no tenga visibilidad o acceso a objetos fuera del contenedor. Los procesos que se ejecutan dentro del contenedor parecen ejecutarse en un sistema Linux normal, aunque comparten el núcleo subyacente con procesos ubicados en otros espacios de nombres, lo mismo para otros tipos de objetos. Por ejemplo, cuando se usan espacios de nombres, el usuario root dentro del contenedor no se trata como root fuera del contenedor, lo que agrega seguridad adicional.
El subsistema de Grupos de control de Linux (cgroups), el siguiente componente principal para habilitar la virtualización basada en contenedores, se usa para agrupar procesos y administrar su consumo de recursos agregados. Se usa comúnmente para limitar el consumo de memoria y CPU de los contenedores. Dado que un sistema Linux en contenedores solo tiene un núcleo y el núcleo tiene una visibilidad completa de los contenedores, solo hay un nivel de asignación y programación de recursos.
Hay varias herramientas de administración disponibles para contenedores Linux, incluidas LXC, LXD, systemd-nspawn, lmctfy, Warden, Linux-VServer, OpenVZ, Docker, etc.
Contenedores vs Máquinas Virtuales
A diferencia de una máquina virtual, un contenedor no necesita iniciar el núcleo del sistema operativo, por lo que los contenedores se pueden crear en menos de un segundo. Esta característica hace que la virtualización basada en contenedores sea única y deseable que otros enfoques de virtualización.
Dado que la virtualización basada en contenedores agrega poca o ninguna sobrecarga a la máquina host, la virtualización basada en contenedores tiene un rendimiento casi nativo
Para la virtualización basada en contenedores, no se requiere software adicional, a diferencia de otras virtualizaciones.
Todos los contenedores en una máquina host comparten el planificador de la máquina host, lo que ahorra la necesidad de recursos adicionales.
Los estados del contenedor (imágenes Docker o LXC) son de tamaño pequeño en comparación con las imágenes de máquinas virtuales, por lo que las imágenes del contenedor son fáciles de distribuir.
La gestión de recursos en contenedores se logra a través de cgroups. Cgroups no permite que los contenedores consuman más recursos de los asignados. Sin embargo, a partir de ahora, todos los recursos de la máquina host son visibles en las máquinas virtuales, pero no se pueden usar. Esto puede realizarse ejecutando top
ohtop
en contenedores y máquina host al mismo tiempo. El resultado en todos los entornos será similar.
Actualizar:
¿Cómo ejecuta Docker contenedores en sistemas que no son Linux?
Si los contenedores son posibles debido a las características disponibles en el kernel de Linux, entonces la pregunta obvia es cómo los sistemas que no son Linux ejecutan contenedores. Tanto Docker para Mac como Windows usan máquinas virtuales Linux para ejecutar los contenedores. Docker Toolbox se usa para ejecutar contenedores en máquinas virtuales de Virtual Box. Pero, el último Docker usa Hyper-V en Windows e Hypervisor.framework en Mac.
Ahora, permítanme describir cómo Docker para Mac ejecuta contenedores en detalle.
Docker para Mac usa https://github.com/moby/hyperkit para emular las capacidades del hipervisor e Hyperkit usa hypervisor.framework en su núcleo. Hypervisor.framework es la solución de hipervisor nativa de Mac. Hyperkit también usa VPNKit y DataKit para la red de espacio de nombres y el sistema de archivos, respectivamente.
La máquina virtual Linux que Docker ejecuta en Mac es de solo lectura. Sin embargo, puedes atacarlo ejecutando:
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
.
Ahora, incluso podemos verificar la versión Kernel de esta VM:
# uname -a
Linux linuxkit-025000000001 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:86_64 Linux
.
Todos los contenedores se ejecutan dentro de esta VM.
Existen algunas limitaciones para hypervisor.framework. Debido a eso, Docker no expone docker0
la interfaz de red en Mac. Por lo tanto, no puede acceder a los contenedores desde el host. A partir de ahora,docker0
solo está disponible dentro de la VM.
Hyper-v es el hipervisor nativo en Windows. También están tratando de aprovechar las capacidades de Windows 10 para ejecutar sistemas Linux de forma nativa.