¿Qué es Docker? La chispa de la revolución de los contenedores

Docker es una plataforma de software para crear aplicaciones basadas en contenedores : entornos de ejecución pequeños y livianos que hacen uso compartido del kernel del sistema operativo pero que, por lo demás, se ejecutan de forma aislada entre sí. Si bien los contenedores como concepto han existido durante algún tiempo, Docker, un proyecto de código abierto lanzado en 2013, ayudó a popularizar la tecnología y ha ayudado a impulsar la tendencia hacia la contenedorización y los microservicios  en el desarrollo de software que se conoce como nativo de la nube. desarrollo.

¿Qué son los contenedores?

Uno de los objetivos del desarrollo de software moderno es mantener las aplicaciones en el mismo host o clúster aisladas unas de otras para que no interfieran indebidamente con el funcionamiento o el mantenimiento de las demás. Esto puede resultar difícil, gracias a los paquetes, bibliotecas y otros componentes de software necesarios para su ejecución. Una solución a este problema han sido las máquinas virtuales, que mantienen las aplicaciones en el mismo hardware completamente separadas y reducen al mínimo los conflictos entre los componentes de software y la competencia por los recursos de hardware. Pero las máquinas virtuales son voluminosas (cada una requiere su propio sistema operativo, por lo que normalmente tienen un tamaño de gigabytes) y son difíciles de mantener y actualizar.

Los contenedores , por el contrario, aíslan los entornos de ejecución de las aplicaciones entre sí, pero comparten el kernel del sistema operativo subyacente. Por lo general, se miden en megabytes, usan muchos menos recursos que las máquinas virtuales y se inician casi de inmediato. Se pueden empaquetar mucho más densamente en el mismo hardware y girar hacia arriba y hacia abajo en masa con mucho menos esfuerzo y gastos generales. Los contenedores proporcionan un mecanismo altamente eficiente y 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 mantenidos.

Estibador

¿Qué es Docker?

Docker es un proyecto de código abierto que facilita la creación de contenedores y aplicaciones basadas en contenedores. Originalmente construido para Linux, Docker ahora también se ejecuta en Windows y MacOS. Para comprender cómo funciona Docker, echemos un vistazo a algunos de los componentes que usaría para crear aplicaciones en contenedores de Docker.

Dockerfile

Cada contenedor de Docker comienza con un Dockerfile . Un Dockerfile es un archivo de texto escrito en una sintaxis fácil de entender que incluye las instrucciones para crear una imagen de Docker (más sobre eso en un momento). Un Dockerfile especifica el sistema operativo que será la base del contenedor, junto con los idiomas, las variables ambientales, las ubicaciones de los archivos, los puertos de red y otros componentes que necesita y, por supuesto, lo que realmente hará el contenedor una vez que lo ejecutemos.

Paige Niedringhaus de ITNext tiene un buen desglose de la sintaxis de un Dockerfile.

Imagen de Docker

Una vez que haya escrito su Dockerfile, invoca la buildutilidad Docker para crear una imagen basada en ese Dockerfile. Mientras que Dockerfile es el conjunto de instrucciones que indica buildcómo crear la imagen, una imagen de Docker es un archivo portátil que contiene las especificaciones para qué componentes de software se ejecutará el contenedor y cómo. Debido a que un Dockerfile probablemente incluirá instrucciones sobre cómo obtener algunos paquetes de software de repositorios en línea, debe tener cuidado de especificar explícitamente las versiones adecuadas, o de lo contrario su Dockerfile podría producir imágenes inconsistentes dependiendo de cuándo se invoque. Pero una vez que se crea una imagen, es estática. Codefresh ofrece un vistazo a cómo crear una imagen con más detalle.

Ejecución de Docker

La runutilidad de Docker es el comando que realmente lanza un contenedor. Cada contenedor es una instancia de una imagen. Los contenedores están diseñados para ser transitorios y temporales, pero se pueden detener y reiniciar, lo que lanza el contenedor al mismo estado que cuando se detuvo. Además, se pueden ejecutar simultáneamente varias instancias de contenedor de la misma imagen (siempre que cada contenedor tenga un nombre único). La revisión de código tiene un gran desglose de las diferentes opciones para el runcomando, para darle una idea de cómo funciona.

Docker Hub

Si bien la construcción de contenedores es fácil, no se crea la idea de que necesitará construir todas y cada una de sus imágenes desde cero. Docker Hub es un repositorio SaaS para compartir y administrar contenedores, donde encontrará imágenes oficiales de Docker de proyectos de código abierto y proveedores de software e imágenes no oficiales del público en general. Puede descargar imágenes de contenedor que contengan código útil o cargar las suyas propias, compartirlas abiertamente o convertirlas en privadas. También puede crear un registro de Docker local si lo prefiere. (Docker Hub ha tenido problemas en el pasado con imágenes que se cargaron con puertas traseras integradas).

Motor de Docker

Docker Engine es el núcleo de Docker, la tecnología cliente-servidor subyacente que crea y ejecuta los contenedores. En términos generales, cuando alguien dice Docker de forma genérica y no se refiere a la empresa o al proyecto en general, se refiere a Docker Engine. Se ofrecen dos versiones diferentes de Docker Engine: Docker Engine Enterprise y Docker Engine Community.

Edición de la comunidad de Docker

Docker lanzó su Enterprise Edition en 2017, pero su oferta original, rebautizada como Docker Community Edition, sigue siendo de código abierto y gratuito, y no perdió ninguna característica en el proceso. En cambio, Enterprise Edition, que cuesta $ 1,500 por nodo por año, agregó funciones de administración avanzadas que incluyen controles para la administración de imágenes y clústeres, y monitoreo de vulnerabilidades. El blog de BoxBoat tiene un resumen de las diferencias entre las ediciones.

Cómo Docker conquistó el mundo de los contenedores

La idea de que un proceso determinado puede ejecutarse con cierto grado de aislamiento del resto de su entorno operativo se ha incorporado a los sistemas operativos Unix como BSD y Solaris durante décadas. La tecnología de contenedor de Linux original, LXC, es un método de virtualización a nivel de SO para ejecutar varios sistemas Linux aislados en un solo host. LXC fue posible gracias a dos características de Linux: espacios de nombres, que envuelven un conjunto de recursos del sistema y los presentan a un proceso para que parezca que están dedicados a ese proceso; y cgroups, que gobiernan el aislamiento y el uso de los recursos del sistema, como CPU y memoria, para un grupo de procesos.

Los contenedores desacoplan las 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. Y debido a que el sistema operativo se abstrae de los contenedores, puede mover un contenedor a través de cualquier servidor Linux que admita el entorno 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 de Docker, puede implementar, replicar, mover y realizar copias de seguridad de una carga de trabajo de manera aún más rápida y sencilla de lo que puede hacerlo con máquinas virtuales. Docker brinda una flexibilidad similar a la de la nube a cualquier infraestructura capaz de ejecutar contenedores. Las herramientas de imágenes de contenedores de Docker también fueron un avance sobre LXC, lo que le permitió a un desarrollador crear bibliotecas de imágenes, componer aplicaciones a partir de múltiples imágenes y lanzar esos contenedores y aplicaciones en una infraestructura local o remota.

Docker Compose, Docker Swarm y Kubernetes

Docker también facilita la coordinación de comportamientos entre contenedores y, por lo tanto, crea pilas de aplicaciones uniendo contenedores. Docker Compose fue creado por Docker para simplificar el proceso de desarrollo y prueba de aplicaciones de varios contenedores. Es una herramienta de línea de comandos, que recuerda al cliente Docker, que toma un archivo descriptor especialmente formateado para ensamblar aplicaciones a partir de múltiples contenedores y ejecutarlas en conjunto en un solo host. (Consulte el tutorial de Docker Compose para obtener más información).

