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 !!!
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 >}}
{{< highlight bash >}}
Supression du service
$ docker service rm helloworld {{< /highlight >}}
Hervé Leclerc
Découvrez les derniers articles d'alter way
- kubevpn
- Kubernetes 1.32
- re:Invent 2024 : AWS mise tout sur l'IA pour son Cloud
- OVHcloud Summit 2024 : L’innovation au cœur d’un cloud souverain et performant
- Big Data & AI Paris 2024 : L'IA au cœur de toutes les transformations.
- Un retour vers l'open-source ? Vos outils DevOps préférés et leurs equivalents open-source.