Práctica 2 de la asignatura de Cloud Computing en la que se realiza manejo de contenedores.

Okynos 5b6df06740 Initial commit 9 vuotta sitten
LICENSE 7e59ecc045 Initial commit 9 vuotta sitten
README.md 5b6df06740 Initial commit 9 vuotta sitten
index.php 5b6df06740 Initial commit 9 vuotta sitten

README.md

Cloud Computing Servicios y Aplicaciones

Práctica 2 - Uso de contenedores docker

José Luis Fernández Aguilera - pylott@gmail.com

Creación, instanciación y provisionamiento de contenedores docker.

En este documento se van a detallar las actividades que se han realizado paso por paso durante la realización de las tareas descritas en el guión de la práctica 2.

Paso 1 - Descripción general de despliegue de contenedores

Los contenedores se basan en una simplificación de las máquinas virtuales realizada para minimizar el coste asociado a virtualizar una máquina o arquitectura completa es por ello que se ha desarrollado docker, el cual es un software para la virtualización ligera de software y esto se resume en virtualización mucho más rápida y eficiente y a su vez aislada del sistema anfitrión en los aspectos más relevantes, para desplegar contenedores solo es necesario conocer el nombre de la imagen en Docker Hub y llamar al comando docker pull y docker run, con ello habremos descargado y tras ello lanzado nuestro contenedor docker en la máquina anfitrión, vamos a pasar ahora a explicar los detalles.

Paso 2 - Creación y provisionamiento de los contenedores

Vamos a crear ahora nuestros contenedores docker con las herramientas software que vamos a desplegar, en nuestro caso concreto vamos a instanciar un contenedor con nginx y otro con mongoDB como hicimos en la anterior práctica vamos a usar la misma aplicación para probar que la funcionalidad es exactamente la misma, pasamos a los comandos:

docker pull richarvey/nginx-php-fpm
docker run -d -p 14035:80 -p 14036:443 --restart=always --name NginxOkynos richarvey/nginx-php-fpm
docker pull mvertes/alpine-mongo
docker run -d -p 14037:27017  --restart=always --name MongoOkynos mvertes/alpine-mongo

con esto ya tendremos lanzados y funcionando dos contenedores uno con Nginx y otro con mongoDB, podemos consultar el estado de los contenedores por si algo ha fallado con el comando:

docker ps

Que nos mostrará la lista de contenedores lanzados o que se estén reiniciando ya que al poner restart always el contenedor si falla se reiniciará constantemente. Ahora debemos provisionar el contenedor de nginx con la aplicación que realizamos en la práctica anterior, para ello ejecutamos el código:

docker exec -it CONTAINER_ID /bin/bash

esto nos dará acceso al contenedor que se está ejecutando y así poder provisionarlo, ejecutamos lo siguiente dentro de contenedor nginx:

rm *
pecl install mongodb
wget --no-check-certificate https://makefile.es:3000/okynos/Practica1CC2/raw/master/index.php
vi index.php
exit

con el vi modificamos la linea de acceso a la base de datos cambiando docker.ugr.es:15035 por hadoop.ugr.es:14037 que es el puerto que le asignamos a nustro contenedor con mongo. Con esto ya tendríamos configurada la parte de nginx en la que se muestra nestro index con acceso a la base de datos pero la base de datos todavia no se ha configurado vamos a pasar a ello Nos conectamos a nuestro contenedor o directamente desde una aplicación externa como compass a nuestra base de datos mongo y replicamos la base de datos que teníamos en la practica anterior y podemos observar como nuestro servidor http se conecta a nuestro servicio mongodb.

Creación de una máquina virtual mediante línea de órdenes

Vamos a detallar cómo hemos creado una instáncia de Ubuntu mediante línea de órdenes. En primer lugar es necesario conectarnos mediante ssh al servidor y loguearnos en OpenNebula desde línea de órdenes para ello sólo tenemos que ejecutar este par de comandos

ssh mmcXXXXXXXX@docker.ugr.es
oneuser login mccXXXXXXXX --ssh --force

Una vez hemos accedido al servidor y nos hemos logueado en OpenNebula podemos realizar varias acciones, en nuestro caso particular vamos a observar las imágenes que están disponibles en OpenNebula con este comando:

oneimage list

Y se nos mostrarán las imágenes de las que dispone el servidor en nuestro caso podemos fijarnos en la siguiente:

ID USER       GROUP      NAME            DATASTORE     SIZE TYPE PER STAT RVMS
10 oneadmin   users      Ubuntu-14.04    default        10G OS    No used    2

Esta línea nos indica que existe una imagen de Ubuntu que en líneas generales es lo que estabamos buscando, ahora es necesario crear una plantilla para crear una instancia con esa imagen pero antes es necesario crear una red virtual o saber su identificador si ya está creada, en este caso ya está creada y lo podemos observar con el comando:

onevnet list

