Está en la página 1de 32

UNIVERSIDAD MAYOR DE SAN SIMON

FACULTAD DE CIENCIAS Y TECNOLOGIA


DIRECCIÓN DE POSGRADO

“CONTENEDORES DOCKER Y SU CAPACIDAD


DE OFRECER UNA RÁPIDA ESCALABILIDAD
PARA SERVICIOS WEB”

TRABAJO FINAL PRESENTADO PARA OBTENER EL CERTIFICADO DE DIPLOMADO


EXPERTO EN DESARROLLO DE APLICACIONES VERSIÓN I

POSTULANTE : GARY RICHARD VERA TERRAZAS


TUTOR : MSC. RICHARD FÉLIX LÓPEZ FULGUERA

Cochabamba – Bolivia 2018


2
TABLA DE CONTENIDO

Tabla de Contenido 3
1 Introducción 5
2 Generalidades 6
2.1 Antecedentes Generales 6
2.2 Antecedentes Específicos 7
2.3 Metodología 7
3 Marco Teórico 8
3.1 Servicios Web 8
3.2 Escalabilidad 9
3.2.1 Escalabilidad Vertical 9
3.2.2 Escalabilidad Horizontal 10
3.3 Máquinas Virtuales 10
3.4 Contenedores 11
3.5 Docker 13
3.6 Orquestador 13
3.7 Swarm 14
3.8 Nodo 14
3.8.1 Nodo Administrador 15
3.8.2 Nodo de Trabajador 15
3.9 Balanceo de Carga 15
3.10 Kubernetes 15
3.11 Pod 16
3.12 Controlador de replicación 16
3.13 Kubelet 16
3.14 kubectl 16
3.15 GNU Privacy Guard (GnuPG - GPG) 16
3.16 GN Advanced Packaging Tool (APT) 17
4 Implementación en el proyecto 17
4.1 Alcance 17
4.2 Escenario 1 17
4.2.1 Configuración y preparación del ambiente de trabajo 17
4.2.2 Dockerizacion 19

3
5 Conclusiones 25
6 Glosario 26
7 Bibliografía 31

TABLA DE CUADROS, GRAFICOS Y FIGURAS


Imagen 1: Servicios Web en Funcionamiento ............................................................................. 8

Imagen 2: Escalamiento Vertical................................................................................................. 9

Imagen 3: Escalamiento Horizontal........................................................................................... 10

Imagen 5: Arquitectura de las Máquinas Virtuales .................................................................... 11

Imagen 6: Estructura de contenedores ..................................................................................... 12

Imagen 7: Inicialización swarm en host manager ...................................................................... 20

Imagen 8: Información actual de Docker ................................................................................... 21

Imagen 9: Lista de nodos en enjambre ..................................................................................... 21

Imagen 10: Agregar nodo worker.............................................................................................. 22

Imagen 11: Lista de nodos swarm ............................................................................................ 22

Imagen 12: Escalado de Nginx ................................................................................................. 24

4
1 INTRODUCCIÓN

Para la mayoría de los proveedores de servicios web, si no es que para todos, es muy importante
el poder escalar rápidamente sus servicios dependiendo del tráfico que tienen en determinado
momento. El objetivo de toda empresa proveedora de servicios es la de mantener a sus clientes
satisfechos, lo mismo sucede con los proveedores de servicios web, el ofrecer un servicio que no
esté acorde a las necesidades y que no cumpla con los requisitos de la calidad no solo puede
derivar en perdidas monetarias para los clientes, si no que puede generar desde demandas,
sanciones y/o multas hasta perdidas de clientes.

Una forma de controlar este problema es el de calcular el máximo aproximado de peticiones a los
servicios y configurar los recursos para cubrir estas cantidades. Si bien esta técnica cubre el
problema de calidad y estabilidad de prestación de servicios, es muy posible que origine otro
problema, que es el uso innecesario de recursos en periodos de tráfico mínimo. Este uso de
recursos innecesarios afecta drásticamente a la economía ya que el mantener en funcionamiento
grandes cantidades de equipos y su refrigeración equivalen a mayor consumo de energía, otro
gasto se ve en la instalación y mantenimiento de nuevas granjas de servidores, además de que
mientras más tiempo se mantengan funcionando estos equipos su tiempo de vida se ve afectado
acortando el mismo.

El objetivo de la monografía es mostrar lo ventajoso de exponer servicios a través de Docker, que


son una tecnología de virtualización relativamente nueva. Si bien existen varios indicadores que
pueden definir por qué usar o no esta tecnología, por el tiempo con el que contamos vamos a
basarnos en el tiempo que toma levantar un nuevo servidor web y la facilidad que representa
escalar el mismo.

Al margen de los resultados, se busca guiar tanto a las empresas, instituciones y/o personas al
momento de tomar una decisión sobre que tecnología utilizar para iniciar sus servicios, y evitarse
pérdida de tiempo en cambios de migraciones y perdida de recursos, ya sean económicos por
migraciones innecesarias como de hardware por no escalar adecuadamente sus servicios en el
tiempo necesario.

5
2 GENERALIDADES

2.1 Antecedentes Generales

El primer antecedente del uso de una técnica para intentar ejecuta un proceso aislado dentro de
un sistema operativo se remonta a 1979 y fue cuando el chroot se introdujo como un concepto
en desarrollo para sistemas Unix que permitía aislar dentro una ruta un proceso y sus hijos de
modo que, para ellos, esa ruta pareciese ser el directorio raíz. Más adelante, en 1982, chroot se
incorpora a sistemas operativos BSD. En 1991 es utilizado por William Cheswick, un programador
e investigador en seguridad de red, para implementar una honeypot y monitorizar
comportamientos maliciosos.

Estas semillas iniciales supusieron los primeros pasos de lo que se acabaría consolidando como
virtualización de sistemas con la aparición de hypervisores, software que permite la ejecución
virtual de sistemas completos emulando tanto el hardware como el sistema operativo.

