Docker: Primeros pasos

Docker fue presentado en marzo de 2013 por Solomon Hykes en PyCon como una herramienta para desarrolladores, la cuál permite empaquetar e implementar fácilmente aplicaciones dentro de un contenedor, pero, ¿Qué es un contenedor?

Hykes describió a los contenedores como: unidades autónomas de software que se pueden entregar y desplegar en cualquier servidor ya que están aisladas a nivel de proceso y tienen su propio sistema de archivos, por ende, no son dependientes de librerías o dependencias externas para ejecutarse.

 

¿Cómo funciona Docker?

 

Los contenedores se han presentado como una alternativa a la virtualización que usan las máquinas virtuales (VM) debido a los múltiples beneficios que brindan los contenedores, entre ellos está que los contenedores son mucho más livianos que las VMs. Docker es la opción más común para implementar contenedores, sin embargo, existen más opciones como Podman, LXD, entre otros. En la figura 1, podemos ver que cada máquina virtual tiene su propio Sistema Operativo (SO) invitado por encima del Host, a diferencia de los contenedores que comparten el SO del anfitrión (Host) y es por eso que son más livianos.‎

 

Figura 1. Funcionamiento de Docker y VMs

 

El hecho de que los contenedores no usen un SO completo ayuda a que sean más livianos, es decir, reduce de gran manera la carga que soporta la máquina anfitriona, además, el espacio de almacenamiento es menor ya que solamente utiliza lo mínimo para funcionar, y el tiempo que necesita para lanzar una aplicación es considerablemente menor a las máquinas virtuales.

 

Diferencias entre Contenedores y VMs

Las máquinas virtuales nos permiten crear entornos con sistemas operativos totalmente aislados del sistema operativo host, obteniendo así un control total sobre el sistema operativo invitado, de esta manera se puede mezclar diferentes sistemas operativos entre el host y los invitados. 

Por otro lado, los contenedores además de permitirnos desplegar aplicaciones de manera más rápida también ayudan a crear entornos de desarrollo replicables entre los diferentes miembros de un equipo de desarrollo y así asegurar que se ejecutará de la misma manera en todos los equipos, independientemente del sistema operativo cada integrante del equipo tendrá el ambiente funcional. 

Docker cada vez es más indispensable entre los desarrolladores.

 

A continuación, en la tabla 1 se presentan las diferencias entre contenedores y VMs.

 

Contenedores

Máquinas Virtuales

Despliegue en segundos

Despliegue en minutos

Generalmente son ligeros (KB – MB)

Generalmente son pesadas (Mb – Gb)

Pueden compartir el sistema operativo

Tiene un sistema operativo independiente

Usa menos recursos

Usa más recursos

Se pueden destruir y recrear en cuestión de segundos

Se puede exportar e importar en un nuevo host en cuestión de minutos

Por lo general vienen con un ambiente listo para usarse

Se tiene que prepara el ambiente para ser usadas

Se pueden crear en segundos

Su creación lleva más tiempo que los contenedores

Parametrización de límites para el consumo de recursos de la máquina host

Pre aprovisionamiento de recursos de la máquina host

Tabla 1. Diferencias entre contenedores y máquinas virtuales

 

Arquitectura de Docker

 

Docker utiliza la arquitectura cliente servidor, en donde, el cliente de Docker tiene el trabajo de comunicarse con el demonio de Docker para que pueda crear, ejecutar o distribuir los contenedores. 

Este demonio de Docker puede ser tanto local como puede ser remoto ya que el cliente y el demonio de Docker se comunican mediante una API REST.

Figura 2. Arquitectura de Docker

 

En la figura 2 se puede observar 3 grandes divisiones:

 

  • Client: se encarga de crear un puente de comunicación para que el usuario pueda interactuar con el demonio de Docker mediante diferentes comandos como: docker run.

  • Docker Host: dentro de esta división se encuentra los contenedores creados por el usuario (Apagados o encendidos), también las imágenes descargadas que se pueden utilizar para crear contenedores, y, finalmente el demonio Docker que escucha las peticiones de la API REST y el cuál administra tanto contendores, imágenes, redes y volúmenes. El demonio de Docker también se puede comunicar con más demonios para administrar los servicios de Docker.

  • Registry: Los registros de Docker almacenan imágenes de Docker, Docker Hub es un repositorio público y es el repositorio predeterminado de Docker para buscar imágenes y descargarlas mediante comandos como docker pull.

 

Por qué usar contenedores

 

Docker brinda un solo objeto para poder ejecutar con total confianza en cualquier equipo, además de que su sintaxis simple brinda el control absoluto de la implementación y por ende la fácil identificación de problemas ya que se maneja por fases. 

Entre los muchos beneficios que ofrece Docker, para los desarrolladores se ha vuelto primordial ya que:

Entrega de software aislado con rapidez

Estandarización de operaciones para mayor control de implementación y despliegue

Manejo de código entre diferentes equipos ya sea locales o remotos

 

Cuando usarlos

 

Docker facilita la creación y distribución de microservicios por lo que es usado en aplicaciones con arquitectura de microservicios distribuidos, que mediante CI/CD se puede automatizar el despliegue de los mismos y estandarizando los procesos y entornos. Al ser los contenedores independientes y de fácil distribución, también son muy usados para preparar e instalar un entorno de algún servicio para usuarios sin conocimientos técnicos.

 

Conclusiones:

 

  • Facilitan preparar un nuevo ambiente de trabajo independientemente de la máquina anfitriona.

  • Permiten arrancar aplicaciones rápidamente aprovechando los recursos de hardware.

  • Se puede mantener un control de versiones para la infraestructura ya que docker se gestiona mediante archivos de texto plano

 

Referencias

leave a comment