Introducción
¿Qué es Docker? –Docker es uno de los productos más importantes de la actualidad. La necesidad constante de las organizaciones de obtener infraestructuras dinámicas y el objetivo del ahorro de costes han llevado a un cambio de modelo de trabajo más flexible y fácilmente adaptable. Con el uso de los contenedores, tecnología utilizada por Docker, ha cambiado la forma de trabajo tanto para los desarrolladores como para los administradores de sistemas. De los gigantes del sector tecnológico que impulsan el crecimiento y la mejora constante de Docker mediante la colaboración económica y/o aportación de código y apoyo para solucionar determinados errores y problemas encontramos en Red Hat, Google, IBM o Microsoft.
La utilización de Docker está aumentando día a día y se está convirtiendo en un requisito necesario, que ha llegado hasta la creación de un nuevo puesto de trabajo, los devops, que son perfiles con conocimiento en administración, virtualización a nivel de sistema operativo y el uso de las utilidades básicas para apoyar a los programadores.
Docker, en sí mismo no es una tecnología, realmente es la forma como accedemos a ella. Esta tecnología es conocida con el nombre de contenedores y recientemente fue adoptada por el núcleo de Linux. La finalidad de Docker es facilitar la creación y manipulación de contenedores.
La tecnología de los contenedores no es un concepto nuevo, es una forma histórica de intentar aislar recursos tanto a nivel de usuario como a nivel de aplicación. En Linux, el primer acercamiento previo a los contenedores se realizó a través de la operación “chroot”, también conocida como “jaula”; que consistía en aislar aplicaciones y usuarios entre sí, con la limitación de no poder aislar recursos físicos (memoria, procesador o dispositivos). Las primeras implementaciones de “chroot” se remonta a los principios de los años 80.
Ecosistema de Docker- Los componentes comunes
El uso de contenedores es el proceso de distribución y despliegue de aplicaciones de una manera portátil y predecible. Esto se consigue mediante el envasado de componentes y sus dependencias en entornos de proceso ligeros, aislados y estandarizados llamados contenedores. Docker, una plataforma de contenedores desarrollada para simplificar y estandarizar la implementación en diversos entornos, fue en gran parte decisivo para estimular la adopción de este estilo de diseño y gestión de servicios. Una gran cantidad de software ha sido creado para construir en este ecosistema de gestión de contenedores distribuidos.
Descubridor de servicio
Descubridor de servicios es un componente de una estrategia global destinada a hacer despliegues de contenedores escalable y flexible. Descubridor de servicios se utiliza para que los contenedores puedan encontrar información sobre el entorno en el que se han introducido sin intervención del administrador. Se puede encontrar información de conexión de los componentes que deben interactuar, y pueden inscribirse de esta forma las otras herramientas sapan que están disponibles.
Estas herramientas a menudo se implementan como simples almacenes de claves y valores que se distribuyen entre los anfitriones en un entorno agrupado.
Algunas herramientas de descubrimiento de servicios populares y proyectos relacionados son:
- ETCD: descubrimiento de servicios / distribuida globalmente almacén de claves-valor
- consul: el descubrimiento de servicios / distribuida globalmente almacén de claves-valor
- Zookeeper: el descubrimiento de servicios / distribuida globalmente almacén de clausvalor
- crypt: Proyecto para cifrar las entradas ETCD
- confd: relojes almacén de claves-valor para los cambios y desencadena la reconfiguración de los servicios con el nuevo.
Herramientas de red
Aplicaciones en contenedores se prestan a un diseño orientado a servicios que anima a romper la funcionalidad en componentes discretos. Si bien esto hace que la gestión y la ampliación más fácil, se requiere aún más garantías en cuanto a la funcionalidad y fiabilidad de la red entre los componentes. Docker proporciona las estructuras de redes básicas necesarias para contenedor en contenedor y la comunicación-contenedor-a-host.
Las capacidades de red nativas de Docker proporcionan dos mecanismos para enganchar los contenedores juntos. La primera es para exponer los puertos de un recipiente y opcionalmente asignar al sistema anfitrión para el enrutamiento externo. Se puede seleccionar el puerto de host para asignar a permitir o acoplable para elegir al azar un puerto de altura, sin utilizar. Esta es una forma genérica de proporcionar acceso a un contenedor que funciona bien para la mayoría de los propósitos.
Contenedores VS virtualización
La virtualización, consiste en añadido una capa de abstracción a los recursos físicos con el objetivo de mejorar el uso de los recursos del sistema. En el pasado, cada elemento físico ejecutaba un recurso. Con la introducción de la virtualización es posible crear varios entornos simulados (máquinas virtuales) para varios recursos. Es decir, en el caso de un servidor, gracias a la virtualización, podemos ejecutar varios sistemas dentro del mismo con diferentes entornos. Por ejemplo, un servidor puede ejecutar múltiples máquinas virtuales con diferentes sistemas operativos para varios propósitos.
Los diferentes tipos de virtualización:
Virtualización completa: la máquina virtual no tiene acceso directo a los recursos físicos y requiere de una capa superior para acceder. Algunos ejemplos:
- VirtualBox
- Hyper-V
- VMware ESXi
Virtualización asistida por hardware: es el hardware lo que facilita la creación de la máquina virtual y controla su estado. Algunos ejemplos:
- KVM
- Xen
- VMWare fusión
Virtualización a nivel de sistema operativo: aquí incluimos los contenedores. Es el sistema operativo, y no el hardware, el encargado de aislar los recursos y proporcionar las herramientas para crear, manipular o controlar el estado de los contenedores (Término utilizado en lugar de máquina virtual).
Al contrario de la virtualización, Docker no emula ni virtualiza una máquina y su sistema operativo con el que los procesos son mucho más ligeros y hace que el hardware pueda ser aprovechado más el poder aumentar la densidad de los servicios en una misma máquina. Los contenedores y servicios incluidos en ellos inician muy rápidamente, en pocos segundos. Además, no es necesario el sistema de archivos completa del sistema operativo invitado con lo Docker usa una fracción de espacio de almacenamiento necesario en la virtualización.