Dejando a un lado lo que a virtualización de hardware e hypervisores se refiere, en este artículo


vamos a ofrecer una visión de los contenedores, una tecnología que, partiendo de la idea base
de chroot, extiende este concepto para conseguir ejecutar entornos aislados del sistema. Con el
uso de contenedores, en realidad no se está virtualizando nada, sino que se están manteniendo
en un espacio aislado (namespace) los procesos y ficheros necesarios mientras se reutiliza el
kernel del sistema anfitrión.

La primera aproximación sólida a los contenedores en sistemas *nix aparece en FreeBSD en el


año 2000 con la introducción del comando jail que orienta y amplia las funcionalidades de chroot.
A partir de ahí, se empieza a extender a otras plataformas como Solaris, el sistema operativo de
Sun Microsystems, que en 2005 incorpora Solaris Zones permitiendo crear subsistemas aislados
denominados zonas. De igual forma otros fabricantes como IBM con AIX WPARs, o HP con HP-
UX Containers adoptan implementan soluciones similares.

Finalmente, en 2008, llega a Linux con LXC (Linux Containers) que da soporte al kernel para los
namespaces. Los namespaces constituyen el elemento base de los contendores y es una
funcionalidad del kernel que proporcionan facilidades para crear una abstracción del sistema de
modo que, todo lo que sucede fuera del espacio del contenedor sea invisible al interior.

6
2.2 Antecedentes Específicos

En marzo de 2013 la empresa dotCloud libera un motor de contenedores para Linux muy ligero
que hace uso de la librería LXC. Tras el éxito de las primeras versiones la compañía decide
centrar sus esfuerzos en este producto y cambia su nombre a Docker Inc.

Tras unos meses decide crear su propia librería escrita en Go, eliminar la necesidad de parchear
el Kernel y crear herramientas alrededor de su motor. Tras una campaña exitosa de financiación
y conseguir colaboraciones muy importantes por parte de Red Hat, IBM, Microsoft, Ubuntu o
Google, la empresa empieza a crear un vasto ecosistema de aplicaciones alrededor de este
motor.

A raíz del rápido éxito que está cosechando esta tecnología empiezan a aparecer alternativas
que fragmentan el mercado. Esto hace que afloren incompatibilidades entre tecnologías de
contenedores. Para contrarrestar este problema Docker Inc decide ceder el control del runtime
de contenedores RunC a la fundación OCI y actualmente ContainerD se encuentra en trámites
de pasar a formar parte de una organización de software libre. Cabe destacar que todos los
proyectos (salvo las herramientas comerciales) están liberadas baja la licencia Apache 2.0 y el
código está disponible en GitHub. Además, construye todo el sistema de cañerías (plumbing)
para que terceros puedan crear productos y plugins usando su base tecnológica sin generar
incompatibilidades.

Dado el auge de los contenedores y viendo el gran potencial de esta tecnología, Microsoft llega
a un acuerdo con la compañía y decide incorporar esta tecnología a su sistema operativo.
Podemos usar contenedores nativos Docker con Kernel Windows en Windows 2016 y Windows
10 aniversary edition. Además, Microsoft es el mayor contribuyente al código tras Docker Inc y
ha firmado acuerdos para garantizar que Docker se ejecute correctamente en sus sistemas ya
sea nativamente o usando Kernel Linux mediante virtualización (hyper-V).

2.3 Metodología

Para el presente trabajo se utilizarán los siguientes métodos de investigación:

• Método Bibliográfico, debido a que se realizara la lectura y compilación de libros


relacionados al tema de estudio.
• Método Analítico, debido a que se procederá a revisar y analizar ordenadamente
documentos relacionados al tema de estudio, para la redacción del Plan de Emergencia.

7
• Método Empírico o de Campo, debido a que se utilizaran ejemplos de aplicación
observadas en el caso de estudio de creación y escalado de Servicios a través del uso de
contenedores Docker

3 MARCO TEÓRICO

3.1 Servicios Web

Podemos definir un servicio web como un sistema de software diseñado para admitir la
interacción interoperable de máquina a máquina a través de una red. Tiene una interfaz descrita
en un formato procesable por máquina (específicamente WSDL). Otros sistemas interactúan con
el servicio web de una manera prescripta por su descripción utilizando mensajes SOAP,
normalmente transmitidos utilizando HTTP con una serialización XML junto con otros estándares
relacionados con la web. [1]. En otras palabras, podemos decir que los servicios web son un
conjunto de aplicaciones o tecnologías que se encuentran conectadas entre sí dentro de la web,
en donde los llamados proveedores ofrecen sus servicios como proveedores remotos y los
usuarios solicitan un servicio llamando a estos usuarios.

El siguiente cuadro muestra de forma sencilla como interactúa un conjunto de servicios web:

Imagen 1: Servicios Web en Funcionamiento – Fuente: Elaboración Propia

8
Según la Imagen 3-1, un cliente realiza una solicitud desde una aplicación a una agencia de
viajes, que ofrece sus servicios a través de la web, el cual a su vez realiza consultas o peticiones
a otros proveedores de servicios como ser tarjetas de crédito, hoteles y aerolíneas para poder
enviar la información requerida al cliente.

3.2 Escalabilidad

La escalabilidad de los servicios disponibles en la red, que podrían definirse como la capacidad
de una aplicación para manejar el crecimiento de manera eficiente, generalmente se logra al
hacer que estén disponibles en múltiples dispositivos. [ 2] Entonces, podemos entender por
escalabilidad a la habilidad de un sistema para adaptarse a situaciones cambiantes, siempre
manteniendo la calidad de sus servicios. Podemos encontrar los siguientes tipos de escalabilidad:

3.2.1 Escalabilidad Vertical

