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

Okynos 1f6afb8569 Finalizando documentación 9 年 前
LICENSE 7e59ecc045 Initial commit 9 年 前
README.md 1f6afb8569 Finalizando documentación 9 年 前
app.png de077077af Adding prove captured images 9 年 前
index.php eb36b14ea3 Arreglando fallos de readme e index version funcional 9 年 前
nextcloud.png de077077af Adding prove captured images 9 年 前

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, este documento siempre es accesible desde su repositorio en Gogs.

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 ubuntu:14.04
docker run -d -p 14035:80 -p 14036:443 --restart=always --name NginxOkynos ubuntu:14.04
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:

apt-get update
apt-get install php5-common php5-cli php5-fpm php5-dev php5-cli php-pear
apt-get install nginx wget
pecl install mongodb
wget --no-check-certificate https://makefile.es:3000/okynos/Practica2CC2/raw/master/index.php
vi index.php
vi /etc/nginx/sites-available/default
vi /etc/php5/fpm/pool.d/www.conf
vi /etc/php5/fpm/php.ini
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. Tambien editamos el fichero de congifuración de nginx para añadir la lectura de phpy el fichero pho.ini y le añadimos extension=mongo.so. 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 y que todo funciona correctamente.

Hemos usado un contenedor con ubuntu ya que al probar alpine y otros contenedores con nginx no incluian alguno de los plugins de php o no tenían forma de agregar la extensión de mongo en php, por lo tanto hemos escogido una imagen estandar que contiene todas las herramientas y realizamos el mismo proceso que en OpenNebula.

Este sería el aspecto de nuestra aplicación como en la práctica anterior: Captura de pantalla de la aplicación que accede a una base de datos mongo

Paso 3 - Instanciando nuestro contenedor NextCloud

La instalación y despliegue del contenedor de nextcloud (análogo a owncloud) es muy sencillo y rápido debido a que ya viene preparado y configurado completamente para funcionar, aún así nos hemos complicado un poco la instalación ya que la base de datos que nos incorpora por defecto es sqlite y es un tanto ineficiente, es por ello que vamos a instalar un cuarto contenedor con una base de datos SQL llamada Postgres la cual funciona de manera similar a mysql, vamos a realizar los pasos para desplegar estas dos aplicaciones:

docker run --name PostgresOkynos -e POSTGRES_PASSWORD=NUESTRAPASS -d --restart=always -p 14039:5432 postgres
docker run -d -p 14038:80 --restart=always --name NextCloudOkynos nextcloud

Tan sencillo como ejecutar estos dos comandos y tendremos funcionando nuestro servicio nextcloud, nos dirigimos a la dirección donde tenemos alojado NextCloud y en ella se nos mostraría si es la primera vez que lo ejecutamos la pantalla de instalación en la que debemos definir el usuario administrador, su contraseña y tenemos la opción de definir la base de datos para ello seleccionamos postgres y le damos los parámetros necesarios los cuales pueden ser como los siguientes:

Usuario: postgres
Clave: NUESTRACLAVE
Nombre de la BD: nextcloud
Dirección: http://hadoop.ugr.es:14039

Y al darle a comenzar la instalación nos retornará a la pantalla principal donde se nos mostrarán los archivos que poseemos, adjuntamos aquí una captura: Captura del servicio NextCloud Pantalla principal

Paso 4 - Redundancia

Aunque ya se ha podido observar en los comandos, a la pregunta si replicando contenedores se podría obtener una mejora respecto a la robustez es cierto que se podría mejorar si los contenedores se crean en nodos u ordenadores distintos con un balanceador de carga si un contenedor cayese funcionaria como si esa máquina hubiera caido y le mandaría el tráfico a los demás contenedores, aún así si el contenedor cae por algún fallo software, con la opción --restart=always nos estamos curando en ese tipo de errores ya que al caer el contenedor si la máquina no cae éste volverá a levantarse y a funcionar.