¿Cómo saber si necesita Docker en lugar de una VM? Debe definir qué es exactamente lo que desea aislar. Si necesita aislar un sistema con recursos garantizados y hardware virtual, entonces la elección debe recaer en la VM. Si necesita aislar aplicaciones en funcionamiento como procesos individuales del sistema, necesitará Docker.
¿Cuál es entonces la diferencia entre los contenedores Docker y las VMs?
Máquina virtual (VM) — es un ordenador virtual con todos los dispositivos virtuales y un disco duro virtual, en el cual se instala un nuevo sistema operativo independiente junto con controladores de dispositivos virtuales, gestión de memoria y otros componentes. Es decir, obtenemos una abstracción del hardware físico que permite ejecutar múltiples ordenadores virtuales en un solo equipo.
Una VM instalada puede ocupar espacio en el disco del ordenador de diferentes formas:
- espacio fijo en el disco duro, lo que permite un acceso más rápido al disco duro virtual y evita la fragmentación del archivo;
- asignación dinámica de memoria. Al instalar aplicaciones adicionales, la memoria se asignará dinámicamente para ellas, hasta alcanzar el volumen máximo asignado.
Cuanto mayor máquinas virtuales en el servidor, más espacio ocupan, además requieren soporte constante para el entorno necesario para el funcionamiento de su aplicación.
Docker — es un software para crear aplicaciones basadas en contenedores. Los contenedores y máquinas virtuales tienen ventajas similares, pero funcionan de manera diferente. Los contenedores ocupan menos espacio, ya que reutilizan un mayor número de recursos compartidos del sistema anfitrión que las VMs, ya que, a diferencia de las VMs, proporcionan virtualización a nivel de sistema operativo, no de hardware. Este enfoque proporciona un menor volumen de memoria ocupada, un despliegue rápido y una escalabilidad más sencilla.
El contenedor ofrece un mecanismo más eficiente para la encapsulación de aplicaciones, proporcionando las interfaces necesarias del sistema host. Esta capacidad permite a los contenedores compartir el núcleo del sistema, donde cada contenedor opera como un proceso independiente del sistema operativo principal, teniendo su propio conjunto de áreas de memoria (su propio espacio de direcciones virtual). Dado que el espacio de direcciones virtual de cada contenedor es independiente, los datos pertenecientes a diferentes áreas de memoria no pueden ser modificados.
El sistema operativo nativo para Docker es Linux (Docker también se puede utilizar en Windows y MacOS), aprovechando las ventajas clave de este último, que permiten organizar la separación del núcleo. La ejecución de contenedores Docker en Windows se lleva a cabo dentro de una máquina virtual con Linux, ya que los contenedores comparten el sistema operativo del host y el sistema operativo principal para ellos es Linux.
¿Cómo funciona un contenedor?
Contenedor — es una abstracción a nivel de aplicación que combina el código y las dependencias. Los contenedores siempre se crean a partir de imágenes, añadiendo una capa superior writable y inicializando varios parámetros. Dado que el contenedor tiene su propia capa de escritura y todos los cambios se guardan en esta capa, varios contenedores pueden acceder en común a la misma imagen base.
Cada contenedor se puede configurar mediante un archivo en el proyecto docker-compose, incluido en la solución principal: docker-compose.yml. Allí se pueden establecer varios parámetros como el nombre del contenedor, puertos, identificadores, límites de recursos, dependencias entre otros contenedores. Si no se establece un nombre para el contenedor en la configuración, Docker creará un nuevo contenedor cada vez, asignándole un nombre al azar.
Cuando un contenedor se inicia desde una imagen, Docker monta el sistema de archivos en modo lectura y escritura sobre cualquier capa inferior. Aquí es donde se ejecutarán todos los procesos que queremos que nuestro contenedor Docker realice.
Cuando Docker inicia un contenedor por primera vez, la capa inicial de lectura-escritura está vacía. Cuando se realizan cambios, se aplican a esta capa; por ejemplo, si deseas modificar un archivo, este archivo se copiará desde la capa de solo lectura inferior a la capa de lectura-escritura.
La versión del archivo que está disponible solo para lectura seguirá existiendo, pero ahora está oculta bajo una copia. Se utilizan volúmenes para almacenar datos, independientemente del ciclo de vida del contenedor. Los volúmenes se inicializan al crear un contenedor.
¿Cómo se relaciona la imagen con el contenedor?
Imagen — el elemento principal de cada contenedor. Una imagen se crea a partir de un Dockerfile agregado al proyecto y representa un conjunto de sistemas de archivos (capas) apilados unos sobre otros y agrupados, accesibles solo para lectura; el número máximo de capas es 127.
En la base de cada imagen se encuentra una imagen base, que se indica con el comando FROM — el punto de entrada al formar la imagen del Dockerfile. Cada capa es una capa de solo lectura y se representa por un comando que modifica el sistema de archivos registrado en el Dockerfile.
Para combinar estas capas en una imagen, Docker utiliza un sistema de archivos unificado en múltiples capas avanzado (AuFS se basa en UnionFS), que permite superponer diferentes archivos y directorios de diferentes capas de archivos de manera transparente, creando un sistema de archivos unido.
Las capas contienen metadatos que permiten conservar información adicional sobre cada capa durante la ejecución y el ensamblaje. Cada capa contiene un enlace a la siguiente capa; si una capa no tiene un enlace, significa que es la capa superior en la imagen.
El Dockerfile puede contener comandos como:
- FROM — punto de entrada al formar la imagen;
- MAINTAINER — nombre del propietario de la imagen;
- RUN — ejecutar un comando durante la construcción de la imagen;
- ADD — copiar un archivo del host a la nueva imagen; si se especifica una URL de archivo, Docker lo descargará a la carpeta designada;
- ENV — variables de entorno;
- CMD — inicia la creación de un nuevo contenedor basado en la imagen;
- ENTRYPOINT — el comando se ejecuta al iniciar el contenedor.
- WORKDIR — directorio de trabajo para ejecutar el comando CMD.
- USER — establece el UID para el contenedor creado a partir de la imagen.
- VOLUME — monta un directorio del host en el contenedor.
- EXPOSE — conjunto de puertos escuchados en el contenedor.
¿Cómo funciona UnionFS?
UnionFS — sistema de archivos de pila de servicio (FS) para Linux y FreeBSD. Este FS implementa el mecanismo de copia al escribir (Copy-On-Write, COW). La unidad de trabajo de UnionFS es la capa, cada capa debe considerarse como un sistema de archivos completo con una jerarquía de directorios desde la raíz. UnionFS crea un montaje combinado para otros sistemas de archivos y permite, de manera transparente para el usuario, combinar archivos y directorios de diferentes sistemas de archivos (llamados ramas) en un único sistema de archivos unificado.
El contenido de los directorios con rutas idénticas se mostrará junto en un único directorio combinado (en un único espacio de nombres) del sistema de archivos resultante.
UnionFS combina capas según los siguientes principios:
- una de las capas se convierte en la capa superior, la segunda y las siguientes en capas inferiores;
- los objetos de las capas son accesibles para el usuario «de arriba hacia abajo», es decir, si el objeto solicitado se encuentra en la capa «superior», se devuelve, independientemente de la existencia de un objeto con el mismo nombre en la capa «inferior»; de lo contrario, se devuelve el objeto de la capa «inferior»; si el objeto solicitado no está en ninguna de las dos, se devuelve el error «No existe tal archivo o directorio»;
- la capa de trabajo es «superior», es decir, todas las acciones del usuario para modificar datos se reflejan solo en la capa superior, sin afectar el contenido de las capas inferiores.
Docker es la tecnología más común para el uso de contenedores en la operación de aplicaciones. Se ha convertido en el estándar en este campo, basándose en cgroups y espacios de nombres que proporciona el núcleo de Linux.
Docker nos permite desplegar aplicaciones rápidamente y utilizar el sistema de archivos de la manera más óptima al compartir el núcleo del sistema operativo entre todos los contenedores, funcionando como procesos separados del sistema operativo.
Fuente: habr.com
