Contenedores | Containers

Los Contenedores –Containers– son una solución al problema de cómo hacer que el software se ejecute confiablemente cuando se traslada de un entorno informático a otro. Esto podría ser desde la computadora portátil de un desarrollador a un entorno de prueba, desde un entorno de transición al de producción, y tal vez desde una máquina física en un centro de datos a una máquina virtual en una nube privada o pública [1].

Los Contenedores son un método de virtualización de un sistema operativo que permite ejecutar una aplicación junto con sus elementos dependientes, en un ambiente aislado e independiente. Los Contenedores permiten empaquetar fácilmente el código, las configuraciones y las dependencias de una aplicación en bloques fáciles de usar que ofrecen consistencia ambiental, eficiencia operativa, productividad para el desarrollador y control de versiones.

Los Contenedores pueden ayudar a garantizar que las aplicaciones se implementen de manera más rápida, confiable y consistente, independientemente del entorno de ejecución o despliegue. Los Contenedores también permiten un control más detallado de los recursos, lo que le brinda una mayor eficiencia en el uso de la infraestructura computacional [2].

¿Por qué los Contenedores?

En lugar de virtualizar el hardware como ocurre con el enfoque de las máquinas virtuales, los contenedores se virtualizan a nivel del sistema operativo, con múltiples contenedores ejecutándose directamente sobre el núcleo del sistema operativo. Esto significa que los Contenedores son mucho más livianos (necesitan menos memoria RAM), comparten el núcleo del sistema operativo, se inicializan –bootstrap– mucho más rápido y usan una fracción de la memoria en comparación con el que necesita un sistema operativo [3]

Los Contenedores aíslan las aplicaciones entre sí, a menos que se les conecte explícitamente. Eso significa que no existen dependencias conflictivas o contención de recursos, se establecen límites de recursos explícitos para cada servicio. Es importante destacar que se trata de una capa adicional de seguridad ya que sus aplicaciones no se ejecutan directamente en el sistema operativo host.

Ambiente Consistente

Los Contenedores brindan a los desarrolladores la capacidad de crear entornos predecibles que están aislados de otras aplicaciones. Los Contenedores también pueden incluir las dependencias de software que necesita la aplicación, como versiones específicas de los runtime, del lenguaje de programación y otras bibliotecas –librerías–de software. Desde la perspectiva del desarrollador, se garantiza que todo esto será coherente, independientemente de dónde se implemente la aplicación.

Todo esto se traduce en aumentos de la productividad, los desarrolladores y los equipos de operaciones de TI pasan menos tiempo depurando y diagnosticando las diferencias de los entornos, y más tiempo generando nuevas funcionalidades para los usuarios. Y esto significa menos errores, ya que los desarrolladores ahora pueden hacer suposiciones en entornos de desarrollo y prueba que pueden estar seguros de que serán ciertos en los entornos de producción.

Ejecución en Cualquier Lugar

Los Contenedores pueden ejecutarse literalmente en cualquier lugar, lo que facilita en gran medida el desarrollo y la implementación, sea en los sistemas operativos Linux, Windows y Mac; en máquinas virtuales o bare metal (servidor físico, no virtualizado); en una máquina de desarrollador o en centros de datos locales; y por supuesto, en la nube pública. La popularidad generalizada del formato de imagen Docker para contenedores ayuda aún más con la portabilidad.

Aislamiento

Los contenedores virtualizan la CPU, la memoria, el almacenamiento y los recursos de red en el nivel del sistema operativo, proporcionando a los desarrolladores una vista de espacio aislado del sistema operativo y lógicamente aislado de otras aplicaciones. En otras palabras generan un ambiente de silo.

Impacto en los Procesos TI

Como fue el caso con la Virtualización, los Contenedores traen consigo una cantidad de impactos positivos en los procesos TI. El primero gira alrededor de la gestión. En procesos tradicionales, operaciones de TI tiene mucha responsabilidad, que a menudo no se comparte con el grupo de desarrollo u otras áreas de la organización [5]. Algunos procesos tradicionales incluyen el uso de máquinas virtuales, actualización periódica del software, nuevas implementaciones del servidor físico, sincronización entornos de prueba / desarrollo y producción, gestión de la seguridad, y mucho más.

En el frente de gestión, herramientas como Docker Enterprise Edition proporcionan agilidad, portabilidad, control, y la seguridad necesaria para ejecutar entornos de Contenedores a gran escala. Aquí hay dos ejemplos de mejoramiento:

  • El impacto de la actualización de los Martes se reduce. Cada mes, Microsoft lanza una serie de actualizaciones destinadas a cerrar agujeros en sus sistemas operativos y productos de aplicación. Con menos sistemas operativos subyacentes para administrar gracias a mayor densidad de carga de trabajo, el impacto del Patch Tuesday es reducido.
  • Se facilita el ciclo de actualización del servidor. Más densidad de carga de trabajo equivale a menos servidores, lo que resulta en una reducción general en la carga de trabajo relacionada con los ciclos de actualización del hardware.

Diferencias entre Contenedores y Virtualización

Con la tecnología de Virtualización, el paquete que se puede pasar es una máquina virtual que incluye todo un sistema operativo y la aplicación. Un servidor físico que ejecute tres máquinas virtuales tendrá un hipervisor y tres sistemas operativos separados que se ejecutarán encima.

Por el contrario, un servidor que ejecuta tres aplicaciones en contenedor con Docker, por ejemplo, ejecuta un único sistema operativo, y cada contenedor comparte el kernel del sistema operativo con los otros contenedores. Las partes compartidas del sistema operativo son de solo lectura, mientras que cada contenedor tiene su propio montaje (es decir, una forma de acceder al Contenedor) para la escritura. Eso significa que los contenedores son mucho más livianos y usan muchos menos recursos que las máquinas virtuales. Gráficamente se tiene:

Contenedor

Seguridad

Muchas personas creen que los Contenedores son menos seguros que las máquinas virtuales porque si hay una vulnerabilidad en el núcleo del host del Contenedor, que podría permitir una forma de entrar en los contenedores que lo están compartiendo. Eso también es cierto con un hipervisor, pero dado que un hipervisor proporciona mucha menos funcionalidad que un kernel de Linux (que generalmente implementa sistemas de archivos, redes, controles de procesos de aplicaciones, etc.) presenta una espacio de ataque mucho más pequeño. Pero en los últimos años se ha dedicado un gran esfuerzo al desarrollo de software para mejorar la seguridad de los Contenedores.

Por ejemplo, Docker y otros sistemas de Contenedores ahora incluyen una infraestructura de firma que permite a los administradores firmar imágenes de Contenedores para evitar que se implementen aquellos que no son de confianza.

Sin embargo, no es necesariamente el caso que un Contenedor confiable y firmado sea seguro para ejecutarse, ya que se pueden descubrir vulnerabilidades en algunos de los elementos de software cargados en el Contenedor, después de que éste se haya firmado. Por esa razón, Docker y otros ofrecen soluciones de escaneo de seguridad de contenedores que pueden notificar a los administradores si las imágenes de los contenedores tienen vulnerabilidades que podrían explotarse.

También se ha desarrollado un software de seguridad de Contenedores más especializado. Por ejemplo, Twistlock ofrece software que perfila el comportamiento esperado de un Contenedor y los procesos de “lista blanca”, actividades de red (como direcciones IP y puertos de origen y destino) e incluso ciertas prácticas de almacenamiento para que cualquier comportamiento malicioso o inesperado pueda ser detectado.

Otra empresa especializada en seguridad de Contenedores llamada Polyverse toma un enfoque diferente. Aprovecha el hecho de que los Contenedores se pueden iniciar en una fracción de segundo para reiniciar las aplicaciones en Contenedores en un estado conocido cada pocos segundos para minimizar el tiempo que un hacker tiene para explotar una aplicación que se ejecuta en un Contenedor.

Docker

Docker [4] se ha convertido en sinónimo de tecnología de Contenedores porque ha sido el más exitoso en popularizarlo. Pero la tecnología de Contenedores no es nueva; se ha integrado en Linux en forma de LXC durante más de 10 años, y una virtualización similar a nivel de sistema operativo también ha sido ofrecida por FreeBSD Jails, AIX Workload Partitions y Solaris Containers.

Docker Community Edition (CE) es gratis para que cualquiera lo use. Esta versión de Docker es de código abierto y se puede utilizar en una variedad de plataformas, incluidas Windows, Mac y Linux. Puede instalarse Docker CE en su computadora o en una instancia de máquina virtual Amazon EC2, o puede comenzar a usarlo inmediatamente con AMI optimizado para Amazon ECS.

Docker Enterprise Edition (EE) agrega características adicionales para la administración y seguridad del flujo de trabajo y es una suscripción paga disponible a través de AWS Marketplace.

Casos de Uso de Contenedores

Aplicaciones Distribuidas y Microservicios

Se usan Contenedores para crear aplicaciones distribuidas, dividiendo la aplicación en tareas o procesos independientes, como ser microservicios. Por ejemplo, puede tener Contenedores separados para: el servidor web, el servidor de aplicaciones, la cola de mensajes, y las tareas de back-end. Los Contenedores son ideales para ejecutar tareas o procesos únicos, por lo que se pueden usar Contenedores como la unidad base para una tarea y escalar cuanto sea necesario. Cada componente de la aplicación se puede hacer a partir de diferentes imágenes de Contenedores. Los Contenedores Docker proporcionan aislamiento a los procesos, permitiendo ejecutar y escalar los diferentes componentes, independientemente del lenguaje de programación o de las bibliotecas que se ejecutan en cada Contenedor.

Batch / ETL

Se puede usar Contenedores para trabajos por lotes –batch– y ETL – Extract, Transform and Load– al empaquetar el trabajo en un Contenedor y desplegarlo en un clúster compartido. Pueden ejecutar diferentes versiones del mismo trabajo o múltiples trabajos en el mismo clúster o incluso la misma instancia, ya que los Contenedores están aislados. También se pueden compartir la capacidad del clúster con otros procesos, como aplicaciones, y aprovechar las fluctuaciones en la carga del clúster. Pueden comenzar trabajos rápidamente y hacer crecer la carga de trabajo dinámicamente en respuesta a la demanda, mejorando la utilización de los recursos.

Integración Continua e Implementación Continua

El uso de  Contenedores para una integración e implementación continua es posible porque Docker proporciona un sistema para el control de versiones de imágenes. Puede configurarse un proceso de compilación para extraer el código de un repositorio, compilarlo, empaquetarlo en una imagen Docker y enviar la imagen recién creada a un repositorio de imágenes. A continuación, puede hacerse que el proceso de implementación extraiga la nueva imagen de su repositorio, pruebe la aplicación y la implemente en los servidores de producción. Pudiendo evitar tener una aplicación que funcione en su entorno de desarrollo pero falle en la producción porque el daemon de Docker es el mismo en todas las máquinas de desarrollo, montaje y producción.

Referencias

[1] https://www.cio.com/article/2924995/software/what-are-containers-and-why-do-you-need-them.html

[2] https://aws.amazon.com/what-are-containers/

[3] https://cloud.google.com/containers/

[4] https://www.docker.com/what-container

[5] https://www.saturnb2b.com/wp-content/uploads/2017/12/Pub-10010-Containers-for-Dummies.pdf

6 comentarios en «Contenedores | Containers»

Deja un comentario