Imagen 2: Escalamiento Vertical – Fuente:


https://www.oscarblancarteblog.com/2017/03/07/escalabilidad-horizontal-y-vertical/

Esta se refiere al incremento de recursos del servidor para poder soportar el incremento de las
exigencias diarias, por ejemplo, se puede incrementar la memoria, la capacidad y/o velocidad de
los discos, la cantidad de núcleos de computo, etc. Si bien esta metodología parece ser la más
conveniente, recordar que llega un punto en el que los recursos ya no pueden aumentarse

9
3.2.2 Escalabilidad Horizontal

Imagen 3: Escalamiento Horizontal - Fuente:


https://www.oscarblancarteblog.com/2017/03/07/escalabilidad-horizontal-y-vertical/

Como vemos en la Imagen 3-3, este tipo de escalabilidad está enfocado en el incremento de
nodos, entonces, por ejemplo, se agrega un nuevo servidor de base de datos o un nuevo nodo a
un clúster o red de servidores para repartirse el trabajo, sin forzar al máximo la capacidad de
procesamiento de los nodos.

3.3 Máquinas Virtuales

Una máquina virtual puede definirse como un software que emula a un ordenador y puede
ejecutar programas como si fuese un ordenador real. Este software en un principio fue definido
como "un duplicado eficiente y aislado de una máquina física". La acepción del término
actualmente incluye a máquinas virtuales que no tienen ninguna equivalencia directa con ningún
hardware real. [3].

Este tipo de software surge de la necesidad de contar con entornos para poder realizar pruebas
de programas o configuraciones, el problema radica en que corremos el riesgo de que un mal
funcionamiento o una mala configuración provoquen la caída o dañen completamente nuestro
sistema operativo. Una solución sería la de utilizar otro equipo, pero tanto el tiempo que llevaría
levantar el entorno en otro equipo con la configuración deseada como la inversión que representa
el hacerse de otro equipo con las características deseadas se tornan bastante altas. Otra
solución, y la más eficiente, sería una herramienta o sistema que simule el funcionamiento de uno
o varios sistemas operativos dentro de nuestro sistema operativo principal, siempre manteniendo
independiente el entorno anfitrión de los entornos virtuales, ósea, máquinas virtuales.

10
En la imagen 3-4 podemos observar de forma sencilla la arquitectura de las máquinas virtuales,
por un lado, tenemos la capa de hardware y por otro lado tenemos la capa de software, dentro
de esta última tenemos instalado un sistema operativo, el cual hace uso de los recursos que se
encuentran en la capa de hardware.

Sobre el sistema operativo tenemos los programas específicos, entre los cuales encontramos a
los gestores de máquinas virtuales. Con la ayuda de estos gestores tenemos la capacidad de
crear varias máquinas virtuales, las cuales a su vez cuentan con su propia capa de hardware,
que vendría a ser una pequeña parte de los recursos físicos reservados para el equipo
virtualizado, también cuentan con una capa de software ya que necesita de un sistema operativo
para poder funcionar, como si se tratara de una maquina real.

Imagen 4: Arquitectura de las Máquinas Virtuales – Fuente: Elaboración Propia

3.4 Contenedores

El contenedor es una nueva forma de virtualización. A diferencia de las máquinas virtuales, los
contenedores comparten los mismos recursos del sistema operativo host, por lo que no es
necesario que el contenedor cuente con su propio sistema operativo. Los contenedores se

11
sientan encima de un servidor con un sistema operativo host, tal cual podemos apreciar en la
Imagen 3-5.

Cada contenedor comparte el kernel del sistema operativo anfitrión y por lo general los binarios
y las bibliotecas.

Si bien los contenedores comparten el sistema operativo host, cada uno tendrá su propio sistema
de archivos e interfaces de red [23]. Cada contenedor también tendrá su propia capa de red y
procesos.

Imagen 5: Estructura de contenedores – Fuente: Elaboración Propia

Los contenedores permiten al administrador tener los medios para escalar vertical y
horizontalmente.

Entre las ventajas de los contenedores podemos remarcas las siguientes:

• Ligero
• Fácil de iniciar, solo unos segundos
• Menos mantenimiento del sistema operativo

12
• Eficiente
En cuanto a su desventaja, la más clara es que no podemos ejecutar un contenedor con un
sistema operativo específico.

Estos contenedores los encontramos disponibles para aplicaciones basadas en Linux y Windows,
donde el software almacenado en el contenedor siempre funcionará igual, independientemente
del entorno ya que los contenedores creados se encargan de aislar el software del entorno lo cual
crea menos conflictos y se trabaja de manera independiente.

3.5 Docker

Docker es una plataforma abierta para desarrollar, enviar y ejecutar aplicaciones dentro de
contenedores. Docker le permite separar sus aplicaciones de su infraestructura para que pueda
entregar software rápidamente. [4]

En un comienzo, la tecnología Docker se desarrolló sobre la base de la tecnología LXC (Linux


Containers), lo que la mayoría de las personas asocia con contenedores de Linux "tradicionales”,
aunque, desde entonces, se alejó de esta dependencia. LXC (Linux Containers) era útil como
virtualización liviana, pero no tenía una buena experiencia de desarrollador o usuario. La
tecnología Docker aporta más que la capacidad de ejecutar contenedores; también facilita el
proceso de crear y desarrollar contenedores, enviar y versionar imágenes (entre otras cosas). [5]

Lo que hace a Docker fácil de usar y único, es que otorgan a los usuarios un acceso sin
precedentes a aplicaciones, la capacidad de implementar rápidamente, y controlar las versiones
y su distribución.

3.6 Orquestador

Un orquestador es un programa de software que maneja las interconexiones e interacciones entre


cargas de trabajo en nubes públicas y privadas. Conecta las tareas automatizadas en un flujo de
trabajo cohesivo para cumplir las metas, con vigilancia de permisos y aplicación de políticas. [11]

