¿Cómo entender que necesitas un Docker, no una VM? Intentemos comprender las principales diferencias entre el aislamiento de máquinas virtuales (VM) y los contenedores Docker, si pueden ser intercambiables y cómo podemos usarlos.
Entonces, ¿cuál es la diferencia entre los contenedores Docker y VM?
Una máquina virtual (VM) es una computadora virtual con todos los dispositivos virtuales y un disco duro virtual, en el que se instala un nuevo sistema operativo independiente (sistema operativo invitado) junto con controladores de dispositivos virtuales, administración de memoria y otros componentes. Es decir, obtenemos una abstracción del equipo físico que le permite ejecutar muchas computadoras virtuales en una sola computadora. El equipo virtual se muestra en las propiedades del sistema y las aplicaciones instaladas interactúan con él como si fuera real. Al mismo tiempo, la máquina virtual en sí está completamente aislada de la computadora real, aunque puede tener acceso a su disco y dispositivos periféricos.
Una máquina virtual instalada puede ocupar espacio en el disco de una computadora de diferentes maneras:
- espacio fijo en el disco duro, que permite un acceso más rápido al disco duro virtual y evita la fragmentación de archivos;
- asignación dinámica de memoria. Al instalar aplicaciones adicionales, la memoria se asignará dinámicamente para ellas hasta que alcance la cantidad máxima asignada.
Cuando se usa VM, hay costos adicionales para emular equipos virtuales y lanzar un SO huésped, admitiendo y administrando el entorno necesario para que su aplicación funcione. Además, cuando implementa una gran cantidad de máquinas virtuales en el servidor, la cantidad de espacio que ocupan en el disco duro solo aumentará, porque cada VM requiere espacio, al menos para el SO huésped y los controladores para dispositivos virtuales.
Docker es un software para crear aplicaciones basadas en contenedores. Los contenedores y las máquinas virtuales resuelven un problema, pero lo hacen de manera diferente. Los contenedores ocupan menos espacio porque Reutilice más recursos compartidos del sistema host que VM a diferencia de VM, proporciona virtualización a nivel de sistema operativo, no hardware. Este enfoque proporciona menos espacio en el disco duro, una implementación más rápida y una escala más fácil.
El contenedor docker proporciona un mecanismo de encapsulación de aplicaciones más eficiente, proporcionando las interfaces necesarias del sistema host. Esta característica permite que los contenedores dividan el núcleo del sistema, donde cada contenedor funciona como un proceso separado del sistema operativo principal, que tiene su propio espacio de direcciones virtuales, por lo que los datos que pertenecen a diferentes áreas de memoria no se pueden cambiar.
Docker es la tecnología más común para usar contenedores en la aplicación. Se ha convertido en el estándar en esta área, basándose en los cgroups y el espacio de nombres proporcionado por el kernel de Linux. El sistema operativo nativo para Docker es Linux, por lo que el lanzamiento de los contenedores Docker en Windows se llevará a cabo dentro de una máquina virtual Linux.
¿De qué está hecho el contenedor?
Una imagen es el elemento principal a partir del cual se crean los contenedores. La imagen se crea a partir del Dockerfile agregado al proyecto y es un conjunto de sistemas de archivos (capas) superpuestos y agrupados, de solo lectura; El número máximo de capas es 127.
En el corazón de cada imagen hay una imagen base, que se indica mediante el comando FROM, el punto de entrada para la formación de la imagen Dockerfile. Cada capa es una capa de solo lectura y está representada por un comando que modifica el sistema de archivos escrito en el Dockerfile. Este enfoque permite que diferentes archivos y directorios de diferentes capas de archivos se superpongan de forma transparente, creando un sistema de archivos integrado en cascada. Las capas contienen metadatos, lo que le permite guardar información relacionada sobre cada capa en tiempo de ejecución y compilación. Cada capa contiene un enlace a la siguiente capa, si la capa no tiene un enlace, entonces esta es la capa superior de la imagen.
Comenzando con Docker EE versión 17/06/02-ee5 y Docker Engine: se usa Community, Overlay2 o Overlay, y las versiones anteriores usan AuFS (sistema avanzado de archivos de varias capas de la Unión).
Contenedor: ¿cómo funciona?
Un contenedor es una abstracción a nivel de aplicación que combina código y dependencias. Los contenedores siempre se crean a partir de imágenes, agregando una capa superior grabable e inicializando varios parámetros. Dado que el contenedor tiene su propia capa de grabación y todos los cambios se guardan en esta capa, varios contenedores pueden compartir el acceso a la misma imagen. Cada contenedor se puede configurar a través de un archivo en el proyecto docker-compose.yml, estableciendo varios parámetros, como el nombre del contenedor, puertos, identificadores, dependencias entre otros contenedores. Si no especifica un nombre de contenedor en la configuración, Docker creará un nuevo contenedor cada vez, asignándole un nombre al azar.
Cuando el contenedor comienza desde la imagen, Docker monta el sistema de archivos para leer y escribir sobre las capas de abajo. Aquí es donde se ejecutarán todos los procesos. Cuando inicia el contenedor por primera vez, la capa inicial de lectura y escritura está vacía. Cuando se producen cambios, se aplican a esta capa; por ejemplo, si desea modificar un archivo, este archivo se copiará desde la capa inferior de solo lectura a la capa de lectura y escritura. Todavía existirá una versión de solo lectura del archivo, pero ahora está oculto debajo de la copia.
¿Cómo funciona un sistema de archivos federado en cascada?
Un sistema de archivos integrado en cascada (FS) implementa un mecanismo de copia de copia en escritura (COW). La unidad de trabajo es una capa, cada capa debe considerarse como un sistema de archivos completo con una jerarquía de directorios desde la raíz misma. Este enfoque utiliza el montaje unificado de los sistemas de archivos, lo que permite, de forma transparente para el usuario, combinar archivos y directorios de varios sistemas de archivos (llamados ramas) en un solo sistema de archivos conectado. El contenido de los directorios con las mismas rutas se mostrarán juntos en un directorio combinado (en un solo espacio de nombres) del sistema de archivos resultante.
Las capas se fusionan de acuerdo con los siguientes principios:
- una de las capas se convierte en una capa del nivel superior, la segunda y las capas posteriores se convierten en capas del nivel inferior;
- Los objetos de capa son accesibles para el usuario "de arriba a abajo", es decir si el objeto solicitado está en la capa "superior", se devuelve, independientemente de la presencia de un objeto con ese nombre en la capa "inferior"; de lo contrario, se devuelve el objeto de la capa "inferior"; si el objeto solicitado no está allí, ni allí ni allí, se devuelve el error "No existe tal archivo o directorio";
- la capa de trabajo es "superior", es decir, todas las acciones del usuario para cambiar datos se reflejan solo en la capa de nivel superior, sin afectar el contenido de las capas de nivel inferior.
Conclusión
Si necesita virtualizar un sistema con recursos dedicados garantizados y hardware virtual, debe elegir una VM. Lo que da el uso de VM:
- la capacidad de instalar varios sistemas operativos diferentes en una computadora;
- distribución de recursos del sistema entre máquinas virtuales;
- no es necesario reiniciar para cambiar entre sistemas operativos;
- la capacidad de tomar una "instantánea" del estado actual del sistema y el contenido de los discos para devolver el sistema a su estado original;
- aislamiento de fallas y violaciones del sistema de seguridad a nivel de hardware;
- la capacidad de simular una red informática en una computadora
Si desea aislar las aplicaciones en ejecución como procesos separados, Docker está bien para usted. Lo que da el uso de Docker:
- proporciona virtualización a nivel del sistema operativo;
- los contenedores comparten el núcleo del sistema y funcionan como un proceso separado del sistema operativo principal;
- el consumo de recursos del sistema, como el consumo de memoria y la carga de la CPU, se puede limitar por separado para cada contenedor que usa cgroups;
- FS para contenedores se crea utilizando el mecanismo COW, que permite acelerar la implementación de aplicaciones, reduce el consumo de memoria y ahorra espacio en disco;
- El sistema de archivos modificado de un contenedor se puede utilizar como base para la formación de nuevas imágenes básicas de otros contenedores.