Queremos hacer hincapié de que esto no pretende ser las tablas de la ley, en lo que respecta a los Contenedores. Sino que más bien el objetivo es dar una guía introductoria al Desarrollo Orientado a Microservicios, utilizando Contenedores. Hecha la aclaración, comenzamos.
Los contenedores están explotando en la escena del desarrollo de aplicaciones, especialmente cuando se trata de La Computación en La Nube. Esto se debe principalmente a que la portabilidad ha sido un gran abismo en esta área, dada la naturaleza patentada de algunas nubes públicas, y esta tecnología abstrae las aplicaciones en contenedores virtuales que se pueden mover de una nube a otra.
La arquitectura de Los Contenedores es el otro gran beneficio. Ahora hay una forma estándar de dividir las aplicaciones en objetos distribuidos o contenedores. Seccionar las aplicaciones de esta manera ofrece la posibilidad de ubicarlas en diferentes máquinas físicas y/o virtuales, en La Nube Privada, La Nube Pública o La Nube Híbrida. Esta flexibilidad ofrece más ventajas en torno a la gestión de la carga de trabajo, proporcionando la capacidad de crear fácilmente sistemas tolerantes a fallos.
Además, con el uso de la tecnología de agrupación, programación y orquestación, los desarrolladores pueden garantizar que las aplicaciones que existen dentro de los contenedores, puedan escalar y ser resistentes. Estas herramientas pueden administrar grupos de contenedores utilizando una capa de administración de contenedores bien definida, que proporciona estas capacidades. A medida que el mundo de los contenedores continúa evolucionando y creciendo, se está volviendo difícil construir aplicaciones "contenerizadas" sin estas capas de administración.
Finalmente, la popularidad de los contenedores ha llevado a muchas grandes empresas, como AWS, HP, IBM y otras a jurar lealtad a ellos. Esto proporciona soporte directamente desde las herramientas y tecnología empresariales existentes. También están apareciendo numerosas startups bien financiadas, con soluciones innovadoras para hacer que el desarrollo de contenedores sea mucho más interesante y productivo.
¿Qué significa todo esto para los ingenieros de software? Para responder a esta pregunta, aquí hay una "Guía para Aprovechar los Contenedores de Software" para gerentes y personal dedicado a desarrollo de aplicaciones, lo más centrada en lo que es más importante.
Lo Básico
Docker, el estándar de plataforma de ejecución para contenedores más popular, es un proyecto de código abierto que proporciona una manera de automatizar la implementación de aplicaciones dentro de contenedores de software. Docker es el que realmente comenzó el movimiento del contenedores. Sin embargo, no es el único juego en la ciudad. Empresas como CoreOS tienen su propio estándar de contenedor llamado Rocket, y muchos estándares y productos se están construyendo alrededor de estas tecnologías.
No deje que los contenedores le asusten. Este tipo de enfoque no es nada nuevo: los contenedores se han utilizado durante años como un enfoque para componentes de sistemas completos, abstrayéndolos de la plataforma física, permitiéndole moverlos de una plataforma a otra (o de una nube a otra).
Por ser ya prácticamente un "estándar de facto", centrémonos en Docker por ahora. El kernel de Linux, que está en el contenedor, permite el aislamiento de recursos (CPU, memoria, E/S, red, etc.) y no requiere iniciar ninguna máquina virtual. ¿Cómo? Aquí las palabras clave son "no requiere".
Docker extiende un formato de contenedor común llamado Linux Containers (LXC), con una API de alto nivel que proporciona una solución de virtualización ligera que ejecuta procesos de forma aislada. Docker también proporciona espacios de nombres para aislar por completo la vista de una aplicación del entorno operativo, incluidos los árboles de procesos, la red, las ID de usuario y los sistemas de archivos.
El uso de esta tecnología es bastante emocionante, ya que resuelve un problema obvio y expansivo: ¿cómo proporcionar una verdadera portabilidad de aplicaciones entre plataformas en la nube? Ese sueño tan antiguo de quienes alguna vez programamos que se basaba en la frase "programar una vez, ejecutar donde sea".
Si bien las cargas de trabajo ciertamente se pueden colocar en máquinas virtuales, el uso de contenedores es un enfoque mucho mejor y debería tener una mayor probabilidad de éxito a medida que la computación en la nube pasa de arquitecturas simples a complejas.
La capacidad de proporcionar una abstracción de plataforma liviana dentro del la plataforma para contenedores Docker, sin usar la virtualización, es mucho más eficiente para crear paquetes de carga de trabajo que sean transportables entre nubes. En muchos casos, la virtualización puede resultar demasiado engorrosa y/o pesada para la migración de la carga de trabajo. Por lo tanto, los contenedores proporcionan una base real para mover las cargas de trabajo dentro de entornos híbridos o de múltiples nubes sin tener que alterar gran parte de la aplicación.
Aquí un mantra que puede ayudar: -"Es posible ejecutar Contenedores sobre Máquinas Virtuales, pero no es posible ejecutar Máquinas Virtuales sobre Contenedores"-
Qué es importante
Los contenedores tienen algunas características y ventajas básicas, incluida la capacidad de:
- Reducir la complejidad a través de abstracciones de contenedores. Los contenedores no requieren dependencias de la infraestructura de la aplicación. Por lo tanto, no necesita una interfaz nativa compleja para manejar los servicios de la plataforma.
- Aprovechan la automatización para maximizar la portabilidad. La automatización reemplazó las secuencias de comandos manuales. En estos días, es mucho más difícil garantizar la portabilidad cuando se usa la automatización.
- Proporcionan una mejor seguridad y gobernanza, externas a los contenedores. Los servicios de seguridad y gobernanza son específicos de la plataforma, no específicos de la aplicación. Colocar los servicios de seguridad y gobierno fuera del contenedor reduce significativamente la complejidad.
- Proporcionan capacidades mejoradas de computación distribuida. Esto se debe al hecho de que una aplicación se puede dividir en muchos dominios, todos los cuales residen en contenedores. El aspecto de portabilidad de los contenedores significa que pueden ejecutarse en varias plataformas diferentes en la nube. Esto permite a los ingenieros elegir y elegir las plataformas en las que se ejecutan, en función de los costos y la eficiencia del rendimiento.
- Proporcionan servicios de automatización que aprovechen la optimización basada en políticas. Es necesario que haya una capa de automatización que pueda localizar la mejor plataforma para ejecutar y migrar automáticamente a esa plataforma. Al mismo tiempo, debe lidiar automáticamente con los cambios de configuración necesarios.
Cómo escalar aplicaciones basadas en contenedores
La mayoría de los que buscan escalar contenedores toman uno de dos enfoques básicos. El primer enfoque es crear un sistema personalizado para administrar los contenedores. Esto significa un sistema único que crea para lanzar automáticamente nuevas instancias de contenedor según sea necesario para manejar una carga de procesamiento cada vez mayor. Pero recuerde que si lo construye, lo posee. Al igual que con muchos enfoques de bricolaje, el mantenimiento requerirá mano de obra y costos.
El segundo enfoque es aprovechar una de las tecnologías de organización, programación y agrupación de contenedores que proporcionarán los mecanismos básicos para permitir la escalabilidad. Esta es normalmente la mejor de las dos opciones.
Hay algunas opciones para el segundo enfoque:
Primero, Kubernetes de Google es un administrador de clúster de contenedores de código abierto, muy parecido a Docker Swarm (se trata a continuación). Kubernetes puede programar cualquier cantidad de réplicas de contenedor en un grupo de instancias de nodo. Este truco de replicación y distribución de contenedores suele ser suficiente para que la mayoría de las aplicaciones grandes basadas en contenedores se escalen según sea necesario. Este es prácticamente el mismo enfoque para escalar contenedores que las otras herramientas.