En otras palabras, un orquestador se encarga de levantar servidores, monitorear y configurar la


red, escalar servicios, volúmenes y todas las configuraciones necesarias para que las
aplicaciones estén siempre disponibles.

13
3.7 Swarm

Swarmkit es un proyecto separado que implementa la capa de orquestación de Docker y se usa


directamente en Docker. Un enjambre consiste en varios hosts Docker que se ejecutan en modo
enjambre y actúan como administradores (para gestionar la membresía y la delegación) y los
trabajadores (que ejecutan servicios de enjambre). Un host Docker determinado puede ser un
administrador, un trabajador o realizar ambos roles. Cuando crea un servicio, define su estado
óptimo (cantidad de réplicas, recursos de red y almacenamiento disponibles, puertos que el
servicio expone al mundo exterior y más). Docker trabaja para mantener ese estado deseado.
Por ejemplo, si un nodo de trabajador deja de estar disponible, Docker programa las tareas de
ese nodo en otros nodos. Una tarea es un contenedor en ejecución que es parte de un servicio
de enjambre y administrado por un administrador de enjambre, en lugar de un contenedor
independiente. [8]

Una de las ventajas clave de los servicios de enjambre sobre los contenedores independientes
es que puede modificar la configuración de un servicio, incluidas las redes y los volúmenes a los
que está conectado, sin la necesidad de reiniciar manualmente el servicio. Docker actualizará la
configuración, detendrá las tareas de servicio con la configuración desactualizada y creará
nuevas que coincidan con la configuración deseada. Otra característica interesante de Docker
Swarm es que se encarga de monitorizar el estado de los servicios recreando contendores si
alguno deja de funcionar. También a través del denominado routing mesh (malla de enrutamiento)
da igual al nodo del clúster por el que se acceda y da igual en que nodo esté el contenedor que
Docker Swarm con esta propiedad se encargará de hacer llegar la petición al contenedor.

Cuando Docker se ejecuta en modo enjambre, aún puede ejecutar contenedores independientes
en cualquiera de los hosts Docker que participan en el enjambre, así como en servicios de
enjambre. Una diferencia clave entre los contenedores independientes y los servicios de
enjambre es que solo los administradores de enjambres pueden administrar un enjambre,
mientras que los contenedores independientes pueden iniciarse en cualquier daemon.

3.8 Nodo

Un nodo es una instancia del motor Docker que participa en el enjambre. También puedes pensar
en esto como un nodo Docker. Puede ejecutar uno o más nodos en una única computadora física
o servidor en la nube, pero las implementaciones de enjambre de producción suelen incluir nodos
Docker distribuidos en varias máquinas físicas y en la nube. [8]

14
3.8.1 Nodo Administrador

Son los nodos que distribuyen las tareas a los nodos de trabadores, con el fin de mantener estable
el enjambre y exponer los servicios sin ningún problema. Tener varios nodos de administrador
permite que su clúster esté altamente disponible y tolere fallas de nodo.

3.8.2 Nodo de Trabajador

Son aquellos nodos que reciben y ejecutan tareas enviadas desde el administrador. Por defecto
los nodos administradores también ejecutan servicios como nodos de trabajador, pero pueden
ser configurados para ser administradores exclusivamente.

3.9 Balanceo de Carga

El administrador de enjambre usa el balanceo de carga de ingreso para exponer los servicios
que desea que estén disponibles externamente al enjambre. El administrador de enjambres
puede asignar automáticamente el puesto de publicación del servicio o puede ser
manualmente. Puede especificar cualquier puerto no utilizado. Si no especifica un puerto, el
administrador de enjambres le asigna al servicio un puerto en el rango 30000-32767, estos
puertos pueden ser expuestos a un equilibrador de carga externo. El modo Swarm tiene un
componente interno de DNS que automáticamente asigna a cada servicio en el enjambre una
entrada de DNS. El administrador de enjambre usa el balanceo de carga interno para distribuir
solicitudes entre servicios dentro del clúster en función del nombre DNS del servicio.

3.10 Kubernetes

Kubernetes es una plataforma de código abierto extensible y portátil para gestionar cargas de
trabajo y servicios en contenedores, que facilita tanto la configuración declarativa como la
automatización.

Kubernetes fue desarrollado y diseñado originalmente por ingenieros de Google. Google fue uno
de los primeros colaboradores de la tecnología de contenedores de Linux, y ha contado
públicamente que todo en Google se ejecuta en contenedores. (Esta tecnología es la que subyace
tras los servicios de nube de Google). Google genera más de 2 mil millones de implementaciones
en contenedores por semana, impulsadas por una plataforma interna: Borg. Borg fue la
precursora de Kubernetes, y las lecciones aprendidas del desarrollo de Borg a lo largo de los
años fueron la principal influencia detrás de gran parte de la tecnología de Kubernetes. [14]

15
Es gracias al respaldo de Google que este orquestador es el más utilizado en cuando a la
administración de contenedores se trata. La principal ventaja de usar Kubernetes en su entorno
es que proporciona la plataforma para programar y ejecutar contenedores en clústeres de
máquinas virtuales o físicas. A grandes rasgos, permite implementar y depender completamente
de una infraestructura basada en contenedores en entornos de producción.

En pocas palabras, Kubernetes se ejecuta al principio de un sistema operativo e interactúa con


pods de contenedores que se ejecutan en los nodos. El master de Kubernetes toma los comandos
de un administrador y transmite esas instrucciones a los nodos subordinados. Esta transferencia
funciona con una gran cantidad de servicios para decidir automáticamente qué nodo es el que
mejor se adapta a la tarea. Luego asigna los recursos y los pods en ese nodo para cumplir con
la tarea requerida.

3.11 Pod

