Samuel Morillo

Samuel Morillo

Sysadmin & Devops Engineer
Related topics: Cloud Docker

Qué es Docker y por qué implementarlo en tus proyectos

3 junio 2022
2 munutos

Los orígenes de Docker residen en la empresa antes llamada dotCloud Inc, esta misma debe tanto su éxito actual a la tecnología Docker que el nombre en este momento de la compañía es Docker Inc. 

El software de Docker nace como un proyecto interno en dotCloud que se dedicaba principalmente a ofrecer un servicio PaaS (Platform-as-a-Service). Con la intención de mejorar sus servicios los ingenieros de la compañía trabajaban en el lanzamiento de tareas desplegadas sobre el kernel de Linux que incluyesen funcionalidades de LXC (LinuX Containers) y cgroups.

Para poder entender esto puede surgir la siguiente pregunta, ¿qué son los cgroups y LXC? Primero vamos con la parte de los cgroups y después una introducción de LXC con similitudes o diferencias con la tecnología Docker. 

Los cgroups de GNU/Linux o grupos de control, son una característica del kernel Linux que permite que los procesos se organicen en grupos jerárquicos. El objetivo de agrupar los procesos de esta manera es limitar y monitorizar el uso que hacen estos procesos de los recursos. Con la ayuda de los cgroups, cada proceso corre en su propio espacio del kernel y de la memoria pudiendo así limitar los recursos de los que dispone.

 

LXC, el antecesor de Docker

LXC es previo a Docker pero comparten varias similitudes. LXC es una plataforma de contenedores open source que proporciona un conjunto de herramientas, plantillas, bibliotecas y enlaces entre lenguajes. Ofrece un entorno de virtualización que puede instalarse en varios sistemas basados en Linux.

Como se comentaba LXC es el antecesor de Docker, pero estos ahora encuentran diferencias entre sí como las siguientes: 

  • La herramienta Docker no limita su instalación únicamente a los sistemas operativos basados en Linux, ya que puede ser instalado en otros sistemas operativos como Windows o Mac OS.
  • LXC es un contenedor de sistema operativo, mientras que Docker es un contenedor de aplicaciones; esto se refleja en que cada contenedor LXC suele tener varios servicios ejecutándose y en cada contenedor de Docker se suele aislar una única aplicación. De este modo, un contenedor LXC se comporta como un sistema operativo funcional, por ello todos los contenedores incluyen como mínimo todas las funcionalidades básicas de un sistema operativo. Por el contrario, Docker solo virtualiza lo necesario haciendo que este sea extremadamente ligero. Debido a sus características es más ligero la ejecución de un contenedor Docker que un contenedor  LXC. 
  • Una ventaja de Docker es que, debido a una gran comunidad a la que se le permite alojar sus imágenes de Docker en un repositorio de manera gratuita y a las grandes distribuidoras que publican imágenes oficiales, es muy sencillo obtener imágenes pre-configuradas para distintas aplicaciones o uso. Las imágenes LXC también pueden compartirse de igual manera en un repositorio pero su uso no es tan extendido como el de DockerHub, el cuál es gratuito y de uso muy sencillo para almacenar, compartir u obtener imágenes. 

 

 Imagen : Diferencias entre Docker y LXC  

Continuando con la historia de los orígenes de Docker, fue en 2013 cuando la empresa dotCloud presentó de manera pública la herramienta Docker y, ante la buena acogida de la comunidad tecnológica, se definió como un proyecto open source. Esto significa que cualquiera podría, de manera gratuita, descargar, ejecutar y modificar el código de Docker. Al igual que en otros proyectos open source, que se expusiese el código y se ofreciera la posibilidad de mejorarlo hizo que Docker obtuviera una gran fama y ventajas. 

