Bläddra i källkod

Initial commit

Okynos 9 år sedan
förälder
incheckning
5b6df06740
2 ändrade filer med 262 tillägg och 2 borttagningar
  1. 218 2
      README.md
  2. 44 0
      index.php

+ 218 - 2
README.md

@@ -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:
+
+![Imagen de docker.ugr.es](https://makefile.es:3000/okynos/Practica1CC2/raw/master/web.png)
+
+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.

+ 44 - 0
index.php

@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html>
+
+<body background="http://static6.depositphotos.com/1024166/554/v/950/depositphotos_5540906-stock-illustration-seamless-background.jpg">
+  <div style="border:1px solid black;background:rgba(3,170,248,0.7); border-radius:15px; padding:1%;margin:2%;">
+    <h1>Practica 1 Cloud Computing</h1>
+    <form action="index.php?insert=true" method="POST">
+      <fieldset>
+        <legend>Formulario de datos</legend>
+        Nombre:<br>
+        <input type="text" name="name" placeholder="Nombre"><br>
+        E-mail:<br>
+        <input type="text" name="email" placeholder="example@example.com"><br><br>
+        <input type="submit" value="Enviar">
+      </fieldset>
+  </form>
+</div>
+
+<div style="border:1px solid black;background:rgba(3,170,248,0.7); border-radius:15px; padding:1%;margin:2%;">
+  <h2>Elementos en la Base de datos</h2>
+  <div class="elements">
+    <ul>
+
+    <?php
+      $c = new MongoClient( "mongodb://docker.ugr.es:15074" );
+      $db = $c->test->elements;
+
+      if( isset($_GET['remove']) ){
+        $db->remove( array('name' => $_GET['remove']) );
+      }else if( isset($_GET['insert']) ){
+        $db->insert( array('name' => $_POST['name'], 'email' => $_POST['email']) );
+      }
+
+      $cursor = $db->find();
+      foreach ($cursor as $documento) {
+        echo "<li> Nombre: " . $documento["name"] . " -- E-mail: " . $documento["email"] . " ---> <a href='index.php?remove=".$documento["name"]."'>Eliminar usuario</a></li>";
+      }
+    ?>
+    </ul>
+  </div>
+</div>
+
+</body>
+</html>