¿Qué es Docker?

Como se define en su página oficial , es “La plataforma líder a nivel mundial en contenedores de software”, la cual pretende eliminar el problema de “sólo funciona en mi máquina”. Docker crea contenedores que contienen las dependencias y requerimientos que tu aplicación necesita para correr. A diferencia de otras plataformas de virtualización como Vagrant, Docker utiliza el concepto de Contenedores de Linux (LXC), los cuales  no requieren de un hypervisor y corren directamente sobre el kernel, generando un impacto menor en el rendimiento de la máquina host.

 

El siguiente diagrama ilustra de manera sencilla los componentes más importantes del Docker Engine o motor de Docker:

Arquitectura de docker

Arquitectura del Docker Engine

Motor

 El demonio de Docker corre como root y posee una API REST que permite la conexión externa. El cliente de Docker administra el demonio mediante la API REST; si corres Docker por ejemplo desde un servidor en la nube (Amazon, Linode, etc.), es posible acceder directamente a la API REST sin tener que pasar por la consola del servidor en la nube, aunque esto incluye una estricta configuración de certificados SSL.

Objetos de Docker:

Cuando usamos Docker, creamos imágenes, contenedores, los administramos en redes y les asignamos volúmenes, siendo estas las partes básicas de la plataforma.

  • Imágenes: Son plantillas de sólo lectura que describen un contenedor. Las imágenes por lo general se componen de una base y modificaciones especiales, por ejemplo, es posible tener una imagen de python y modificarla agregando las librerías que requieras, o tener incluso una imagen de un sistema operativo completo como Ubuntu y tener todo un ambiente LAMP para desarrollo web dentro del mismo. Docker posee un banco de imagenes predefinidas donde puedes encontrar imagenes oficiales o también modificadas por la comunidad, con el fin de que no tengas que reinventar la rueda.
  • Contenedores: Son la instancia de las imágenes, es decir, la imagen en ejecución. Cuando corremos un contenedor, podemos ingresar a él por medio de la CLI y ejecutar los comandos que se necesiten, por ejemplo, podemos correr una imagen de ubuntu, ingresar a él e instalar un Nginx para correr un servidor web, o tener una imagen de python e instalar paquetes por medio de pip.
  • Red: Docker utiliza una interfaz virtual para comunicarse con la red del equipo host. A su vez, los contenedores que se ejecuten pueden pertenecer a una o varias redes y comunicarse entre sí, según se requiera.
  • Volúmenes: Permiten a cada contenedor tener un espacio privado o compartido para almacenar o tener acceso a archivos en el equipo host, también es la manera que la información presente en los contenedores se preserve tras terminar su ejecución.

¿Por qué usar Docker?

  • “Problema de sólo funciona en mi máquina”: Como desarrolladores de software, en algunas ocasiones requerimos instalar librerías, bases de datos, paquetes y muchas otras adiciones para que nuestro desarrollo funcione, lo cual hace el trabajo en equipo un poco engorroso, generando guías de instalación y configuración extensas, sin contar con los imprevistos que nos podamos encontrar por incompatibilidades en las instalaciones, paquetes rotos, etc. Aquí es donde entra Docker al rescate, permitiéndonos generar una imagen con todos los requerimientos para nuestro desarrollo en un entorno aislado que no va a interferir con lo que ya tengamos instalado.
  • Desempeño: Cuando utilizas máquinas virtuales, consumes una gran cantidad de recursos de máquina para ponerla a punto, adicional al tiempo que debes esperar para desplegarla. Un contenedor de Docker se lanza en segundos y sólo consume lo que requiere, mientras la máquina virtual mantiene el control de un porcentaje de memoria incluso si no la está usando.
  • Portabilidad y accesibilidad: Puedes tener todo tu entorno de trabajo en una imagen que puedes subir al repositorio de Docker (DockerHub) para compartirlo con tus colaboradores o con toda la comunidad.
  • Fácil Deploy: Si creas una imagen de toda tu implementación, sólo basta con descargarla y correrla en tu servidor.
  • Ágil: Facilita adoptar técnicas de DevOps como ciclos de vida circulares.

    Ciclo de vida circular

    Ciclo de vida circular

  • Escalable: Es posible replicar un contenedor o tener un enjambre de contenedores (Docker Swarm), Docker incluso balancea la carga entre contenedores.

Lo anterior es sólo un  preview de todas las características que Docker nos puede ofrecer como desarrolladores y de las ventajas que nos brinda, lo mejor de todo: es software libre, posee una gran comunidad, la documentación oficial es directa, clara y existen infinidad de imágenes oficiales (Nginx, Ubuntu, Python, Node, Redis, Mongo, MySql) e imágenes modificadas de los usuarios. La curva de aprendizaje no es muy inclinada pero tampoco es un valle de flores, posee bastantes opciones que puede mejorar el desempeño de nuestros contenedores y que vale la pena estudiar.

 

 

Fuentes de imágenes:
Docker engine: https://blog.appdynamics.com/engineering/devops-scares-me-part-4-dev-and-ops-collaborate-across-the-lifecycle/
Ciclo de vida circular: https://blog.appdynamics.com/engineering/devops-scares-me-part-4-dev-and-ops-collaborate-across-the-lifecycle/

Leave a Reply