Llegamos a ustedes gracias a:



Reportajes y análisis

¿Qué es Docker? Explicamos lo que son los contenedores

[22/10/2018] El software es cualquier cosa menos simple. Incluso las aplicaciones aparentemente básicas pueden tener un nido de dependencias, con decenas de paquetes, bibliotecas y otros componentes de software necesarios para que se ejecuten. Cuando intenta ejecutar varias aplicaciones en el mismo entorno de sistema operativo, es posible que algunos de estos componentes no se lleven bien. Y cuando intenta mantener esos paquetes de software actualizados, o los cambia para mantenerse al día con las necesidades del negocio, genera todo tipo de problemas de mantenimiento.

Durante muchos años, la principal forma de aislar y organizar aplicaciones y sus dependencias ha sido colocar cada aplicación en su propia máquina virtual. Las máquinas virtuales hacen posible ejecutar múltiples aplicaciones en el mismo hardware físico, mientras se minimizan los conflictos entre los componentes de software y la competencia por los recursos de hardware.

Pero las máquinas virtuales son voluminosas, típicamente de un tamaño de gigabytes. En realidad, no resuelven problemas como la portabilidad, las actualizaciones de software o la integración continua y la entrega continua.

Conozca los contenedores Docker. Los contenedores permiten aislar las aplicaciones en entornos de ejecución pequeños y livianos que comparten el kernel del sistema operativo. Típicamente medidos en megabytes, los contenedores usan muchos menos recursos que las máquinas virtuales y se inician casi de inmediato. Pueden empaquetarse mucho más densamente en el mismo hardware, y girar arriba y abajo en masa con mucho menos esfuerzo y sobrecarga.

Por lo tanto, los contenedores proporcionan un mecanismo altamente eficiente y altamente granular para combinar componentes de software en los tipos de aplicaciones y pilas de servicios necesarios en una empresa moderna, y para mantener esos componentes de software actualizados y con mantenimiento.

Conceptos básicos del contenedor Docker

Los contenedores Docker son la encarnación más moderna de una idea que ha estado en los sistemas operativos Unix como BSD y Solaris durante décadas: la idea de que un proceso determinado se puede ejecutar con cierto grado de aislamiento del resto del entorno operativo.

Las máquinas virtuales proporcionan aislamiento al dedicar una instancia completa del sistema operativo a cada aplicación que necesita compartimentar. Este enfoque proporciona un aislamiento casi total, pero a costa de una sobrecarga significativa. Cada instancia operativa invitada consume memoria y potencia de procesamiento que podría dedicarse mejor a las aplicaciones.

Los contenedores toman un enfoque diferente. Cada aplicación y sus dependencias usan un segmento particionado de los recursos del sistema operativo. El tiempo de ejecución del contenedor (Docker, con mayor frecuencia) configura y destruye los contenedores mediante el uso de los servicios de contenedor de bajo nivel proporcionados por el sistema operativo anfitrión.

Para entender los contenedores de Linux, por ejemplo, tenemos que comenzar con cgroups, y namespaces, las características del kernel de Linux que crean las paredes entre los contenedores y otros procesos que se ejecutan en el host. Namespaces de Linux, originalmente desarrollados por IBM, envuelven un conjunto de recursos del sistema y los presentan a un proceso para que parezca que están dedicados a ese proceso.

Los cgroups de Linux, desarrollados originalmente por Google, rigen el aislamiento y el uso de los recursos del sistema, como la CPU y la memoria, para un grupo de procesos. Por ejemplo, si tiene una aplicación que consume muchos ciclos de CPU y memoria, como una aplicación informática científica, puede colocar la aplicación en un cgroup para limitar su uso de CPU y memoria.

Namespaces se ocupa del aislamiento de recursos para un solo proceso, mientras que cgroups administra recursos para un grupo de procesos. Juntos, cgroups y namespaces, se usaron para crear una tecnología de contenedor llamada, apropiadamente, Linux Containers o LXC.

