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 {{< highlight bash >}}

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

{{< /highlight >}}

Et voila pour le cluster !!!

Simple à pleurer !!! So Simple

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

{{< highlight bash >}}

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é

{{< /highlight >}}

nav

{{< highlight bash >}}

Supression du service

$ docker service rm helloworld {{< /highlight >}}

handle

Hervé Leclerc

Découvrez les technologies d'alter way