Un grupo de uno o más contenedores implementados en un nodo único. Todos los contenedores
de un pod comparten la dirección IP, la IPC, el nombre del host y otros recursos. Los pods
abstraen la red y el almacenamiento del contenedor subyacente. Esto le permite mover los
contenedores por el clúster con mayor facilidad. [14]

3.12 Controlador de replicación

Controla cuántas copias idénticas de un pod deben estar ejecutándose en algún lugar del clúster.
[14]

3.13 Kubelet

Este servicio se ejecuta en los nodos y lee los manifiestos del contenedor, y garantiza que los
contenedores definidos estén iniciados y ejecutándose. [14]

3.14 kubectl

Es la herramienta de configuración de la línea de comandos de Kubernetes. [14]

3.15 GNU Privacy Guard (GnuPG - GPG)

GNU Privacy Guard es una herramienta de cifrado y firmas digitales desarrollado por Werner
Koch, que viene a ser un reemplazo del PGP (Pretty Good Privacy – Bastante buena privacidad)

16
pero con la principal diferencia que es software libre licenciado bajo la GPL. GPG utiliza el
estándar del IETF denominado OpenPGP. [9]

3.16 GN Advanced Packaging Tool (APT)

La Herramienta Avanzada de Empaquetado es un sistema de gestión de paquetes creado por el


proyecto Debian. APT simplifica en gran medida la instalación y eliminación de programas en los
sistemas GNU/Linux. [10]

4 IMPLEMENTACIÓN EN EL PROYECTO

4.1 Alcance

Para mostrar la facilidad de implementación y escalabilidad de servicios mediante el uso de


Docker vamos a crear un clúster de contenedores que expondrán un servicio. Para la
orquestación del clúster utilizaremos Docker Swarm, más que todo por lo fácil y sencillo de
implementar.

4.2 Escenario 1

4.2.1 Configuración y preparación del ambiente de trabajo

Para la implementación de este escenario nos basamos en el tutorial propio de Docker “Getting
started with swarm mode” (Comenzando con el modo de enjambre) [7], si bien la instalación de
Docker dentro de nuestros entornos no es tan fácil como menciona en este tutorial y se tuvo que
recurrir a otros tutoriales, su contenido es muy claro y fácil de implementar. Para esta prueba se
pueden utilizar maquinas físicas, máquinas virtuales, instancias de Amazon EC2 u hospedadas
de alguna otra forma, pero utilizaremos máquinas virtuales de VirtualBox equipadas con Ubuntu
ya que en el diplomado “Experto en Aplicaciones Empresariales” ya obtuvimos tanto las
herramientas como el conocimiento para poner configurar Docker en estos entornos.

Para este escenario necesitamos:

• Tres Hosts Linux que puedan comunicarse a través de una red, en nuestro caso,
máquinas virtuales con Ubuntu 16.04.5 LTS
• Docker Engine, en específico la versión 17.05.0-ce

17
4.2.1.1 Creación de máquinas Hosts en red con Linux

Creamos tres máquinas virtuales, una se llamará manager y las otras dos se llamarán worker1 y
worker2. Según la documentación oficial de Docker, para poder instalarlo en Linux, se necesita
la versión de 64 bits de una de estas versiones de Ubuntu:

• Biónico 18.04 (LTS)


• Artful 17.10
• Xenial 16.04 (LTS)
• Trusty 14.04 (LTS)

4.2.1.2 Instalación de Docker Engine 1.12 o posterior

En este punto, cabe recalcar que se tuvieron los primeros inconvenientes al intentar seguir los
pasos del tutorial en el que nos guiamos (Comenzando con el modo de enjambre) [7], por lo que
se tuvo que recurrir a los conocimientos adquiridos en el diplomado “Experto en Aplicaciones
Empresariales”, los cuales constan de los siguientes pasos:

I. Actualización de la base de datos de paquetes de Linux


• sudo apt-get update

II. Agregar la clave GPG (GNU Privacy Guard) para el repositorio oficial de Docker al
sistema
• sudo apt-key adv --keyserver hkp://p80.pool.sks-
keyservers.net:80 --recv-keys
58118E89F3A912897C070ADBF76221572C52609D

III. Agregar el repositorio Docker a las fuentes APT


• sudo apt-add-repository 'deb
https://apt.dockerproject.org/repo ubuntu-xenial main'

IV. Actualización de la base de datos de paquetes con los paquetes de Docker


agregados
• sudo apt-get update

V. Instalar Docker
• sudo apt-get install -y docker-engine
Una vez ejecutado el último paso, si es que no se presentó algún error en las ejecuciones, Docker
ya debería estar instalado en nuestras máquinas virtuales. Por último, verificar la ejecución de
Docker con el comando:
18
• sudo systemctl status docker

Comando que debería devolvernos algo parecido a lo siguiente:

• docker.service - Docker Application Container Engine


Loaded: loaded (/lib/systemd/system/docker.service; enabled;
vendor preset: enabled)
Active: active (running) since Sun 2018-08-22 06:53:52 CDT;
3 days ago
Docs: https://docs.docker.com
Main PID: 749 (docker)

4.2.1.3 Verificar protocolos y puertos habilitados

Los siguientes puertos deben estar disponibles para que Docker Swarm funcione correctamente.
En algunos sistemas, estos puertos están abiertos por defecto.

• Puerto TCP 2376 para la comunicación segura con el cliente Docker. Este
puerto es necesario para que Docker Machine funcione. Docker Machine se
utiliza para organizar los hosts Docker.
• El puerto TCP 2377. Este puerto se usa para la comunicación entre los nodos
de un Docker Swarm o clúster. Solo necesita abrirse en nodos de administrador.
• Puerto TCP y UDP 7946 para comunicación entre nodos (descubrimiento de red
de contenedor).
• Puerto UDP 4789 para el tráfico de red superpuesto (red de ingreso de
contenedores).
En el caso de que estos puertos no se encuentren habilitados, ejecutar los siguientes comandos:

