Docker Compose, Machine y Swarm

2
13799

En este tutorial veremos como utilizar las herramientas de Docker Compose, Docker Machine y Docker Swarm.

Índice de contenidos

1. Introducción

Antes de empezar a explicar el conjunto de herramientas de docker, hay que tener claro que es docker, para ello recomiendo ver el tutorial realizado por nuestro compañero Jorge Pacheco Mengual

Desde la creación de docker se ha ido creado un conjunto de herramientas para facilitar el uso de docker, que actualmente son las siguientes:

  • Docker Machine
  • Docker Compose
  • Docker Swarm

Hay más herramientas pero esta son las más importantes.

2. Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: MacBook Pro 15′ (2.5 GHz Intel Core i7, 16GB DDR3 SDRAM)
  • Sistema Operativo: Mac OS X Yosomite 10.10.5
  • NVIDIA GeForce GT 750M 2048 MB
  • Docker 1.9.0
  • Docker Machine 0.5.0
  • Docker Compose 1.5.0
  • Docker Swarm 1.0.0
  • curl 7.43.0

3. Instalación

Docker ha sacado un toolbox para facilitar la instalación (Mac y Windows) del conjunto de herramientas que existe alrededor de Docker:

  • Docker Client 1.9.0
  • Docker Machine 0.5.0
  • Docker Compose 1.5.0
  • Docker Kitematic 0.9.3
  • Boot2Docker ISO 1.9.0
  • VirtualBox 5.0.8

4. Docker Machine

Docker machine permite la gestión de Docker en máquinas virtuales en local o en un proveedor de cloud.

docker-machine create --driver virtualbox dev

Con el comando anterior se ha creado una máquina virtual para VirtualBox con el nombre dev. Para ver las máquinas creadas ejecutamos el comando:

docker-machine ls

Con este comando vemos el listado de máquinas que gestionamos.

Una vez creada la máquina el siguiente paso será decirle a Docker con que máquina tienes que hablar.

eval $(docker-machine env dev)

Con este comando se establecerán las variables de entorno que el cliente Docker leerá y que especifican la configuración TLS. Tenga en cuenta que tendrá que hacer esto cada vez que se abre una nueva pestaña o reiniciar la máquina.

A continuación se muestra el listado de drivers que soporta docker-machine. actualmente son las siguientes:

  • Amazon Web Services
  • Microsoft Azure
  • Digital Ocean
  • Exoscale
  • Google Compute Engine
  • Generic
  • Microsoft Hyper-V
  • OpenStack
  • Rackspace
  • IBM Softlayer
  • Oracle VirtualBox
  • VMware vCloud Air
  • VMware Fusion
  • VMware vSphere

Por último el listado de comandos que podemos usar con docker-machine:

  • env
  • inspect
  • ip
  • kill
  • ls
  • regenerate-certs
  • restart
  • rm
  • ssh
  • scp
  • start
  • status
  • stop
  • upgrade
  • url

Con la opción -h podemos ver la lista completa de opciones que podemos usar.

Importante:

  • Docker no recomienda el uso de Boot2Docker a favor de Docker Machine.
  • docker-machine no se recomienda para la producción todavía.

5. Docker Compose

Casi siempre nuestras aplicaciones web estarán formadas por:

  • Servidor web (nginx, apached, …)
  • Servidor aplicación (Jboss, WebLogic, …)
  • Base Datos (Oracle, MySQL, …)

Si vamos a usar Docker para desplegar nuestra aplicación, tendriamos que ejecutar los siguientes comandos:

docker run -d --name baseDatos -p 3306:3306 mysql
docker run -d --name servidoraplicacion -p 8080:8080 -l baseDatos:bbdd jboss/wildfly
docker run -d --name servidorweb -p 80:80 -l servidoraplicacion:app ngnix

Como vemos se hace un poco pesado ir arrancando cada uno de los contenedores que forman parte de nuestra arquitectura, ya que en la mayoría de los casos tendremos nuestro servidor de aplicaciones en clúster, además de una base datos NoSQL, etc.

Esto hace muy difícil la gestión de los contenedores ( puertos, enlaces, volúmenes, …). docker-compose es una herramienta que nos permite la creación y ejecución de todos los contenedores en un solo archivo (formato yaml).

Docker Compose es un archivo de texto tiene que estar en formato yaml en la que especificamos los diferentes contenedores y sus propiedades. Básicamente, podemos indicar las mismas propiedades que indicamos arrancando los contenedores individualmente con el comando docker run.

Vamos a ver un ejemplo de docker-compose.yml

docker-compose.yml
bbdd:
  image: mysql
  expose:
   - 3306

app1:
  image: jboss/wildfly
  links:
   - bbdd:redis
  expose:
   - 8080
  volumes:
   - ./webapps:/opt/jboss/wildfly/standalone/deployments/

 app2:
   image: jboss/wildfly
   links:
    - bbdd:redis
   expose:
    - 8080
   volumes:
    - ./webapps:/opt/jboss/wildfly/standalone/deployments/