Otros productos, como Docker Swarm y Kubernetes, ofrecen versiones más avanzadas de estos comportamientos, lo que se denomina orquestación de contenedores . Pero Docker proporciona lo básico. Aunque Swarm surgió del proyecto Docker, Kubernetes se ha convertido en la plataforma de orquestación de Docker preferida de facto .

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 limitación

Los contenedores de Docker mantienen las aplicaciones aisladas no solo entre sí, sino también del sistema subyacente. Esto no solo hace que la pila de software sea más limpia, sino que también facilita la determinación de cómo una aplicación en contenedores determinada utiliza los 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 de Docker no tienen estado 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 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 que admita contenedores. Todas las dependencias de la aplicación se entregan normalmente en el mismo contenedor.

Las aplicaciones basadas en contenedores se pueden mover fácilmente de sistemas locales a entornos en la nube o de las computadoras portátiles de los desarrolladores a los servidores, siempre que el sistema de destino sea compatible con Docker y cualquiera de las herramientas de terceros que puedan estar en uso con él, como Kubernetes (consulte "Los contenedores de Docker facilitan la orquestación y el escalado" a continuación).

Normalmente, las imágenes del contenedor de Docker deben crearse 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 ejecutar el contenedor en la máquina virtual.

Sin embargo, el equipo de Docker ha ideado desde entonces una solución más elegante, denominada  manifiestos , que permite empaquetar imágenes para múltiples sistemas operativos una al lado de la otra en la misma imagen. Los manifiestos todavía se consideran experimentales, pero dan una pista de cómo los contenedores podrían convertirse en una solución de aplicación multiplataforma, así como en una solución entre entornos. 

Los contenedores Docker permiten componibilidad

La mayoría de las aplicaciones comerciales constan de varios componentes separados organizados en una pila: un servidor web, una base de datos, un caché en memoria. Los contenedores permiten componer estas piezas en una unidad funcional con piezas fácilmente cambiables. Cada pieza es proporcionada por un contenedor diferente y se puede mantener, actualizar, intercambiar y modificar 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 independientes e independientes, el modelo de microservicios ofrece un antídoto para ralentizar los procesos de desarrollo tradicionales y las aplicaciones monolíticas inflexibles. Los contenedores ligeros y portátiles facilitan la creación y el mantenimiento de aplicaciones basadas en microservicios.

Los contenedores Docker facilitan la orquestación y el escalado

Debido a que los contenedores son livianos e imponen pocos gastos generales, es posible lanzar muchos más en un sistema determinado. Pero los contenedores también se pueden utilizar para escalar una aplicación en grupos de sistemas y para aumentar o disminuir los servicios para satisfacer los picos de demanda o para conservar recursos.

Las versiones más empresariales de las herramientas para la implementación, la gestión y el escalado de contenedores se proporcionan mediante proyectos de terceros. El principal de ellos es Kubernetes de Google, un sistema para automatizar cómo se implementan y escalan los contenedores, pero también cómo se conectan, equilibran la carga y administran. Kubernetes también proporciona formas de crear y reutilizar definiciones de aplicaciones de varios contenedores o "gráficos de Helm", de modo que se puedan crear y administrar pilas de aplicaciones complejas a pedido.

Docker también incluye su propio sistema de orquestación incorporado, el modo Swarm, que todavía se usa para casos que son 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 la panacea. Algunas de sus deficiencias son de diseño, mientras que otras son subproductos de su diseño.

Los contenedores Docker no son máquinas virtuales

El error conceptual más común que cometen las personas 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 tampoco 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, utilizan porciones controladas de los recursos del sistema operativo host; muchas aplicaciones comparten el mismo kernel de sistema operativo, de una manera altamente administrada. Como resultado, las aplicaciones en contenedores no están tan completamente aisladas como las máquinas virtuales, pero brindan suficiente aislamiento para la gran mayoría de las cargas de trabajo.

Los contenedores Docker no brindan una velocidad completa