Y se nos mostrará la lista de todas las redes virtuales a las que tenemos acceso buscamos la que hace referencia a nosotros, en nuestro caso es la vnet con ID: 221 una vez tenemos todos los datos vamos a crear la plantilla con este comando:

onetemplate create --name "Plantilla_Ubuntu14" --cpu 1 --vcpu 1 --memory 512
--arch x86_64 --disk 10 --nic 221 --ssh --net_context

Vamos a detallar los parámetros que hemos escrito:

  • name, especifica el nombre de la plantilla que estamos creando.
  • cpu, número de cpus que se le asignarán a la máquina cuando se instancie.
  • vcpu, número de cpus virtuales.
  • memory, es la cantidad de memoria ram que se le asignará a la máquina.
  • arch, definimos la arquitectura de la máquina virtual.
  • disk, se refiere al identificador de la imagen que se instalará en la máquina virtual.
  • nic, es el identificador de nuestra red virtual.
  • ssh, define que se puede acceder por ssh a la máquina.
  • net_context, implica que se utilizará un contexto de red.

La ejecución del comando nos ha retornado el identificador de la plantilla que en este caso es 596, para instanciar una máquina virtual asociada a esta plantilla sólo es necesario lanzarla con el siguiente comando:

onetemplate instantiate 596
Conexión a la máquina instanciada

Cuando el comando termina su ejecución nos devolverá un identificador de máquina virtual que en nuestro caso es 714, ya tenemos nuestra máquina desplegada vamos a pasar ahora a configurar el servicio web dentro de la misma, para ello accedemos a la máquina a través de estos comandos:

onevm show 714
ssh root@192.168.10.75
Provisionar las máquinas y configurarlas

el primer comando nos retorna la información asociada a nuestra máquina virtual mientras que el segundo se conecta como root a la ip que hemos obtenido con el comando anterior. Ahora ejecutamos la instalación de nginx, ya que hemos instalado una versión de ubuntu para instalar nginx ejecutamos las siguientes ordenes:

apt-get update
apt-get install php5-common php5-cli php5-fpm php5-dev php5-cli php-pear
apt-get install nginx
pecl install mongo

Seguiremos este tutorial para configurar mongodb en php.

Ya deberíamos poder acceder a la página principal de nuestro servidor web, para ello accedemos al siguiente enlace, http://docker.ugr.es:15075 Una vez hemos comprobado que el servidor web funciona de manera correcta continuamos añadiendo una página php simple que se conectará a la base de datos de la máquina que vamos a crear a continuación.

de la misma forma que antes creamos la plantilla e instanciamos la máquina e instalamos mongodb, ejecutando los siguientes comandos:

onetemplate create --name "Plantilla_CentosCC" --cpu 1 --vcpu 1 --memory 512 --arch x86_64 --disk 8 --nic 221 --ssh --net_context
onetemplate instantiate 599
ssh root@192.168.10.74
yum update
vi /etc/yum.repos.d/mongodb-org.repo

Al ejecutar vi o nano incluimos el siguiente código en el fichero(extraido de DigitalOcean):

[mongodb-org-3.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc

Antes de lanzar mongo es necesario al menos en CentOS abrir el puerto de escucha 80 para ello podemos seguir los pasos que se describen aquí Guardamos el fichero y ejecutamos los siguientes comandos:

yum repolist
yum install mongodb-org
iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -I INPUT -p udp -m udp --dport 80 -j ACCEPT
service iptables restart
mongod --port 80 &
Prueba y producción

Ya que hemos configurado y ejecutado todo vamos apasar a incorporar nuestra aplicación web en html+php en el servidor nginx que hemos desplegado, para ello y ya que lo hemos subido a un repositorio de git público utilizamos el comando wget para descargarnos los ficheros, aún así nginx necesita algunas configuraciones que se pueden consultar en la siguiente página Una vez hemos realizado todas las configuraciones descargamos nuestra aplicación web sencilla en el directorio /usr/share/nginx/html en nuestro caso con el siguiente comando:

wget https://makefile.es:3000/okynos/Practica1CC2/raw/master/index.php --no-check-certificate

Nos descargará el fichero index.php directamente de mi repositorio git público. Si todo está bien configurado y conectado deberá aparecer una página como la siguiente:

Imagen de docker.ugr.es

En la cual podemos observar los registros de la base de datos, insertar y borrar los mismos.

Descripción y uso de la appweb

La aplicación consiste en un sistema simple de consulta y edición de registros de una base de datos MongoDB, la aplicación consta de un formulario de introducción de datos muy sencillo en el que se introduce el nombre y el correo electrónico de la persona que deseemos registrar en el sistema, al pulsar el botón enviar, se almacenará en nuestra base de datos el registro asociado y se mostrará en la misma página como resultado de una consulta. La base de datos consta de una tabla llamada Test y una colección llamada elements dentro de esa colección se almacena por cada registro un identificador, un nombre y un email.