Cómo se acumulan las pilas de infraestructura de contenedores y virtualización.
Docker

Cómo Docker cambió los contenedores

La tecnología original de contenedor Linux, LXC, es un método de virtualización a nivel de sistema operativo Linux para ejecutar múltiples sistemas Linux aislados en un solo host. Los espacios de nombres y los grupos de grupos hacen posible LXC.

Los contenedores desacoplan aplicaciones de los sistemas operativos, lo que significa que los usuarios pueden tener un sistema operativo Linux limpio y mínimo, y ejecutar todo lo demás en uno o más contenedores aislados.

Además, como el sistema operativo se abstrae de los contenedores, puede mover un contenedor a través de cualquier servidor Linux que admita el entorno de tiempo de ejecución del contenedor.

Docker introdujo varios cambios significativos en LXC que hacen que los contenedores sean más portátiles y flexibles de usar. Con los contenedores Docker, puede implementar, replicar, mover y hacer una copia de seguridad de una carga de trabajo aún más rápida y fácilmente de lo que puede hacerlo utilizando máquinas virtuales. Docker ofrece flexibilidad similar a la nube para cualquier infraestructura capaz de ejecutar contenedores.

Docker también proporciona una forma de crear imágenes de contenedores: especificaciones para qué componentes de software y cómo se ejecutaría un contenedor determinado. Las herramientas de imagen de contenedor de Docker permiten a un desarrollador crear bibliotecas de imágenes, componer imágenes juntas en nuevas imágenes y ejecutar las aplicaciones en ellas en infraestructura local o remota.

Docker también facilita la coordinación de comportamientos entre contenedores y, por lo tanto, crea pilas de aplicaciones al unir contenedores. Los productos de terceros, como Kubernetes, ofrecen versiones más avanzadas de estos comportamientos, lo que se denomina orquestación de contenedores. Pero Docker proporciona lo básico.

Al tomar el concepto de LXC y construir una API y un ecosistema a su alrededor, los desarrolladores de Docker han hecho que trabajar con contenedores sea mucho más accesible para los desarrolladores y mucho más útil para las empresas.

Finalmente, aunque Docker fue originalmente construido encima de LXC, eventualmente el equipo de Docker creó su propio tiempo de ejecución, llamado libcontainer. Libcontainer no solo proporciona una capa más rica de servicios para contenedores, sino que también facilita que el equipo de Docker desarrolle la tecnología de contenedor Docker por separado de Linux.

Hoy, Docker es una utilidad de Linux o Windows que puede crear, enviar y administrar contenedores de manera eficiente.

Ventajas de Docker

Los contenedores Docker proporcionan una forma de crear aplicaciones empresariales y de línea de negocio que son más fáciles de ensamblar, mantener y mover que sus contrapartes convencionales.

Los contenedores Docker permiten el aislamiento y la aceleración: Los contenedores Docker mantienen las aplicaciones aisladas no solo entre sí, sino también desde el sistema subyacente. Esto no solo crea una pila de software más limpia, sino que también facilita la determinación de cómo una aplicación en contenedor determinada utiliza recursos del sistema (CPU, GPU, memoria, E/S, redes, etc.). También hace que sea más fácil garantizar que los datos y el código se mantengan separados. (Consulte "Los contenedores Docker son apátridas e inmutables" a continuación).

Los contenedores Docker permiten la portabilidad: Un contenedor Docker se ejecuta en cualquier máquina que admita el entorno de tiempo de ejecución del contenedor. Las aplicaciones no tienen que estar vinculadas al sistema operativo host, por lo que tanto el entorno de la aplicación como el entorno operativo subyacente se pueden mantener limpios y mínimos.

Por ejemplo, un contenedor MySQL para Linux se ejecutará en la mayoría de los sistemas Linux compatibles con contenedores. Todas las dependencias de la aplicación generalmente se entregan en el mismo contenedor.

Las aplicaciones basadas en contenedores pueden trasladarse fácilmente de sistemas en las instalaciones de la empresa a entornos de nube o de laptops de desarrolladores a servidores, siempre que el sistema de destino admita Docker y cualquiera de las herramientas de terceros que puedan estar en uso con él, como Kubernetes (ver "Contenedores Docker facilitan la orquestación y la escala", a continuación).

Normalmente, las imágenes del contenedor Docker se deben construir para una plataforma específica. Un contenedor de Windows, por ejemplo, no se ejecutará en Linux y viceversa. Anteriormente, una forma de evitar esta limitación era lanzar una máquina virtual que ejecutaba una instancia del sistema operativo necesario y ejecutaba el contenedor en la máquina virtual.

Sin embargo, el equipo de Docker ha ideado una solución más elegante, llamada manifiestos, que permite que las imágenes de múltiples sistemas operativos se empaqueten una al lado de la otra en la misma imagen. Los manifiestos aún se consideran experimentales, pero sugieren cómo es que los contenedores pueden convertirse en una solución de aplicación multiplataforma, así como en una alternativa de entorno múltiple.

Los contenedores Docker permiten la capacidad de compilación: La mayoría de las aplicaciones comerciales constan de varios componentes separados organizados en una pila: un servidor web, una base de datos y una memoria caché en memoria. Los contenedores hacen posible componer estas piezas en una unidad funcional con partes fácilmente cambiables. Cada pieza es proporcionada por un contenedor diferente y puede mantenerse, actualizarse, intercambiarse y modificarse independientemente de las demás.

Este es esencialmente el modelo de microservicios de diseño de aplicaciones. Al dividir la funcionalidad de la aplicación en servicios separados e independientes, el modelo de microservicios ofrece un antídoto para desacelerar los procesos de desarrollo tradicionales y las aplicaciones inflexibles monolíticas. Los contenedores livianos y portátiles hacen que sea más fácil construir y mantener aplicaciones basadas en microservicios.

Los contenedores Docker facilitan la orquestación y la ampliación: Debido a que los contenedores son livianos e imponen una pequeña sobrecarga, es posible lanzar muchos más de ellos en un sistema dado. Pero los contenedores también se pueden usar para escalar una aplicación a través de grupos de sistemas, y aumentar los servicios para subir o bajar los picos de la demanda o para conservar recursos.

La mayoría de las versiones de grado empresarial de las herramientas para el despliegue, administración y escalado de contenedores se proporcionan a través de proyectos de terceros. El principal de ellos es Kubernetes de Google, un sistema para automatizar cómo se implementan y amplían los contenedores, pero también cómo están conectados, equilibrados de carga y administrados. Kubernetes también proporciona formas de crear y reutilizar definiciones de aplicación de contenedores múltiples o "diagramas de timón", de modo que se puedan construir y gestionar complejos apilamientos de aplicaciones bajo demanda.

Docker también incluye su propio sistema incorporado de orquestación, modo enjambre, que todavía se usa para casos menos exigentes. Dicho esto, Kubernetes se ha convertido en una opción predeterminada; de hecho, Kubernetes se incluye con Docker Enterprise Edition.

Advertencias de Docker

Los contenedores resuelven muchos problemas, pero no son panacea. Algunas de sus deficiencias son por diseño; algunas son subproductos de su naturaleza.

Los contenedores Docker no son máquinas virtuales: El error conceptual más común que las personas cometen con los contenedores es equipararlos con máquinas virtuales. Sin embargo, debido a que los contenedores y las máquinas virtuales usan diferentes mecanismos de aislamiento, tienen ventajas y desventajas claramente diferentes.

Las máquinas virtuales proporcionan un alto grado de aislamiento para los procesos, ya que se ejecutan en su propia instancia de un sistema operativo. Ese sistema operativo no tiene que ser el mismo que el que se ejecuta en el host. Una máquina virtual de Windows puede ejecutarse en un hipervisor de Linux y viceversa.

Los contenedores, por el contrario, usan porciones controladas de los recursos del sistema operativo anfitrión; muchas aplicaciones comparten el mismo núcleo del sistema operativo, de una manera altamente administrada. Como resultado, las aplicaciones en contenedores no están tan aisladas como las máquinas virtuales, pero proporcionan suficiente aislamiento para la gran mayoría de las cargas de trabajo.

Microsoft ofrece dos tipos de contenedores en Windows que difuminan ligeramente las líneas entre los contenedores y las máquinas virtuales:

  • Los contenedores de Windows Server son esencialmente contenedores estilo Docker en Windows. Microsoft proporcionó esencialmente el núcleo de Windows con algunos de los mismos mecanismos utilizados en Linux para realizar el aislamiento, por lo que los contenedores Docker podrían tener los mismos comportamientos en ambas plataformas.
  • Los Contenedores Hyper-V son contenedores que se ejecutan en su propia máquina virtual con su propio núcleo para un aislamiento adicional. Por lo tanto, Hyper-V Containers puede ejecutar diferentes versiones del kernel de Windows si es necesario. Los contenedores convencionales se pueden convertir a Contenedores Hyper-V si fuera necesario.

Tenga en cuenta que, aunque los contenedores de Hyper-V se ejecutan en el hipervisor Hyper-V y aprovechan el aislamiento de Hyper-V, siguen siendo un animal diferente de las máquinas virtuales en toda regla.

Los contenedores Docker no proporcionan velocidad al descubierto: Los contenedores no tienen casi la sobrecarga de las máquinas virtuales, pero su impacto en el rendimiento aún es medible. Si tiene una carga de trabajo que requiere una velocidad sin protección, un contenedor podría acercarlo lo suficiente, mucho más cerca que una VM, pero aún verá algo de sobrecarga.

Los contenedores Docker son apátridas e inmutables: Los contenedores se inician y ejecutan desde una imagen que describe su contenido. Esa imagen es inmutable por defecto: una vez creada, no cambia.

En consecuencia, los contenedores no tienen persistencia. Si inicia una instancia de contenedor, luego la mata y la reinicia, la nueva instancia de contenedor no tendrá ninguna de la información de estado asociada con la anterior.

Esta es otra forma en que los contenedores difieren de las máquinas virtuales. Una máquina virtual tiene persistencia en todas las sesiones de forma predeterminada, porque tiene su propio sistema de archivos. Con un contenedor, lo único que persiste es la imagen utilizada para arrancar el software que se ejecuta en el contenedor; la única forma de cambiar eso es crear una nueva imagen de contenedor revisada.

En el lado positivo, la orfandad de los contenedores hace que sus contenidos sean más consistentes y más fáciles de componer de forma predecible en las pilas de aplicaciones. También obliga a los desarrolladores a mantener los datos de las aplicaciones separados del código de la aplicación.

Si desea que un contenedor tenga cualquier tipo de estado persistente, debe ubicar ese estado en otro lugar. Eso podría ser una base de datos o un volumen de datos independiente conectado al contenedor en el momento del arranque.

Los contenedores Docker no son microservicios: Mencioné anteriormente cómo los contenedores se prestan para crear aplicaciones de microservicios. Eso no significa que tomar una aplicación determinada y pegarla en un contenedor creará automáticamente un microservicio. Una aplicación de microservicios debe construirse de acuerdo con un patrón de diseño de microservicio, ya sea que se implemente en contenedores o no. Es posible contenerizar una aplicación como parte del proceso de conversión a microservicio, pero eso es solo un paso entre muchos.

Cuando aparecieron las máquinas virtuales, permitieron desacoplar aplicaciones de los sistemas en los que se ejecutaban. Los contenedores Docker llevan esa idea varios pasos más allá, no solo por ser más livianos, más portátiles y más rápidos de girar que las máquinas virtuales, sino también por ofrecer características de escala, composición y administración que las máquinas virtuales no pueden.