|
|
@@ -1,3 +1,219 @@
|
|
|
-# Practica2CC2
|
|
|
+# 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.
|
|
|
|
|
|
-Práctica 2 de la asignatura de Cloud Computing en la que se realiza manejo de contenedores.
|
|
|
+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](https://www.solvetic.com/tutoriales/article/1346-conexion-de-php-con-mongodb/) 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](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](https://www.digitalocean.com/community/tutorials/how-to-install-mongodb-on-centos-7)):
|
|
|
+
|
|
|
+```
|
|
|
+[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í](http://ask.xmodulo.com/open-port-firewall-centos-rhel.html)
|
|
|
+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](http://askubuntu.com/questions/134666/what-is-the-easiest-way-to-enable-php-on-nginx)
|
|
|
+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:
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+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.
|