En cuanto al uso de Docker la empresa Apium Hub nos ofrece los siguientes datos: 

  • 2/3 de las empresas que prueban Docker, lo adoptan. La mayoría de las compañías que adoptaron Docker ya lo hicieron dentro de los 30 días posteriores al uso inicial de la producción, y casi todos los restantes se convierten dentro de los 60 días. 
  • La adopción de Docker real aumentó un 30% en un año. 
  • PHP, Ruby, Java y Node son los principales frameworks de programación utilizados en contenedores.
     

¿Qué es Docker? 

La tecnología Docker usa el kernel de Linux y las funciones que este ofrece, como pueden ser los cgroups y namespaces, para segregar los procesos.  

Los namespaces de GNU/Linux permiten encapsular recursos globales del sistema de forma aislada, evitando que puedan interferir con procesos que estén fuera del namespace. Los cambios en el recurso global son visibles para otros procesos que son miembros del namespace, pero son invisibles para otros procesos fuera del mismo namespace. Ejemplo de uso de los namespace es la configuración de los network namespace que nos permiten aislar la configuración de red, IP, firewall o más elementos similares entre distintos namespaces. 

Es la combinación del uso de cgropus y namespaces lo que enmarca la definición de un contenedor en concreto, produciendo que cada uno de los contenedores se puedan ejecutar de manera independiente. Uno de los propósitos de los contenedores Docker es lograr esta independencia. Esto aporta la capacidad de ejecutar varios procesos y aplicaciones por separado mejorando el uso de su infraestructura y, al mismo tiempo, conservando la seguridad, como si se tratase de sistemas aislados, como se observa en la siguiente imagen: Estructura simbólica de la herramienta Docker. 

 

Imagen : Estructura simbólica de la herramienta  Docker 

 

Docker vs máquinas virtuales 

Las herramientas del contenedor basado en kernel Linux, como Docker, ofrecen un modelo de implementación basado en imágenes. Esto permite compartir una aplicación, o un conjunto de servicios, con todas sus dependencias en varios entornos. Docker también automatiza la implementación de la aplicación (o conjuntos combinados de procesos que constituyen una aplicación) en este entorno de contenedores. Es decir, otra de las ventajas que se suma a la independencia y aislamiento es la gran portabilidad de su uso mediante la posibilidad de compartir imágenes con control de versiones. La distribución de las imágenes de estos contenedores es similar a la de las imágenes de las VMs (Virtual Machine);  la diferencia fundamental es que no hay que virtualizar todo el sistema operativo si no solo lo necesario para ejecutar la aplicación, esta característica lo hace extremadamente más ligero. 

 Imagen : Estructura de una máquina virtual frente a un contenedor Docker 

La ejecución de un contenedor Docker está asociado a una máquina, ya sea virtual o física. Esta máquina puede ser que sea accedida por distintos usuarios, por ello se debe limitar los permisos de la ejecución de Docker a únicamente los usuarios necesarios para evitar creaciones o destrucciones de los contenedores, volúmenes o más elementos de Docker que no sean correctas.

Conclusión

¿Deberías plantearte implementar Docker en tus proyectos? Creemos que es una muy buena elección.

Sin analizar en profundidad, Docker nos ofrece varias ventajas sobre cómo definir la infraestructura como código, lo que nos proporciona portabilidad a cualquier entorno e histórico de cambios. 

Al definir ese código en un repositorio permite observar su evolución y cambios. Esto facilita el trabajo de «vuelta atrás» en caso de que se produzcan errores en las nuevas definiciones del código que controlan la infraestructura. Todo esto acelera y agiliza los cambios de infraestructura para que los posibles errores tengan la mínima repercusión en un posible entorno de producción.

Por otro lado, la gran portabilidad de la imágenes y código permiten exportar y compartir entre los desarrolladores un mismo entorno de trabajo, combinado con el aislamiento que ofrecen los contenedores docker para que no interfiera quien o donde se esté ejecutando.

Además de todo ello, existe una gran comunidad abierta e imágenes de Docker oficiales de las aplicaciones más utilizadas, que permiten tenerlas desplegadas en minutos, así como imágenes de la comunidad para todo tipo de aplicaciones y usos.