Auteur : Hervé Leclerc

Nouveautés docker 1.12

Simple

Docker reste dans son crédo : Faire simple même avec des services évolués

Nouveautés

  • Orchestration intégrée, simple, résiliente, sécurisée, distribuée
  • Creation de clusters basés sur swarm ( docker swarm init , docker swarm join)
  • Introduction de la notion de services répliqués, distribués, et balancés

Un exemple de création d’un cluster

Cluster Swarm 3 noeuds et d’un service répliqué 9 containers, distribués sur les 3 noeuds et loadbalancé

Plateforme MacOS
1: Installation du client docker 1.12 rc2 (https://github.com/docker/docker/releases)
2: Installation du cluster

# Création de la première vm 
$ docker-machine create -d virtualbox --virtualbox-boot2docker-url https://github.com/boot2docker/boot2docker/releases/download/v1.12.0-rc2/boot2docker-experimental.iso node1  

# Création de la deuxième vm
$ docker-machine create -d virtualbox --virtualbox-boot2docker-url https://github.com/boot2docker/boot2docker/releases/download/v1.12.0-rc2/boot2docker-experimental.iso node2  

# Création de la toisième vm
$ docker-machine create -d virtualbox --virtualbox-boot2docker-url https://github.com/boot2docker/boot2docker/releases/download/v1.12.0-rc2/boot2docker-experimental.iso node3  

# Liste des noeuds Docker
$ docker-machine ls  
NAME        ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS  
node1       -        virtualbox   Running   tcp://192.168.99.100:2376           v1.12.0-rc2  
node2       -        virtualbox   Running   tcp://192.168.99.101:2376           v1.12.0-rc2  
node3       -        virtualbox   Running   tcp://192.168.99.102:2376           v1.12.0-rc2  

# On se positionne sur le premier noeud Docker
$ eval $(docker-machine env node1)  

# On crée le Swarm master (manager)
$ docker swarm init --listen-addr $(docker-machine ip node1):2377  
Swarm initialized: current node (7a3ukcuv4sfne3qvgmmmhn5x8) is now a manager.  

# On liste les noeuds du swarm
$ docker node ls  
D                           NAME      MEMBERSHIP  STATUS  AVAILABILITY  MANAGER STATUS  LEADER  
dxn1zf6l61qsb1josjja83ngz *  manager1  Accepted    Ready   Active        Reachable       Yes  

# On se positionne sur le deuxième noeud Docker
$ eval $(docker-machine env node2)  

# On ajoute le deuxième noeud Docker au swarm
$ docker swarm join $(docker-machine ip node1):2377  

# On se positionne sur le troisième noeud Docker
$ eval $(docker-machine env node3)  

# On ajoute le troisième noeud Docker au swarm
$docker swarm join $(docker-machine ip node1):2377  

# On se positionne sur le premier noeud Docker
$ eval $(docker-machine env node1)  

# On liste les noeuds
$ docker node ls  
ID                           NAME   MEMBERSHIP  STATUS  AVAILABILITY  MANAGER STATUS  
5h3w2aol0gh4o3k3lszlufd5v    node2  Accepted    Ready   Active  
7a3ukcuv4sfne3qvgmmmhn5x8 *  node1  Accepted    Ready   Active        Leader  
eindwkhddr0gzbi4knhyzct9k    node3  Accepted    Ready   Active  

Et voila pour le cluster !!!

Simple à pleurer !!! So Simple

Un exemple de création d’un service répliqué, distribué et load balancé

# Création d'un réseau d'overlay (pour le fun !)
$  docker network create -d overlay hlnet

NETWORK ID          NAME                DRIVER              SCOPE
c1129200ef7a        bridge              bridge              local
30f645726d34        docker_gwbridge     bridge              local
081e6422f153        host                host                local
d1u4xn6llrn1        ingress             overlay             swarm
0z5h9m5se2uw        nethl               overlay             swarm
4163483999a5        none                null                local

# Notez le réseau "créé"  par le cluster swarm (ingress)

# On va utiliser l'image tutum hello world, elle bien car elle donne le hash du container qui s'execute
# On va créer pour le service helloworld 9 containers qui vont être distribués, on publie le port 80 des containers
$ docker service create --replicas 9 --name helloworld --network nethl --publish 80/tcp  tutum/hello-world

# on liste les containers du service
$ docker service tasks helloworld
ID                         NAME          SERVICE     IMAGE              LAST STATE          DESIRED STATE  NODE
82cg2suf8jr57kvcfphsx6stz  helloworld.1  helloworld  tutum/hello-world  Running 20 seconds  Running        node3
bn7kozvi5rhs9t79hdb8t643g  helloworld.2  helloworld  tutum/hello-world  Running 20 seconds  Running        node1
cw6y3pslyrqlwt3jrvlu92vjj  helloworld.3  helloworld  tutum/hello-world  Running 20 seconds  Running        node3
bla32ai1yxvsbbrt29xjqcktf  helloworld.4  helloworld  tutum/hello-world  Running 20 seconds  Running        node1
89vdrax37ol6ytmjyca3x99kt  helloworld.5  helloworld  tutum/hello-world  Running 20 seconds  Running        node2
5z6x9wbkeu7eqkr7v4h0hl4n6  helloworld.6  helloworld  tutum/hello-world  Running 20 seconds  Running        node1
2f5e73eff12ibric81a4lvr0i  helloworld.7  helloworld  tutum/hello-world  Running 20 seconds  Running        node2
chd39gs4q143nrpwzatetfza7  helloworld.8  helloworld  tutum/hello-world  Running 20 seconds  Running        node3
db1bsvmifg4wyftbxjmr4plnl  helloworld.9  helloworld  tutum/hello-world  Running 20 seconds  Running        node2

# Notez la réplication et la distribution ;)

# On inspecte le service pour trouver le port exposé
$ docker service inspect helloworld
$ docker service inspect -f '{{json .Endpoint.Ports}}' helloworld
[{"Protocol":"tcp","TargetPort":80,"PublishedPort":30000}]

# Sur Linux(386), Linux(Itanium), FreeBSD, BSD/OS, Solaris, Cygwin, Mac-OS X, HP-UX  on a la possibilité d'utiliser un loadbalancer super simple 
# qui s'appelle **balance** :
# http://www.inlab.de/balance.html
# Installation sur macOS :
$ brew install balance 


# On va "loadbalancer" le service sur les 3 noeuds en round robin sur les noeuds, le swarm fera le round robin (par défaut) sur les containers d'un noeud

$ sudo balance  -f 80 192.168.99.100:30000 192.168.99.101:30000 192.168.99.102:30000

# On lance le navigateur
$ open http://localhost

# puis on ouvre une fenetre en navigation privée et normalement l'id du container a changé

nav

# Supression  du service
$ docker service rm helloworld

handle

Hervé Leclerc