Introducción a Docker

Introducción

La contenerización es el proceso de distribuir y desplegar aplicaciones de forma portátil y predecible. Esto se logra mediante el empaquetado de componentes y sus dependencias, en entornos de procesos aislados, ligeros y estandarizados llamados contenedores.

Muchas organizaciones están interesadas en diseñas aplicaciones y servicios que puedan ser desplegadas con facilidad en sistemas distribuidos, permitiendo al sistema escalar facilmente y sobrevivir ante las fallas de la máquina y aplicación.

Docker, una plataforma de desarrollo para simplificar y estandarizar el despliegue en varios ambientes, fue en gran medida fundamental para estimular la adopción de este estilo de diseño y administración de servicios. Una gran cantidad de software ha sido creada para construir sobre este ecosistema de administración de contenedores distribuidos.

Docker y la contenerización

Docker es el software de contenerización más utilizado hoy día.

Si bien existen otros sistemas de contenerización, Docker hace la creación y administración de contenedores simple e integra diversas herramientas de código abierto.

En la imagen de arriba, puedes ver (en una vista simplificada) cómo se relacionan los contenedores con el sistema host. Los contenedores aíslan las aplicaciones individuales y utilizan los recursos del sistema operativo que Docker ha abstraído. En la vista detallada de la derecha, podemos ver que los contenedores se pueden construir mediante “capas”, con múltiples contenedores que comparten capas subyacentes, lo que reduce el uso de recursos.

Las principales ventajas de Docker son:

  • Uso ligero de los recursos: en lugar de virtualizar un sistema operativo completo, los contenedores se aíslan en el nivel de proceso y utilizan el kernel del host.
  • Portabilidad: todas las dependencias para una aplicación en contenedor están agrupadas dentro del contenedor, lo que le permite ejecutarse en cualquier Docker host.
  • Previsibilidad: el host no se preocupa por lo que se está ejecutando dentro del contenedor y el contenedor no se preocupa por qué host se está ejecutando. Las interfaces están estandarizadas y las interacciones son predecibles.

Normalmente, al diseñar una aplicación o servicio para usar Docker, funciona mejor para desglosar la funcionalidad en contenedores individuales, una decisión de diseño conocida como arquitectura orientada a servicios. Esto te brinda la posibilidad de escalar o actualizar componentes fácilmente de manera independiente en el futuro. Tener esta flexibilidad es una de las muchas razones por las que las personas están interesadas en Docker para el desarrollo y la implementación.

Descubrimiento de servicios y almacenes de configuración global

Service Discovery es uno de los componentes de una estrategia global dirigida a hacer que las implementaciones de contenedores sean escalables y flexibles. El descubrimiento de servicios se utiliza para que los contenedores puedan conocer el entorno en el que se han introducido sin la intervención del administrador.

Pueden encontrar información de conexión para los componentes con los que deben interactuar y pueden registrarse para que otras herramientas sepan que están disponibles. Estas herramientas también suelen funcionar como almacenes de configuración distribuidos globalmente, donde se pueden establecer ajustes de configuración arbitrarias para los servicios que operan en su infraestructura.

En la imagen anterior, puedes ver un flujo de ejemplo en el que una aplicación registra su información de conexión con el sistema de servicio de descubrimiento. Una vez registradas, otras aplicaciones pueden consultar el servicio de descubrimiento para averiguar cómo conectarse a la aplicación.

Estas herramientas a menudo se implementan como almacenes clave-valor simples que se distribuyen entre los hosts en un entorno agrupado. En general, los almacenes de valores clave proporcionan una API HTTP para acceder y establecer valores. Algunos incluyen medidas de seguridad adicionales como entradas cifradas o mecanismos de control de acceso. Los almacenes distribuidos son esenciales para administrar los hosts de Docker agrupados además de su función principal de proporcionar detalles de autoconfiguración para nuevos contenedores.

Algunas de las responsabilidades de los almacenes de descubrimiento de servicios son:

  • Permitir que las aplicaciones obtengan los datos necesarios para conectarse con los servicios de los que dependen.
  • Permitir que los servicios registren su información de conexión para el propósito anterior.
  • Proporcionar una ubicación accesible globalmente para almacenar datos de configuración arbitrarios.
  • Almacenar información sobre los miembros del clúster según sea necesario por cualquier software de administración de clústeres

Algunas herramientas de descubrimiento de servicios populares y proyectos relacionados son:

  • etcd: descubrimiento de servicios/almacén de valor-clave distribuido globalmente
  • consul: descubrimiento de servicios/almacén de valor-clave distribuido globalmente
  • zookeeper: descubrimiento de servicios/almacén de valor-clave distribuido globalmente
  • crypt: proyecto para cifrar entradas etcd
  • confd: observa cambios en el almacén de valores clave y desencadena la reconfiguración de servicios con nuevos valores

Herramientas de red