• ufw allow 2376/tcp


• ufw allow 2377/tcp
• ufw allow 7946/tcp
• ufw allow 7946/udp
• ufw allow 4789/udp
• ufw reload

4.2.2 Dockerizacion

Una vez completada la configuración de nuestros hosts estamos listos para crear nuestro clúster
con Swarm.

19
4.2.2.1 Crear el Enjambre (Swarm Mode)

Inicialmente inicializamos swarm en el host manager a través de comando:

• docker swarm init --advertise-addr 192.168.1.4

En donde la bandera --advertise-addr configura el nodo administrador para publicar su dirección


como 192.168.1.4, obteniendo la siguiente respuesta:

Imagen 6: Inicialización swarm en host manager– Fuente: Elaboración Propia

Como podemos apreciar en la Imagen 3-5, se nos informa que el nodo actual es ahora manager
del enjambre, y se nos facilita un comando que contiene el token que nos servirá para agregar
los nodos de trabajador a nuestro clúster.

Antes de continuar con la inserción de nodos a nuestro enjambre, es recomendable verificar que
todo se encuentre correcto, para lo cual tenemos los siguientes comandos:

• sudo docker info


Que nos devolverá la respuesta que se muestra en la Imagen 3-6:

20
Imagen 7: Información actual de Docker– Fuente: Elaboración Propia

En donde podemos observar que Swarm se encuentra activo en nuestro actual nodo, el
cual es administrador y que nuestro enjambre cuenta con solo un nodo actualmente. Para
más detalles también se puede ejecutar el comando:

• sudo docker node ls


Que nos devolverá la lista de nodos del actual enjambre, como se puede ver en la Imagen 3-7,
solo contamos con el nodo manager.

Imagen 8: Lista de nodos en enjambre – Fuente: Elaboración Propia

21
4.2.2.2 Agregar nodos al enjambre

El siguiente paso es agregar los nodos de trabajador a nuestro enjambre, para esto iniciamos
nuestros nodos workers y ejecutamos el comando generado al momento de iniciar el swarm en
nuestro nodo principal.

Imagen 9: Agregar nodo worker – Fuente: Elaboración Propia

Como podemos observar en la imagen 3-8, el nodo fue agregado a swarm como trabajador.
Realizamos la misma acción en el segundo nodo de trabajador.

Si no contáramos con el comando pada agregar nodos al enjambre, podemos obtenerlo


ejecutando el siguiente comando en el nodo administrador:

• docker swarm join-token worker

To add a worker to this swarm, run the following command:

docker swarm join \


--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-
8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377

Lo que nos devolverá el comando a utilizar en los nuevos nodos.

Una vez agregados los nodos, verificar que nuestro enjambre se encuentre completo con el
comando en el nodo administrador:

• sudo docker node ls

Imagen 10: Lista de nodos Swarm – Fuente: Elaboración Propia

22
En la Imagen 3-9 podemos observar que ya tenemos los tres nodos en nuestro enjambre, el
administrador y los de trabajo.

4.2.2.3 Implementación de un servicio

Finalmente implementamos un servicio en nuestro clúster, para esto ejecutamos el siguiente


comando en el nodo administrador:

• sudo docker service create –-name nginx –p 80:80


Donde:

• Replicas: Determina la cantidad de instancias en ejecución para el servicio.


• Name: Determina el nombre del servicio.
• –p: Determina el Puerto en el cual será expuesto el servicio al exterior.
Otra bandera muy interesante al momento de desplegar servicios en Docker es Update-delay,
el cual configura el tiempo de demora entre las actualizaciones de una tarea de servicio o
conjuntos de tareas. Por defecto, el planificador actualiza 1 tarea a la vez. Puede pasar el --
update-parallelismindicador para configurar la cantidad máxima de tareas de servicio que el
planificador actualiza simultáneamente. Cuando la actualización de una tarea individual
devuelve un estado RUNNING, el planificador programa otra tarea para actualizar hasta que
se actualicen todas las tareas. Si, en cualquier momento durante una actualización, una tarea
regresa FAILED, el planificador pausa la actualización. Puede controlar el comportamiento
usando la --update-failure-actionbandera.

4.2.2.4 Escalar servicio

Finalmente llegamos a la parte que nos compete, el escalado del servicio implementado. El
escalado horizontal en Docker Swarm es tan simple como ejecutar el siguiente comando en el
nodo administrador:

• sudo docker service scale nginx=5


En la Imagen 3.10 podemos observar la respuesta de la ejecución, en la cual nos confirma que
nginx se ha escalado a un total de 5.

23
Imagen 11: Escalado de Nginx – Fuente: Elaboración Propia

De la misma forma se puede escalar quitando instancias de ejecución.

24
5 CONCLUSIONES

Lo principal que podemos rescatar de este estudio realizado, es que, a pesar de ser una
herramienta relativamente nueva para mi persona, fue muy fácil y rápida la implementación de
un servicio en un clúster de contenedores. Lo más interesante es que se pudo observar una gran
cantidad de información sobre esta tecnología en la web, si bien cada ejemplo y tutorial tienen
sus variantes, todas muestran lo fácil que es utilizar esta tecnología.

En cuanto al resultado obtenido, pudimos confirmar que Docker es muy potente en términos de
escalamiento, y que tiene una clara ventaja en comparación con otras tecnologías, por ejemplo,
las máquinas virtuales, tanto al usar más recursos como a reequilibrar los recursos que ya están
en uso.

