La idea és disposar d'un clúster amb Docker Engine i poder instanciar-hi allà els nostres contenidors Docker.
Docker Swarm: Ens permet crear un clúster docker. El node màster rebrà i distribuirà els contenidors als nodes secundaris on s'executaran.
Consul: Ens proporcionarà el servei de discovery dels nous nodes que afegim al clúster swarm.
Requeriments previs
- Docker Engine: Ens permet crear els contenidors, gestionar-los i instanciar-los
- Docker Machine: Ens permet crear i gestionar les maquines virtuals
- Driver Docker Machine Opennebula: Ens permet utilitzar el docker-machine al cloud de l'OpenNebula
Instal·lar el requeriments:
Per a poder implementar el docker swarm cluster amb l'OpenNebula hem d'instalar el Docker Engine, Docker Machine i el Driver Docker Machine Opennebula.
Teniu disponible el següent tutorial de com fer-ho: DOCKER-1 Docker Machine OpenNebula Driver
Consul
Disposarem d'una maquina virtual que ens proporcionarà el servei de discovery amb consul
Creem una màquina virtual a l'OpenNebula anomenada consul i després executem un contenidor docker amb consul dins d'ella.
docker-machine create -d opennebula --opennebula-network-id [network_id] --opennebula-image-id [boot2docker_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)
Docker Swarm
Disposarem de dos tipus de màquines virtuals amb swarm:
- Swarm-master: Aquesta màquina amb swarm serà l'encarregada de distribuir les instàncies dels contenidors als diferents nodes que tinguem al clúster.
- Swarm-node: Aquesta o aquestes màquines seran les que executaran els contenidors docker.
Swarm-master
Creem la màquina virtual del swarm-master:
docker-machine create -d opennebula --opennebula-network-id [network_id] --opennebula-image-id [boot2docker_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
Swarm-node
Creem la màquina virtual del swarm-node:
docker-machine create -d opennebula --opennebula-network-id [network_id] --opennebula-image-id [boot2docker_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-01
Podem crear els nodes que vulguem. Només hem de canviar el nom de la màquina virtual
Connexió amb el Swarm
Un cop hem creat les diferents màquines virtuals que volem, ens connectem al node màster del swarm.
eval $(docker-machine env --swarm swarm-master) docker info
Xarxa
Un cop el nostre clúster d'swarm està corrent podem crear xarxes internes dins del clúster.
docker network create --driver overlay --subnet=10.0.1.0/24 overlay_net docker network ls
Ara ja podem instanciar contenidors docker al nostre clúster swarm.
Per a més informació : http://opennebula.org/docker-swarm-with-opennebula/
Exemple d'ús
Actualment disposeu de dues imatges, ja precreades amb el Docker Engine instal·lat que podeu fer servir:
- boot2docker
- Docker-Machine-Ubuntu-14.04
Crear el clúster swarm:
Creem les màquines virtuals de consul, swarm-master i un swarm-node amb discs volàtils de 10 GB amb les comandes:
docker-machine create -d opennebula --opennebula-network-id $NETWORK_ID --opennebula-image-name boot2docker --opennebula-b2d-size 10240 consul docker $(docker-machine config consul) run -d -p "8500:8500" -h "consul" progrium/consul -server -bootstrap CONSUL_IP=$(docker-machine ip consul) docker-machine create -d opennebula --opennebula-network-id $NETWORK_ID --opennebula-image-name boot2docker --opennebula-b2d-size 10240 --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 docker-machine create -d opennebula --opennebula-network-id $NETWORK_ID --opennebula-image-name boot2docker --opennebula-b2d-size 10240 --swarm --swarm-discovery="consul://$CONSUL_IP:8500" --engine-opt cluster-store=consul://$CONSUL_IP:8500 --engine-opt cluster-advertise="eth0:2376" swarm-node-01
On $NETWORK_ID, serà l'ID de la xarxa on crearem el clúster.
Després d'executar les comandes podem observar com s'han creat les màquines virtuals al panell de l'OpenNebula o utilitzant docker-machine:
Connectem al docker-swarm i comprovem la informació del cluster:
eval $(docker-machine env --swarm swarm-master) docker info
Creem la xarxa interna del clúster swarm i visualitzem les interfícies virtuals creades:
docker network create --driver overlay --subnet=10.0.1.0/24 overlay_net docker network ls
Ja tenim el clúster swarm configurat i corrent.
Executar contenidors docker al clúster creat:
Ara podem començar a fer servir docker sobre el clúster que acabem de crear:
Utilitzarem un contenidor nginx, per exemple
docker pull nginx docker run --name mynginx -d -p 80:80 nginx
- Podem comprovar com el contenidor s'està executant en un node del clúster:
Per accedir al servei del contenidor hem de posar la direcció IP del node del clúster al navegador.