Las aplicaciones en contenedores se prestan a un diseño orientado a servicios que fomenta la funcionalidad en componentes discretos. Si bien esto facilita la administración y el escalado, requiere aún más seguridad con respecto a la funcionalidad y confiabilidad de las redes entre los componentes. Docker proporciona las estructuras básicas de red necesarias para la comunicación de contenedor a contenedor y de contenedor a host.

Las capacidades de red nativas de Docker proporcionan dos mecanismos para conectar contenedores. La primera es exponer los puertos de un contenedor y, opcionalmente, asignar al sistema host para enrutamiento externo. Puedes seleccionar el puerto de host para asignar o permitir que Docker elija aleatoriamente un puerto alto, no utilizado. Esta es una forma genérica de proporcionar acceso a un contenedor que funciona bien para la mayoría de los propósitos.

El otro método es permitir que los contenedores se comuniquen mediante los “enlaces” de Docker. Un contenedor vinculado obtendrá información de conexión sobre su contraparte, lo que le permitirá conectarse automáticamente si está configurado para prestar atención a esas variables. Esto permite el contacto entre contenedores en el mismo host sin tener que saber de antemano el puerto o la dirección donde se ubicará el servicio.

Este nivel básico de redes es adecuado para entornos de host único o administrados de manera cercana. Sin embargo, el ecosistema de Docker ha producido una variedad de proyectos que se centran en expandir la funcionalidad de red disponible para operadores y desarrolladores.

Algunas capacidades de red adicionales disponibles a través de herramientas incluyen:

  • Superponer redes para simplificar y unificar el espacio de direcciones en varios hosts.
  • Redes privadas virtuales adaptadas para proporcionar una comunicación segura entre varios componentes.
  • Asignación de subredes por host o por aplicación
  • Estableciendo interfaces macvlan para la comunicación.
  • Configuración de direcciones MAC personalizadas, puertas de enlace, etc. para sus contenedores

Algunos proyectos que están involucrados en la mejora de la red Docker son:

  • flannel: Red de superposición que proporciona a cada host una subred independiente.
  • weave: Superposición de la red que representa todos los contenedores en una sola red.
  • pipework: kit de herramientas de red avanzada para configuraciones de red arbitrariamente avanzadas.

Programación, gestión de clústeres y orquestación

Otro componente necesario para construir un entorno de contenedor en clúster es un programador. Los programadores son responsables de iniciar los contenedores en los hosts disponibles.

La imagen de arriba demuestra una decisión de programación simplificada. La solicitud se da a través de una API o herramienta de gestión. Desde aquí, el programador evalúa las condiciones de la solicitud y el estado de los hosts disponibles. En este ejemplo, extrae información sobre la densidad del contenedor de un servicio de descubrimiento/almacenamiento de datos distribuidos (como se explicó anteriormente) para que pueda colocar la nueva aplicación en el host menos ocupado.

Este proceso de selección de host es una de las responsabilidades principales del programador. Por lo general, tiene funciones que automatizan este proceso y el administrador tiene la opción de especificar ciertas restricciones. Algunas de estas restricciones pueden ser:

  • Programar el contenedor en el mismo host que otro contenedor dado.
  • Asegurarse de que el contenedor no esté ubicado en el mismo host que otro contenedor dado.
  • Colocar el contenedor en un host con una etiqueta o metadatos coincidentes.
  • Ubicar el contenedor en el host menos ocupado.
  • Ejecutar el contenedor en cada host en el clúster.

El programador es responsable de cargar los contenedores en los hosts relevantes y de iniciar, detener y administrar el ciclo de vida del proceso.

Debido a que el programador debe interactuar con cada host en el grupo, las funciones de administración de clústeres también suelen incluirse. Esto permite al programador obtener información sobre los miembros y realizar tareas de administración. La orquestación en este contexto generalmente se refiere a la combinación de la programación de contenedores y la administración de hosts.

Algunos proyectos populares que funcionan como programadores y herramientas de administración de flotas son:

  • fleet: programador y herramienta de gestión de clústeres.
  • marathon: planificador y herramienta de gestión de servicios.
  • Swarm: programador y herramienta de gestión de servicios.
  • mesos: servicio de abstracción del host que consolida los recursos del host para el programador.
  • kubernetes: planificador avanzado capaz de gestionar grupos de contenedores.
  • compose: herramienta de organización de contenedores para crear grupos de contenedores.

Conclusión

A estas alturas, ya deberías estar familiarizado con la función general de la mayoría del software asociado con el ecosistema Docker. Docker, junto con todos los proyectos de soporte, proporciona una estrategia de administración, diseño e implementación de software que permite una escalabilidad masiva.

Al comprender y aprovechar las capacidades de varios proyectos, puedes ejecutar despliegues de aplicaciones complejas que son lo suficientemente flexibles para tener en cuenta los requisitos operativos variables.