Si bien en esta monografía pudimos confirmar la gran facilidad con la que se puede escalar un
servicio con contenedores web sin afectar la calidad del servicio prestado, y si bien grandes firmas
como Spotify, ING Direct, Uber, eBay o PayPal ya utilizan esta tecnología, todavía le falta mucho
por desarrollarse y mejorar. En este caso solo analizamos el poder de escalamiento, en la que
claramente es superior a otras tecnologías y metodologías, pero también tenemos que tener en
cuenta otros factores a la hora de seleccionar las herramientas para implementar nuestros
servicios, como ser la portabilidad, seguridad, nuestra capacidad de adquisición, las necesidades
que queramos cubrir, las herramientas y soluciones a las cuales tengamos que integrar nuestros
servicios, el tipo de servicio que queremos ofrecer, el entorno y muchos otros factores, al final lo
más importante es realizar un buen análisis de lo que necesitamos y tener una buena base de
conocimiento que nos ayude a sacar el máximo provecho a las herramientas que elijamos.

Finalmente, mencionar que en esta monografía solo se ha tenido la oportunidad de trabajar con
Docker Swarm, pero en un futuro cercano se espera trabajar con otros orquestadores que pueden
presentar otro tipo de beneficios y funcionalidades.

En síntesis, aunque se puede suponer que Docker Containers escalará más rápido en la mayoría
de los escenarios, no es posible concluir definitivamente que esto sea cierto en todos los casos.

25
6 GLOSARIO

Borg:
Borg es el primer administrador de clústeres de contenedores unificado y propietario de Google.
Más tarde, fue reemplazado por Omega al mejorar su arquitectura de programación y algunas de
las otras características clave. AFAIU, tanto Borg como Omega, han sido diseñados
específicamente para la infraestructura de Google y no están disponibles públicamente. Google
inició el proyecto Kubernetes con la intención de implementar un administrador de clústeres de
contenedores de propósito general y ponerlo a disposición del público.

Jail Chroot:
Chroot es un comando UNIX que permite ejecutar un proceso bajo un directorio raíz simulado,
de manera que el proceso no puede acceder a archivos fuera de ese directorio.

DNS: (Domain Name System o Sistema de Nombres de Dominio)


Es un sistema de nomenclatura jerárquico descentralizado para dispositivos conectados a redes
IP como Internet o una red privada. Este sistema asocia información variada con nombre de
dominio asignado a cada uno de los participantes. Su función más importante es "traducir"
nombres inteligibles para las personas en identificadores binarios asociados con los equipos
conectados a la red, esto con el propósito de poder localizar y direccionar estos equipos
mundialmente

DotCloud:
DotCloud es una plataforma PaaS de segunda generación que es la entidad comercial detrás de
Docker, un proyecto de portabilidad de aplicaciones de código abierto.

FreeBSD:
Es un sistema operativo open source para computadoras basado en las CPU de arquitectura x86,
Intel 80386, Intel 80486 (versiones SX y DX), y Pentium. También funciona en procesadores
compatibles con x86 como AMD y Cyrix. En la actualidad se ejecuta en once arquitecturas
distintas1 como, Alpha, AMD64, IA-64, MIPS, PowerPC y UltraSPARC.

Fundación OCI:
La Open Cloud Iniciative es una asociación que promueve la adopción de principios comunes de
servicios de nube abiertas para impulsar su estandarización y apertura real.

26
GPL:

Licencia Pública General, es la licencia que acompaña a algunos de código abierto de software
que detalla cómo el software y su acompañar código fuente puede ser copiado libremente,
distribuidos y modificados. El uso más generalizado de la GPL es en referencia a la GPL de GNU,
que comúnmente se abrevia simplemente como GPL cuando se entiende que el término se refiere
a la GPL de GNU. Uno de los principios básicos de la GPL es que cualquier persona que adquiera
el material debe ponerlo a disposición de cualquier otra persona bajo el mismo acuerdo de
licencia.

Honeypot:
Es un recurso sistemático de información cuyo valor descansa en el uso ilícito o no autorizado de
esos recursos. Son una gran herramienta para un IDS (Intrusion Detection System), ya que nos
ayuda a detectar y estudiar con antelación posibles ataques a nuestra infraestructura real.

Host:
El término host o anfitrión se usa en informática para referirse a las computadoras u otros
dispositivos conectados a una red que proveen y utilizan servicios de ella. Los usuarios deben
utilizar anfitriones para tener acceso a la red. En general, los anfitriones son computadores
monousuario o multiusuario que ofrecen servicios de transferencia de archivos, conexión remota,
servidores de base de datos, servidores web, etc.

HTTP:
El Protocolo de transferencia de hipertexto (en inglés: Hypertext Transfer Protocol o HTTP) es el
protocolo de comunicación que permite las transferencias de información en la World Wide Web.

Hipervisor

Un hipervisor (en inglés hypervisor) o monitor de máquina virtual (virtual machine monitor) es
una plataforma que permite aplicar diversas técnicas de control de virtualización para utilizar, al
mismo tiempo, diferentes sistemas operativos en una misma computadora.

IBM:
Es una reconocida empresa multinacional estadounidense de tecnología y consultoría con sede
en Armonk, Nueva York. IBM fabrica y comercializa hardware y software para computadoras, y
ofrece servicios de infraestructura, alojamiento de Internet, y consultoría en una amplia gama de
áreas relacionadas con la informática, desde computadoras centrales hasta nanotecnología.2
27
Kernel:
Un núcleo o kernel (de la raíz germánica Kern, núcleo, hueso) es un software que constituye una
parte fundamental del sistema operativo, y se define como la parte que se ejecuta en modo
privilegiado (conocido también como modo núcleo). Es el principal responsable de facilitar a los
distintos programas acceso seguro al hardware de la computadora o en forma básica, es el
encargado de gestionar recursos, a través de servicios de llamada al sistema.

Proyecto Debian:
Debian o Proyecto Debian es una comunidad conformada por desarrolladores y usuarios, que
mantiene un sistema operativo GNU basado en software libre. El sistema se encuentra
precompilado, empaquetado y en formato deb para múltiples arquitecturas de computador y para
varios núcleos.

