¿VM o Docker?

¿Cómo entender que necesitas Docker y no una VM? Debe determinar qué es exactamente lo que desea aislar. Si desea aislar un sistema con recursos garantizados y hardware virtual, entonces la elección debe recaer en la máquina virtual. Si necesita aislar aplicaciones en ejecución como procesos de sistema separados, necesitará Docker.

Entonces, ¿cuál es la diferencia entre los contenedores Docker y las máquinas virtuales?

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 junto con controladores de dispositivos virtuales, administración de memoria y otros componentes. Es decir, obtenemos una abstracción de hardware físico que le permite ejecutar muchas computadoras virtuales en una computadora.
Una VM instalada puede ocupar espacio en disco 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 de memoria dinámica. Al instalar aplicaciones adicionales, la memoria se les asignará dinámicamente hasta que alcance la cantidad máxima asignada.

Cuantas más máquinas virtuales haya en el servidor, más espacio ocuparán y también requerirán el soporte constante del entorno necesario para que su aplicación funcione.

Docker es un software para construir aplicaciones basadas en contenedores. Los contenedores y las máquinas virtuales tienen beneficios similares, pero funcionan de manera diferente. Los contenedores ocupan menos espacio, porque Usar en exceso más recursos compartidos del sistema host que la máquina virtual, porque a diferencia de VM, proporciona virtualización a nivel de sistema operativo, no de hardware. Este enfoque proporciona menos consumo de memoria, una implementación más rápida y una escalabilidad más sencilla.

El contenedor proporciona un mecanismo más eficaz para encapsular aplicaciones al proporcionar las interfaces necesarias para el sistema host. Esta función permite que los contenedores compartan el núcleo del sistema, donde cada uno de los contenedores se ejecuta como un proceso separado del sistema operativo principal, que tiene su propio conjunto de áreas de memoria (su propio espacio de direcciones virtuales). Dado que el espacio de direcciones virtuales de cada contenedor es propio, los datos que pertenecen a diferentes áreas de memoria no se pueden cambiar.
El sistema operativo nativo para Docker es Linux (Docker también se puede usar en Windows y MacOS), utiliza sus principales ventajas, que le permiten organizar un kernel dividido. El lanzamiento de los contenedores Docker en Windows se realizará dentro de una máquina virtual Linux. Los contenedores comparten el sistema operativo del sistema host y el sistema operativo principal para ellos es Linux.

Contenedor: ¿cómo funciona?

envase 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 escribible e inicializando varios parámetros. Debido a que un contenedor tiene su propia capa de escritura y todos los cambios se almacenan en esa capa, varios contenedores pueden compartir el acceso a la misma imagen maestra.

Cada contenedor se puede configurar a través de un archivo en el proyecto docker-compose incluido en la solución principal, docker-compose.yml. Allí puede establecer varios parámetros, como el nombre del contenedor, los puertos, los identificadores, los límites de recursos y las 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 se inicia un contenedor a partir de una imagen, Docker monta el sistema de archivos de lectura/escritura encima de las capas inferiores. Aquí es donde se ejecutarán todos los procesos que queremos que ejecute nuestro contenedor Docker.

Cuando Docker inicia un contenedor por primera vez, la capa inicial de lectura/escritura está vacía. Cuando ocurren cambios, se aplican a esa capa; por ejemplo, si desea modificar un archivo, ese archivo se copiará de la capa de solo lectura a continuación a la capa de lectura y escritura.
La versión de solo lectura del archivo seguirá existiendo, pero ahora está oculta debajo de la copia. Los volúmenes se utilizan para almacenar datos, independientemente del ciclo de vida del contenedor. Los volúmenes se inicializan cuando se crea un contenedor.

¿Cómo se asocia la imagen al contenedor?

Imagen - el elemento principal de cada contenedor. La imagen se crea a partir de un Dockerfile agregado al proyecto y es un conjunto de sistemas de archivos (capas) superpuestos y agrupados, disponibles solo para lectura; el número máximo de capas es 127.

En el corazón de cada imagen hay una imagen base, que se especifica mediante el comando FROM: el punto de entrada al generar una imagen Dockerfile. Cada capa es una capa de solo lectura y está representada por un único comando que modifica el sistema de archivos, escrito en un Dockerfile.
Para combinar estas capas en una sola imagen, Docker utiliza el sistema de archivos Union avanzado de varias capas (AuFS se basa en UnionFS), lo que permite que diferentes archivos y directorios de diferentes capas de archivos se superpongan de forma transparente, creando un sistema de archivos asociado.

Las capas contienen metadatos que le permiten almacenar información relacionada sobre cada capa en tiempo de ejecución y de compilación. Cada capa contiene un enlace a la siguiente capa, si la capa no tiene enlace, entonces esta es la capa superior de la imagen.

Dockerfile puede contener comandos como:

  • DESDE - punto de entrada en la formación de la imagen;
  • MANTENEDOR - el nombre del propietario de la imagen;
  • EJECUTAR: ejecución del comando durante el ensamblaje de la imagen;
  • AGREGAR: copiando el archivo host a una nueva imagen, si especifica un archivo URL, Docker lo descargará en el directorio especificado;
  • ENV - variables de entorno;
  • CMD: inicia la creación de un nuevo contenedor basado en la imagen;
  • PUNTO DE ENTRADA: el comando se ejecuta cuando se inicia el contenedor.
  • WORKDIR es el directorio de trabajo para ejecutar el comando CMD.
  • USUARIO: establece el UID para el contenedor creado a partir de la imagen.
  • VOLUMEN: monta el directorio del host en el contenedor.
  • EXPOSE es un conjunto de puertos que se escuchan en el contenedor.

¿Cómo funciona UnionFS?

UniónFS — sistema de archivos de pila de servicio (FS) para Linux y FreeBSD. Este FS implementa el mecanismo de copia en escritura (Copy-On-Write, COW). La unidad de trabajo de UnionFS es una capa, cada capa debe considerarse como un sistema de archivos completo e independiente con una jerarquía de directorios desde la propia raíz. UnionFS crea un montaje de unión para otros sistemas de archivos y le permite fusionar de forma transparente archivos y directorios de diferentes sistemas de archivos (llamados sucursales) en un solo sistema de archivos vinculado, de forma transparente para el usuario.

Los contenidos de los directorios con las mismas rutas se mostrarán juntos en un directorio combinado (en el mismo espacio de nombres) del sistema de archivos resultante.

UnionFS combina capas según los siguientes principios:

  • una de las capas se convierte en una capa de nivel superior, la segunda capa y las subsiguientes se convierten en capas de 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 el mismo nombre en la capa "inferior"; de lo contrario, se devuelve el objeto de capa "inferior"; si el objeto solicitado no está allí ni allí, se devuelve el error "No existe tal archivo o directorio";
  • la capa de trabajo es la "superior", es decir, todas las acciones del usuario para cambiar los datos se reflejan solo en la capa de nivel superior, sin afectar los contenidos de las capas de nivel inferior.

Docker es la tecnología más común para usar contenedores en el trabajo de aplicaciones. Se ha convertido en el estándar en esta área, basándose en los cgroups y los espacios de nombres proporcionados por el kernel de Linux.

Docker nos permite implementar aplicaciones rápidamente y hacer el mejor uso del sistema de archivos al compartir el kernel del sistema operativo entre todos los contenedores, ejecutándose como procesos de sistema operativo separados.

Fuente: habr.com

Añadir un comentario