Ventajas de Docker como herramienta
- La utilización de recursos reducida: en lugar de virtualizar un sistema operativo completo, contenedores aislar a nivel de proceso y el uso del núcleo del huésped.
- Portabilidad: todas las dependencias para una aplicación en contenedores están empaquetados en el interior del contenedor, permitiendo que funcione en cualquier sistema principal del estibador.
- Previsibilidad: El anfitrión no se preocupa por el que se ejecuta dentro del contenedor y el contenedor no se preocupa por qué host que se está ejecutando. Las interfaces están estandarizadas y las interacciones son predecibles.
Ventajas desde el punto de vista de los desarrolladores
- Podemos disponer de un entorno de desarrollo (devbox) o servicio en varios minutos / horas en vez de algún día. Esto es así porque la configuración y los servicios necesarios están automatizados en la construcción de las imágenes de los contenedores mediante Dockerfiles.
- Como los servicios en contenedores no es necesario instalarlos en la máquina en la que son alojados, por lo que podemos disponer de los servicios y luego eliminarlos de forma sencilla sin “ensuciar” el sistema huésped.
- Nos permite tener versiones más similares o iguales a las utilizadas en producción. Por ejemplo, en Arch Linux nos permite tener un mysql de la distribución Ubuntu utilizando la misma versión.
Ventajas desde el punto de vista de los administradores de sistemas
- Pueden proporcionar entornos similares o iguales a los entornos de pruebas, QA o producción independientemente de la distribución que se utilice.
- Es posible desplegar un contenedor a cualquier infraestructura Linux.
- La creación de los contenedores puede ponerse bajo un sistema de control de versiones.
Contenido de un contenedor
Un contenedor está compuesto de todo lo necesario para ejecutar una o varias aplicaciones. Su contenido es el siguiente:
-
- Herramientas del sistema: hay una gran diversidad de herramientas dentro de cada contenedor. Algunos ejemplos:
- Editores de texto (VI, Emacs)
- Monitoreo (Nagios, Check-MK)
- Herramientas de registros (Elasticsearch, Splunk)
- Runtime: es el software que se necesita para ejecutar la aplicación dentro del contenedor. Puede ser:
- Lenguajes interpretados: el intérprete para el código de fuente, como puede ser PHP, Perl o Python.
- Máquina virtual Java
- El programa compilado y autoejecutable
- Herramientas del sistema: hay una gran diversidad de herramientas dentro de cada contenedor. Algunos ejemplos:
En el caso de lenguajes interpretados, el código fuente (por ejemplo, archivos .php, .py o .pl) o en el caso de máquina virtual los archivos que contienen la aplicación (por ejemplo .jar o .war)
Dentro del contenedor tendremos las utilidades, la distribución que hemos elegido y utilizando los gestores de paquete (por ejemplo, APT o YUM) podremos instalar software de los repositorios de la misma.
Un contenedor puede ejecutar varias aplicaciones. Sin embargo, se recomienda separarlas en varios contenedores debido a que estos son muy ligeros. De este modo, las tareas de mantenimiento serán más fáciles. Algunos ejemplos:
- Monitorear las aplicaciones individualmente monitorizando el uso del contenedor.
- Limitar los recursos de las aplicaciones.
- Reinicio de aplicaciones (ya que no afectamos a las otras)
- Copia de seguridad y restauración
Imágenes y contenedores
Las imágenes en Docker podrían verse como un componente estático, ya que no son más que un sistema operativo base, con un conjunto de aplicaciones empaquetadas, mientras que un contenedor es la instanciación o ejecución de una imagen, y puede ejecutar varios contenedores a partir de una misma imagen.
Haciendo una analogía con la POO una imagen es una clase y un contenedor es la instanciación de una clase, es decir un objeto.
Todo contenedor puede ser convertido en una imagen utilizando las utilidades de Docker. Estas imágenes pueden ser transferidas a otro servidor para ejecutar un contenedor basado en ellas y pueden hacerse copias de seguridad.