TCP:
Protocolo de control de transmisión (en inglés Transmission Control Protocol o TCP), es uno de
los protocolos fundamentales en Internet.

Muchos programas dentro de una red de datos compuesta por redes de computadoras usan TCP
para crear “conexiones” entre sí a través de las cuales puede enviarse un flujo de datos. El
protocolo garantiza que los datos serán entregados en su destino sin errores y en el mismo orden
en que se transmitieron. También proporciona un mecanismo para distinguir distintas
aplicaciones dentro de una misma máquina, a través del concepto de puerto.

UDP:
El protocolo de datagramas de usuario (en inglés: User Datagram Protocol o UDP) es un protocolo
del nivel de transporte basado en el intercambio de datagramas (Encapsulado de capa 4 o de
Transporte del Modelo OSI). Permite el envío de datagramas a través de la red sin que se haya
establecido previamente una conexión, ya que el propio datagrama incorpora suficiente
información de direccionamiento en su cabecera.

Red Hat:
Red Hat, Inc. es una multinacional americana de software que provee software de código abierto
principalmente a empresas. Fundada en 1993, Red Hat tiene su sede corporativa en Raleigh,
North Carolina, con oficinas satélite en todo el mundo. Red Hat es conocida en gran medida por
su sistema operativo empresarial Red Hat Enterprise Linux y por la adquisición del proveedor de

28
middleware empresarial de código abierto JBoss. Red Hat también ofrece Red Hat Virtualization
(RHV), un producto de virtualización empresarial. Red Hat proporciona almacenamiento,
plataformas de sistemas operativos, middleware, aplicaciones, productos de administración y
servicios de soporte, capacitación y consultoría.

Malla de Enrutamiento (routing mesh):


Una red en malla es una topología de red en la que cada nodo está conectado a todos los nodos.
De esta manera es posible llevar los mensajes de un nodo a otro por distintos caminos. Si la red
de malla está completamente conectada, no puede existir absolutamente ninguna interrupción en
las comunicaciones.

BSD:
Berkeley Software Distribution o BSD (en español, «distribución de software Berkeley») fue un
sistema operativo derivado de Unix que nace a partir de los aportes realizados a ese sistema por
la Universidad de California en Berkeley.

SOAP:
Originalmente las siglas de Simple Object Access Protocol, es un protocolo estándar que define
cómo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio de datos
XML.

Solaris:
Solaris es un sistema operativo de tipo Unix desarrollado desde 1992 inicialmente por Sun
Microsystems y actualmente propiedad de Oracle Corporation tras la adquisición de Sun por parte
de esta. Sucesor de SunOS, es un sistema certificado oficialmente como versión de UNIX.
Funciona en arquitecturas SPARC y x86 para servidores y estaciones de trabajo.

Unix:
Registrado oficialmente como UNIX®, es un sistema operativo portable, multitarea y multiusuario;
desarrollado en 1969 por un grupo de empleados de los laboratorios Bell de AT&T, entre los que
figuran Dennis Ritchie, Ken Thompson y Douglas McIlroy.12

WSDL:
Las siglas de Web Services Description Language, es un formato del Extensible Markup
Language (XML) que se utiliza para describir servicios web (WS).

29
XML:
Es un lenguaje de marcado similar a HTML. Significa Extensible Markup Language (Lenguaje de
Marcado Extensible) y es una especificación de recomendación W3C como lenguaje de marcado
de propósito general.

30
7 BIBLIOGRAFÍA

[1] Haasm H. & Brown, A. (2004). Web Services Glossary. Agosto 5, 2018, de WC3 Sitio web:
https://www.w3.org/TR/ws-gloss/

[2] Mark Nottingham (2001). Web Service Scalability and Performance with Optimising
Intermediaries. Agosto 5, 2018, de WC3 Sitio web: https://www.w3.org/2001/03/WSWS-
popa/paper33

[3] Serrano, José A. (2010). Máquinas Virtuales. Agosto 5, 2018, de Universidad de Granada
Sitio web: http://osl.ugr.es/wp-content/uploads/2010/01/virtuales.pdf

[4] Docker Overview. Agosto6, 2018, de Docker Sitio web:


https://docs.docker.com/engine/docker-overview/

[5] What is Kubernetes? Agosto 6, 2018, de Kubernetes Sitio web:


https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/

[6] Swarm mode key concepts. Agosto 20, 2018, de Docker Sitio web:
https://docs.docker.com/engine/swarm/key-concepts/

[7] Getting started with swarm mode. Agosto 20, 2018, de Docker Sitio web:
https://docs.docker.com/engine/swarm/swarm-tutorial/#set-up

[8] Swarm mode key concepts. Agosto 20, 2018, de Docker Sitio web:
https://docs.docker.com/engine/swarm/key-concepts/#what-is-a-swarm

[9] GNU Privacy Guard. Agosto 25, 2018, de Wikipedia Sitio web:
https://es.wikipedia.org/wiki/GNU_Privacy_Guard

[10] Advanced Packaging Tool. Agosto 25, 2018, de Wikipedia Sitio web:
https://es.wikipedia.org/wiki/Advanced_Packaging_Tool

[11] Cloud Orchestrator. Agosto 25, 2018, de TechTarget Sitio web:


https://searchitoperations.techtarget.com/definition/cloud-orchestrator

[12] Virtualization and Containerization of Application Infrastructure: A Comparison. Vol. 21. June
23. University of Twente, 2014.

31
[13] ¿Qué es DOCKER? Agosto 25, 2018, de Red Hat Sitio web:
https://www.redhat.com/es/topics/containers/what-is-docker

[14] ¿Qué es Kubernetes? Agosto 25, 2018, de Red Hat Sitio web:
https://www.redhat.com/es/topics/containers/what-is-docker

32