Finalmente, la herramienta más nueva, Docker Swarm proporciona capacidades de agrupamiento, programación e integración. Esta herramienta permite a los desarrolladores crear y enviar aplicaciones distribuidas de múltiples contenedores/hosts que incluyen el escalado y la gestión necesarios para sistemas basados en contenedores. Obviamente, Swarm está diseñado para competir con Kubernetes, que tiene una mayor participación en el mercado. Considere ambas herramientas cuando sea necesario escalar masivamente los contenedores. Sugeriría una prueba de concepto con cada tecnología, utilizando cargas de trabajo del mundo real.
Aquí un mantra que puede ayudar: -"Docker es el navío, Kubernetes es el timonel."- La palabra Kubernetes viene del griego κυβερνήτης, que significa "timonel", "piloto" o "gobernador".
Las mejores prácticas continúan surgiendo en torno a los contenedores de escala, que incluyen:
- Dedique tiempo a la arquitectura de sus aplicaciones basadas en contenedores. La mayoría de los problemas de escalado se remontan a diseños pobres, no a tecnología deficiente.
- Siempre haga una prueba de concepto para determinar las capacidades reales de escalado de las soluciones que está considerando. Utilice herramientas de prueba automatizadas para simular las cargas de trabajo y cantidades masivas de datos para las pruebas.
- Considere sus propios requisitos. Lo que funciona para otras grandes empresas puede no ser adecuado para sus aplicaciones basadas en contenedores.
- No se olvide de la seguridad y la gobernanza. Tienen que escalar también.
- Escalar contenedores será un poco complicado hasta que se entienda más sobre cómo se comportan los contenedores a escala. Sin embargo, con una buena comprensión del uso adecuado de los contenedores y la tecnología adecuada, podrá escalar de inmediato.
Comprenda los pasos
Si ya está ejecutando Linux, entonces instalar Docker no será tan complejo. Sin embargo, instalar Docker en una Mac o Windows requerirá algunos pasos más. Simplemente siga las instrucciones apropiadas del sistema operativo.
El siguiente paso es intentar ejecutar una aplicación "Dockerizeda". Docker ha compilado un registro público de aplicaciones disponibles como imágenes de Docker, y esta comunidad proporciona muchos puntos de partida para crear y ejecutar sus propias aplicaciones basadas en contenedores.
Una vez que Docker esté instalado y en línea, ejecute una imagen de la aplicación Docker ingresando:
sudo docker run --rm -p 3000: 3000 <nombre_imagen>
Hay algunos detalles más, pero por simplicidad los dejaremos fuera de esta discusión. Tenga en cuenta que el comando "docker run" anterior ejecuta una imagen llamada <image_name>. Si no puede encontrar la imagen en su sistema local, comprobará el registro público e invocará allí, si se encuentra.
El contenedor Docker es simplemente una instancia de una imagen Docker, al igual que las aplicaciones son instancias de ejecutables que existen en la memoria. Por lo tanto, puede iniciar varias instancias aisladas de la aplicación como contenedores en un solo host. Al agregar "-rm" al comando, como se mostró líneas arriba, Docker recibe instrucciones de eliminar el contenedor de la memoria una vez que completa su tarea. Esto tiene el efecto de eliminar cualquier cambio en el entorno local que la aplicación haya realizado, pero mantiene la imagen en caché.
La creación de una imagen Docker para una aplicación requiere comenzar con una imagen base para el sistema operativo central, que se ejecuta en Docker. Instale y configure las herramientas necesarias, y luego use el comando "commit" de Docker para guardar el contenedor como una imagen. Finalmente, póngalo en el registro público de imágenes de Docker o manténgalo en privado.
Otra forma de crear una imagen es tener en cuenta los pasos necesarios para construir la imagen en un archivo Dockerfile bien formado. Esto automatiza el proceso de instalación y configuración de la aplicación, creando un proceso repetible.
Al igual que con cualquier proceso de desarrollo, hay más detalles que debe comprender para dominar la construcción y ejecución de imágenes y contenedores de Docker. En muchos aspectos, el éxito de los contenedores y Docker se ha basado en la facilidad de desarrollo. A medida que avanza el estándar y el producto, las cosas probablemente se volverán aún más fáciles.
Un contenedor en cada ambiente de ejecución.
La tendencia es pensar que nuevas formas de construir sistemas serán la forma en que construiremos sistemas en los años venideros. Si bien ese no ha sido el caso en el pasado, podría ser el caso de los contenedores.
Los contenedores ofrecen una tecnología habilitadora útil y estándar y proporcionan un camino hacia la arquitectura de la aplicación que ofrece distribución gestionada y orientación al servicio. Hemos estado tratando de alcanzar este estado durante años, pero aún no hemos tenido éxito.
Quizás lo más convincente es la ventaja de portabilidad de los contenedores, y ese sigue siendo el grito de batalla de los proveedores de tecnología de contenedores en estos días. Sin embargo, pasarán años antes de que comprendamos realmente el verdadero valor de los contenedores, a medida que traslademos las aplicaciones basadas en contenedores de una nube a otra.
Si este impulso continúa, los contenedores formarán parte de la mayoría de los ambientes de ejecución de TI en el futuro, ya sea que se trasladen a la nube o no. La viabilidad y versatilidad de esta tecnología será algo que continuaremos explorando y explotando en los próximos años. Cuente con el hecho de que se cometerán algunos errores, pero el impacto general de los contenedores es una conclusión inevitable.
Aquí dimos una MUY ligera semblanza de cómo comenzar con los Contenedores, "a pie". No estamos involucrando nada más allá que no sea Docker y Kubernetes. De estos dos, los que se pueden descargar libre y gratuitamente de la Internet y para ejecutarse sobre Linux.
En entregas posteriores, platicaremos cómo resuelven las principales marcas de Sistemas Operativos, Nubes Públicas y Plataformas de Virtualización, todo lo necesario para instalar, monitorear y ejecutar aplicaciones "contenerizadas".
¿Ya tiene más o menos claro el "cómo" y "con qué" de los Contenedores?