Categories
General In detail OpenSource

Docker Swarm y Consul con OpenNebula

Como continuación al post publicado sobre Docker Machine y OpenNebula, en esta ocasión veremos que con dicho driver también podemos implementar la funcionalidad de Docker Swarm.
docker-swarm-opennebula
Docker Swarm tiene la capacidad de balancear según la disponibilidad del clúster. Así pues, si por ejemplo en un clúster hay un contenedor y este deja de estar disponible, Swarm encarga de asignarlo a otro nodo disponible.
Para  poder implementar esta funcionalidad, hace falta tener instalado Docker Engine y Docker Machine con el driver para a OpenNebula.

Tutorial

El primer paso será crear una máquina virtual con Docker Engine para el servicio de discovery con Consul y arrancar un contenedor con consul:

docker-machine create -d opennebula --opennebula-network-id $network_id --opennebula-image-id $b2d_image_id --opennebula-b2d-size $volatile_disk_size consul
docker $(docker-machine config consul) run -d -p "8500:8500" -h "consul" progrium/consul -server -bootstrap
CONSUL_IP=$(docker-machine ip consul)

Podemos verificar que funciona correctamente, accediendo a la IP de la máquina por el puerto 8500:
consul
 
 
 
 
 
 
 
 
 
 
 
Creamos una nueva máquina virtual, para el nodo máster del clúster:

docker-machine create -d opennebula --opennebula-network-id $network_id --opennebula-image-id $b2d_image_id --opennebula-b2d-size $volatile_disk_size --swarm --swarm-master --swarm-discovery="consul://$CONSUL_IP:8500" --engine-opt cluster-store=consul://$CONSUL_IP:8500 --engine-opt cluster-advertise="eth0:2376" swarm-master

Y tantas máquinas virtuales como nodos queramos que tenga nuestro clúster:

docker-machine create -d opennebula --opennebula-network-id $network_id --opennebula-image-id $b2d_image_id --opennebula-b2d-size $volatile_disk_size --swarm --swarm-discovery="consul://$CONSUL_IP:8500" --engine-opt cluster-store=consul://$CONSUL_IP:8500 --engine-opt cluster-advertise="eth0:2376" swarm-node-XX

opennebula_docker_machine1

docker-machine ls

docker_machine_ls1
 
 
Una vez tengamos creados los nodos que compondrán el clúster, podemos acceder al nodo máster con la siguiente comanda:

eval $(docker-machine env --swarm swarm-master)

Podemos ver la información y estado del clúster con el comando:

docker info

eval_info2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
También existe la opción de poder crear redes privadas dentro del clúster usuando el driver overlay:

docker network create --driver overlay --subnet=10.0.1.0/24 overlay_net
docker network ls

Una vez, tenemos el clúster en marcha, ya podemos utilizar Docker de la forma habitual:

docker pull nginx
docker run --name mynginx -d -p 80:80 nginx

nginx
 
 
nginx21
 
 
Siguiente paso… automatizar la elasticidad del clúster con OneFlow.
 
 
 

Categories
General In detail

Docker for Dummies

Qué es Docker?

DockerLogo
Docker es un proyecto open-source que permite automatizar el despliegue de aplicaciones en entornos Linux. Está basado en el formato estándar de contenedores de Linux(LXC) y permite correr aplicaciones en ambientes aislados de manera ligera. Docker nos permite crear “imágenes” con nuestra aplicación y sus dependencias, garantizando que ésta funcionará, a escala, en producción o en cualquier otro ambiente. De esta manera evitamos el llamado “dependency hell” y facilitamos el desarrollo y mantenimiento de las aplicaciones.
A diferencia de las máquinas virtuales tradicionales, un contenedor Docker no incluye un sistema operativo independiente, sino que se basa en la funcionalidad del sistema operativo proporcionado por la infraestructura subyacente. Esto es gracias a usar contenedores de Linux (LXC), ya que corren sobre el mismo sistema operativo que el mismo host. Además usa AuFS1 para sistema de archivos y se encarga de las redes por los usuarios.
docker4
A continuación se presentan dos tutoriales para iniciarse con Docker y ver todas las possibilidades que ofrece el entorno. Para los tutoriales se ha utilizado la herramienta Docker Toolbox.
 
