Saltar al contenido
Hablemos un poco de filosofía. El eslogan de Docker es “Build, Ship, and Run Any App, Anywhere”, y describe perfectamente las áreas principales de su uso, ya que podemos usar alguna de las herramientas de Docker en cualquier punto, desde el desarrollo hasta la operación.

Con Docker podemos acelerar nuestro desarrollo facilitando al programador un entorno donde probar su código. Los contenedores son infinitamente más livianos que las máquinas virtuales y nos permite recrear un entorno productivo en uno portátil. La construcción de imágenes se puede definir en ficheros de configuración en texto plano (Dockerfile) y contamos con herramientas como Docker Compose que nos permiten ejecutar y construir entornos multicontenedor de forma muy sencilla. Esto nos permite usar software de control de versiones como Git, e integrarse de manera muy sencilla en flujos de integración continua. Comparado con soluciones que ofrecen funcionalidades similares como Vagrant, con Docker necesitaremos menos recursos, los tiempos se reducirán y daremos mayor independencia a nuestros equipos de desarrollo.

Además, las imágenes de los contenedores son autocontenidas, en ellas reside el código, los ejecutables, herramientas de sistemas y librerías necesarias para ejecutar la aplicación. Esto garantiza que un contenedor se comportará del mismo modo con independencia del entorno, distribución e infraestructura en la que se ejecute, acabando con algunos de los problemas de puesta en producción y con esa terrible frase de “en mi portátil funcionaba”. Contamos también con un software repositorio de imágenes donde podemos subir o descargar, etiquetar, versionar y compartir entre todos los usuarios. Docker cuenta con un API REST que nos permitirá integrarlo más fácilmente con nuestras herramientas.
 
En su concepción Docker está pensado para trabajar en un mundo basado en microservicios, esto hace que aborde problemas complejos de infraestructura desde su base. Prácticamente todo en Docker podemos definirlo mediante ficheros de configuración o en el inicio de un contenedor: Redes, relaciones entre contenedores, puertos de escucha, mapeo de volúmenes, qué hacer ante un reinicio, gestionar de forma centralizada los logs, número instancias corriendo, sondas healthcheck, construcción de imágenes, etiquetado de componentes, etc. Esto nos permite usar software de control de versión por igual en desarrollo, despliegue y operación y abstraernos en muchos casos al usar el paradigma IaaC (Infraestructura como código) que nos permitirá adaptar nuestros recursos a las necesidades de nuestro servicio.



Los contenedores en Docker cuentan con un sistema de descubrimientos de servicios. Los contenedores se registran al iniciarse en un DNS interno que es accesible desde todas las instancias que compartan la misma red (se definen por software). De esta forma podemos acceder a los servicios por el nombre y olvidarnos también del número de instancias (contenedores) que ejecutan ese servicio pues implementa un balanceo de carga delante de ellos. En entornos más complejos con instancias repartidas en diferentes nodos de un cluster basado en Docker Swarm se habilita un sistema conocido como routing mesh que enruta las peticiones entre nodos. Iremos profundizando más en estos temas.

Todas estas funcionalidades lo convierten en una herramienta ideal a adoptar en filosofías tipo DevOps y nos ayuda a transformar el proceso lineal del ciclo de vida de una aplicación en un proceso circular.



Resumiendo:
  • Es portable: Empaqueta tu aplicación de una manera estandarizada. Código, ejecutables, herramientas y librerías del sistema, todo lo necesario para la ejecución de tu aplicación. Esto garantiza que el software funcionará igual siempre, independientemente del entorno donde se ejecute, ya sea en un portátil, en un servidor o en la nube. Olvídate del infierno de dependencias.
  • Es ligero: Los contenedores se ejecutan en una máquina compartiendo el Kernel del sistema operativo. Esto hace que su inicio sea instantáneo y use menos RAM. Las imágenes usan un filesystem basado en capas compartiendo ficheros, optimizando el uso de disco y la descarga de imágenes. Permite a los equipos de desarrollo autogestionarse y depurar en local.
  • Es abierto: Docker está basado en estándares permitiendo ejecutar contenedores en las principales distribuciones Linux y en Windows sobre cualquier infraestructura.
  • Es seguro de serie: Los contenedores aíslan aplicaciones unos de otros y de la infraestructura subyacente añadiendo una capa de protección a nuestra aplicación.  
  • Facilita el control de versiones y reciclaje de componentes: Puedes controlar las versiones de un contenedor, inspeccionar sus diferencias o hacer un roll-back a una versión anterior. Prácticamente todo en Docker puede ser definido en un fichero de configuración, desde la construcción de una imagen, la definición de nuestra stack y la relación entre contenedores o las redes a usar.  
  • Simplifica el mantenimiento y la operación: Docker reduce el esfuerzo y riesgo de problemas con las dependencias de la aplicación y proporciona funcionalidades como selfhealing, balanceo de carga, alta disponibilidad, descubrimiento de servicios, etc. de gran ayuda en grandes servicios
  • Docker habilita el uso de metodologías ágiles en todo el ciclo de vida de la aplicación, acortando el time to market y aumentando la densidad y granularidad de nuestros recursos. Una herramienta fundamental para los equipos DevOps que facilita el desarrollo y operación de aplicaciones basadas en microservicios (aunque no se limite a estas áreas).

¿Hasta dónde abarca Docker?

Hasta ahora solo hemos hablado de las ventajas del motor de contenedores, aunque Docker proporciona un completo ecosistema de herramientas que facilitan la gestión del ciclo de vida de tu aplicación: despliegue de nodos (machine), orquestación y cluster (swarm), definición de servicios multicontenedor (compose), repositorio de imágenes (registry), herramientas corporativas (datacenter), auditorías de seguridad (dockerbench), firmado de imágenes (notary), etc.
 
En próximas entregas abordaremos en mayor profundidad algunas de sus funcionalidades:
  • Definición de contenedores mediante ficheros (Dockerfile), o de nuestra stack completa (Compose).
  • Comunicación entre contenedores (creación de redes, volúmenes, descubrimiento de servicios).
  • Orquestación y clusters de contenedores.
  • Métricas y monitorización.
  • Alta disponibilidad: Autoreparación, resiliencia, chequeos, despliegue, escalado, estrategias de distribución, etc.
  • Buenas prácticas en el mundo de los contenedores.
  • Provisión de nodos y “hardware agnostic”.
  • Control de versiones, repositorios, integración continua, despliegue continuo.
  • Seguridad. Etc.
Exploraremos también otras alternativas interesantes proporcionadas por terceros que se integran completamente con este sistema de contenedores.



 

Otros artículos destacados