web:
	build: ./
	links:
		- app1:app1
		- app2:app2
	ports:
	  - 80:80

Como vemos, tenemos definidos cuatros contenedores:

  • Un contenedor llamado bbdd que contiene una instalación de MySQL y expone el puerto 3306 en la red interna de docker.
  • Un contenedor llamado app1 que contiene un WildFly y expone el puerto 8080 en la red interna de Docker, un enlace con el contenedor bbdd y el volúmen para que WildFly lea nuestro WAR.
  • Un contenedor llamado app2 que contiene un WildFly y expone el puerto 8080 en la red interna de Docker, un enlace con el contenedor bbdd y el volúmen para que WildFly lea nuestro WAR.
  • Un contenedor llamado web que construye un contenedor a traves de un Dockerfile, expone el puerto 80 en la red interna de Docker y lo mapea al puerto 80 de la máquina anfitrión y 2 enlaces con el contenedor app1 y app2.

Como veis hemos traslado todas las opciones de docker run en el fichero docker-compose.yml. Más opciones disponibles aquí

Lo siguiente es ejecutar docker-compose para desplegar todos los contenedores que tenemos definidos en nuestro archivo, con el comando docker-compose up y estando en el mismo directorio de trabajo donde esté ubicado el archivo yml (y previamente habiendo iniciado el servicio de Docker).

Por último el listado de comandos que podemos usar con docker-compose:

  • build
  • help
  • kill
  • ps
  • restart
  • run
  • start
  • up
  • logs
  • port
  • pull
  • rm
  • scale
  • stop

Con la opción –h podemos ver la lista completa de opciones que podemos usar.

Importante: Docker Compose está dirigido principalmente a los entornos de integración continua, desarrollo y pruebas. Para producción solo se recomienda cuando son un conjunto pequeño, para desplieges grandes todavía no.

5. Docker Swarm

Docker Swarm es una herramienta nativa que permite construir un clúster de máquinas docker:

  • Swarm Master: El responsable de todo el clúster y gestiona los recursos de varios hosts Docker.
  • Swarm Nodes: Cada nodo del clúster debe ser accesible por el Master. Cada nodo ejecuta un agente de modo que registra el daemon Docker referenciado, supervisa, y actualiza el backend descubrimiento con el estado del nodo.
  • Swarm Discovery: Por defecto, Swarm utiliza un servicio de descubrimiento, basado en Docker Hub, utilizando un token para descubrir los nodos que forman parte de un clúster. También soporta otros servicios de descubrimiento como ETCD, Consul, y Zookeeper.
  • Swarm Strategy: cuenta con múltiples estrategias para la clasificación de los nodos. Cuando se ejecuta un nuevo contenedor, Swarm decide colocarlo en el nodo con el ránking más alto calculado para su estrategia elegida. cuenta con múltiples estrategias para la clasificación de los nodos:
    • binpack: nodo con mayor número de contenedores de funcionamiento.
    • spread: nodo con menor número de contenedores de funcionamiento (por defecto).
    • random: aleatorio.
  • Swarm Networking: es totalmente compatible para el nuevo modelo de red (overlay) de docker 1.9.

Una vez visto los conceptos de Docker Swarm lo siguientes es crear un clúster.

Swarm Master

Como he comentado anteriormente vamos a usar el sistema de descubrimiento por defecto, por lo que necesitamos un token, lo conseguimos ejecutando el siguiente comando:

sid=$(docker run swarm create)
echo $sid

Guardamos el token en la variable sid. Procedemos a crear el master y los nodos.

docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://$sid swarm-master

Con este comando creamos una máquina con el nombre swarm-master con la configuración de swarm master

Swarm Nodes

Ahora procedemos a crear los nodos del clúster, en este caso creamos dos nodos, con los siguientes comandos:

docker-machine create -d virtualbox --swarm --swarm-discovery token://$sid swarm-node-01
docker-machine create -d virtualbox --swarm --swarm-discovery token://$sid swarm-node-02

Con estos comandos creamos dos máquinas con el nombre swarm-node-01 y swarm-node-02 con la configuración de swarm node

Ahora vamos a ver el conjunto de maquinas que hemos creado anteriormente con docker-machine ls.

Lo siguiente es conectarnos y ver la información del clúster con el siguiente comando. Click en la imagen para verla más en detalle:

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

Información del clúster

Con esto ya tenemos creado y configurado nuestro clúster, por último sería ejecutar nuestros contendores en el clúster con docker run o docker-compose.

Con esto termina nuestro tutorial de las herramientas de Docker.

7. Conclusiones

Como hemos visto, Docker se ha precupado de crear un conjunto de herramientas que facilite el uso de Docker:

  • Docker Machine: para poder crear y gestionar un conjunto de máquinas docker.
  • Docker Compose: para poder gestionar un conjunto de contenedores.
  • Docker Swarm: para poder crear un clúster de máquinas docker.

Espero que el tutorial os haya animado a usar (o al menos probar) estas herramientas de Docker.

8. Referencias

2 COMENTARIOS

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad