docker portada

Docker es el proyecto opensource multiplataforma que automatiza el despliegue de aplicaciones dentro de contenedores utilizando características de aislamiento de recursos para no tener que utilizar varias máquinas virtuales que consumen muchos recursos para llevar a cabo la misma tarea reduciendo el overhead e incrementando su escalabilidad y portabilidad.

En poco tiempo, Docker se ha convertido en la principal aplicación para la gestión de contenedores a nivel mundial y combinado con otros servicios como Kubernetes, tiene unas capacidades que cubren casi todos los requisitos, para todos, excepto algunos casos en concreto que analizaremos más en detalle, ya que Docker no es apto para todos los usos debido a su diseño.

Para empezar, un poco de historia

La idea de Docker nace de la mano de Solomon Hykes como un proyecto interno dentro de dotCloud (fundada en 2010), que era una empresa enfocada a la creación de un PaaS, pasaría a llamarse Docker Inc. que es la empresa actual que desarrolla Docker Hub y Docker para escritorio.

En sus inicios utilizaba LXC como entorno de ejecución que fue posteriormente reemplazado por su propia biblioteca escrita en el lenguaje de programación Go llamada libcontainer para convertirlo en un programa multiplataforma.

¿Qué es y para que se utiliza Docker?

docker

Su función coincide con el eslogan y es el de desarrollar, enviar y ejecutar cualquier aplicación en cualquier sistema operativo siendo una alternativa flexible con una necesidad de recursos mucho menor que las VM tradicionales que son emulaciones de componentes de hardware basados en máquinas virtuales.

Es una tecnología de virtualización basada en contenedores que comparte el kernel del host para ejecutar procesos aislados en el espacio del usuario sin la necesidad de tener otro sistema operativo ejecutándose, consumiendo recursos innecesarios.

Diferencias con máquinas virtuales tradicionales

containers-vs-virtual-machines

Nos ahorraremos todos los recursos utilizados por los sistemas operativos virtualizados y además podremos ejecutar nuestros contendores en cualquier sistema operativo donde esté instalado Docker para poder ejecutar nuestras aplicaciones.

Hay que tener en cuenta que Docker no es válido para todo tipo de aplicaciones pues está pensado para micro-servicios sin interfaces gráficas de usuario, por lo que no siempre es la mejor opción frente a la utilización de máquinas virtuales porque quizás si que queramos utilizar una interfaz gráfica y entonces sí sería mejor opción la utilización de una máquina virtual. Además, la persistencia de Docker es inexistente por lo que si apagamos alguno de los contenedores, toda la información contenida en él, desaparecerá, por lo que para este tipo de servicio es mejor utilizar un servicio aparte o utilizar una máquina virtual para esta finalidad.

¿Qué compone Docker?

Se compone de tres componentes fundamentales que son el motor de Docker, las imágenes Docker y el Docker Hub.

El motor de Docker es una aplicación cliente-servidor con 3 componentes fundamentales:

  • El Daemon de Docker (servidor) que es el proceso que funciona en segundo plano en el host y se encarga de crear y administrar las imágenes, contenedores y procesos de red.
  • La API REST es una interfaz de programación basada en REST que se encarga de interactuar y de darle las instrucciones al daemon.
  • La terminal (cliente) es la encargada de proveer la interfaz para interactuar con el daemon a través de la API REST con scripts o comandos.

Las imágenes Docker son los contenedores que el usuario crea o descarga de Docker Hub y contienen los recursos necesarios para ejecutar una aplicación en concreto y la aplicación a ejecutar.

El Docker Hub proporciona imágenes de Docker para facilitar a los usuarios descargar contenedores con servicios que ya estén hechos ahorrando mucho tiempo. Es una biblioteca online con muchísimos repositorios públicos en el que vais a encontrar todo lo que necesitéis para empezar, aunque también dispone de repositorios privados.

¿Qué ventajas tiene?

docker-run