docker1
docker2

Tutorial 1: OpenLDAP / PhpLdapAdmin

Buscamos la imagen que nos interese, en nuestro caso OpenLdap, con el siguiente comando:

docker search openldap

Luego podemos descargar la imagen con el comando:

docker pull osixia/openldap

Una vez finalizada la descarga podemos consultar las imágenes que tenemos disponibles con el comando:

docker images

Cuando tenemos la imagen disponible ya podemos instanciar un contenedor:

docker –-name myldap run --env LDAP_ORGANISATION="CloudAdmins" --env LDAP_DOMAIN="cloudadmins.org" --env LDAP_ADMIN_PASSWORD="Admin" --detach osixia/openldap

Este comando lo que realiza es levantar un contenedor con los siguientes parámetros
–name el nombre asociado al contenedor
–env para definir varias variables de entorno que configuraran nuestro LDAP
Podemos comprobar los contenedores que están levantados, con el comando:

docker ps -a

También podemos obtener una Shell del contenedor con el comando:

docker exec -it myldap bash

o ejecutar comandos sobre el contenedor:

docker exec myldap ldapsearch -h localhost -D "cn=admin,dc=cloudadmins,dc=org" -w Admin

 
Para instanciar un contenedor con phpldapadmin realizamos la misma operación:

docker search phpldapadmin
docker pull osixia/phpldapadmin

Con el siguiente comando podemos obtener la IP del contenedor donde hemos instanciado nuestro LDAP:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' myldap

Finalmente, podemos instanciar el contenedor para administrar nuestro LDAP con phpldapadmin:

docker run -p 443:443 -e PHPLDAPADMIN_LDAP_HOSTS=172.17.0.2 -d osixia/phpldapadmin

Y así de una forma rápida tendríamos disponible nuestro servidor LDAP:
docker3
Podemos parar un contenedor:

docker stop myldap

Para borrar un contenedor deberíamos ejecutar el siguiente comando

docker rm myldap

Por último, para borrar la imagen descargada de Openldap, ejecutaríamos el comando:

docker rmi osixia/openldap

Tutorial 2: Crear una imagen desde un fichero Dockerfile

Un fichero Dockerfile es simplemente un fichero de texto que nos permite definir las instrucciones a seguir por Docker para construir una imagen.
En este ejemplo vamos a crear una imagen con un SO Centos 7 y le vamos a instalar el servidor web Apache:

FROM centos:latest
MAINTAINER http://www.centos.org
RUN yum -y update && yum clean all
RUN yum -y install httpd && yum clean all
EXPOSE 80
RUN rm -rf /run/httpd/* /tmp/httpd*
ENTRYPOINT /usr/sbin/apachectl -D FOREGROUND

RUN: Ejecuta una sentencia sobre la imagen base
EXPOSE: Expone el puerto 80 del contenedor para que pueda ser mapeado por la máquina anfitrión.
ENTRYPOINT: Indicamos que se ejecute apache2ctl -D FOREGROUND cada vez que arranquemos el contenedor.
Construimos la imagen con el comando:

docker build -t cloudadmins/centos7-httpd --file <DOCKERFILE_NAME> .

Finalmente, instanciamos nuestro contenedor con el comando:

docker run -d --name cloudadmins -p 80:80 -v <PATH_HOST>/www:/var/www/html cloudadmins/centos7-httpd

En esta ocasión hemos utilizado el parámetro -v para que el directorio /var/www/html del contenedor, sea el indicado en el comando de la máquina anfitrión.
 

Referencias i recursos

http://inlab.fib.upc.es/es/blog/docker-insights-des-de-la-jasp
http://media.fib.upc.edu/fibtv/streamingmedia/view/2/1128