Lo más importante está en la escalabilidad pues los contenedores son fácilmente replicables y con ello proporcionan una alta disponibilidad, ya que si uno fallase seguiría habiendo otros contenedores ofreciendo el servicio. Además, se puede usar en todos los sistemas operativos que tengan la plataforma Docker instalada por lo que ofrece una portabilidad excelente, ya que se puede crear en un Ubuntu Focal Fossa, por ejemplo, y después llevar ese servicio a un Windows Server y funciona a la perfección como en la máquina donde se creó.

La gran ventaja está en que aplicaciones con distintos requisitos se puedan ejecutar de manera aislada utilizando funciones básicas del Kernel de Linux que son los Cgroups y los Namespaces.

Los Cgroups limitan el acceso de los procesos al uso de la memoria, CPU y entrada salida evitando que los distintos procesos coman recursos de otros procesos.

Los Namespaces limitan los procesos y subprocesos encapsulándolos, utilizando 5 campos concretos:

  • UTS o identificador de sistemas se utilizan para asignar a los contenedores el nombre del dominio y de equipo.
  • PID o identificador de proceso se usa en cada contenedor de Docker con un espacio de nombres independientes para que todos los procesos que estén fuera del contenedor no se vea afectado si tienen el mismo PID evitando conflictos gracias a que están encapsulados.
  • IPC o comunicador entre procesos se encarga de aislar los procesos en cada container evitando la comunicación con procesos externos.
  • NET o recursos de red es el encargado de asignar a cada contenedor los recursos de red que necesita para tener conectividad.
  • MNT o punto de montaje del sistema de ficheros se encarga de aislar el espacio reservado del contenedor para que solo sea accesible desde el contenedor de Docker

Como comentábamos anteriormente, en sus comienzos Docker utilizaba LXC que posteriormente fue sustituido por libcontainer por lo que le permite a Docker convertirse en multiplataforma pudiendo ejecutarse tanto en Linux, como en Windows, como en MacOS porque si siguiese utilizando LXC solamente sería capaz de ejecutarse en entornos Linux.

¿Qué desventajas tiene?

Tiene 5 principales desventajas a tener en cuenta cuando vayamos a decantarnos por utilizar Docker para la virtualización de aplicaciones en contenedores:

La velocidad de ejecución no es la misma que si ejecutamos la aplicación directamente en el host. Los contenedores, aunque reducen el overhead de una manera enorme frente a la utilización de un sistema operativo virtualizado, corriendo la misma aplicación no llega a la misma velocidad que si se estuviese ejecutando directamente en el host.

El ecosistema de contenedores está fracturado y algunos de los contenedores no funcionan con otros como por ejemplo OpenShift de Red Hat que solamente funciona con Kubernetes.

El utilizar Docker para almacenamiento persistente no debería ser una opción, ya que por cómo se ha diseñado una vez que un contenedor desaparece, todo su contenido también desaparece por lo que todo el almacenamiento persistente como de una base de datos no debería nunca estar en un contenedor Docker, puesto que corremos el riesgo de pérdida de información.

Las aplicaciones con interfaces gráficas no funcionan bien porque Docker por diseño no requiere de interfaz gráfica, ya que está orientado a aplicaciones para servidor.

No todas las aplicaciones se benefician del uso de contenedores porque están principalmente pensadas para micro-servicios.

Dificultad

dificultad-media

Con ganas de aprender, la dificultad es un poco mayor que la virtualización no basada en contenedores, puesto que al no disponer de una interfaz gráfica de usuario como las que ofrecen soluciones de virtualización de sistemas operativos como lo son QEMU, HyperV, VMWare o VirtualBox, se hace quizás un poco más difícil al principio. Pero como ya hemos comentado estas técnicas de virtualización no basadas en contenedores tienen un overhead muchísimo menor aportando una gran ventaja frente a la virtualización de SO y hay disponible en Internet muchísimos tutoriales y vídeos en YouTube para poder aprender sobre Docker en muy poco tiempo con poco esfuerzo.

Descarga

Tendremos la posibilidad de descargar Docker de manera gratuita desde la página web del desarrollador y también tendremos acceso a mucha documentación que nos aporta sobre cómo se utiliza.


0 Comentarios

Deja un comentario

A %d blogueros les gusta esto: