Docker swarm
Sources
Présentation
Docker swarm est l'orchestrateur de conteneur de Docker. Il est plutôt simple à mettre en place. Je vais ici le déployer en utilisant 3 machines:
- Mon PC comme manager
- swarm1.sq.lan et swarm2.sq.lan comme workers.
Sur les 3 machines, il faut:
- Installer Docker
- Ouvrir les ports 2377/tcp, 7946/tcp, 7946/tcp, 4789/udp
Mise en place, utilisation
Création du swarm, tokens
Sur mon manager:
docker swarm init --advertise-addr <IP du manager>
J'ai alors un retour qui me donne la commande à lancer sur les workers pour rejoindre le swarm.
To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-2sve1h1z0jlvx8x5nim1hjdcoysejx5gyegd1qyol8fhvu3z0c-dnqhw1fx70q9spxl92cqeajwj 192.168.1.70:2377
Je peux revoir cette commande à tout moment sur le manager avec docker swarm join-token worker (et utilise docker swarm join-token manager pour ajouter un manager). Je peux ajouter le flag --rotate pour faire tourner les tokens.
Je lance la commande de join sur mes workers. Je peux ensuite vérifier depuis le manager:
docker node ls
Nodes
Lister les nodes et leur état
docker node ls
Inspecter un node
docker node inspect --pretty swarm1
Drain un node
Consiste à vider un node de ses conteneurs.
docker node update --availability drain swarm1
Faire revenir un node
docker node update --availability active swarm1
Services (sans docker-compose)
Sans réseau
Je peux désormais lancer des services depuis mon manager. Sans docker-compose, la syntaxe est la suivante :
docker service create --replicas 1 --name helloworld alpine ping docker.com
- docker service : on gère les services
- create pour créer un service
- --replicas : en combien d'exemplaires le conteneur va tourner
- --name: On nomme le service
- alpine ping docker.com : le service en question.
inspecter le service, avoir son ID
docker service inspect --pretty monservice
Voir où tourne le service
docker service ps monservice
Changer le scale d'un service
Je peux changer le nombre de replicas de mon service:
docker service scale SERVICE_ID=NOMBRE_REPLICAS
Je peux ensuite vérifier avec un docker service ps monservice
Supprimer un service
docker service rm monservice
Rolling update
Rolling signifie que les replicas seront mis à jour les uns après les autres. Il va arrêter un conteneur, l'arrête, l'update, le start, passer au suivant. Si il a un échec, il met en pause.
Je part du service:
docker service create --replicas 3 --name monredis --update-delay 10s redis:3.0.6
Je le mets en version suivante:
docker service update --image redis:3.0.7 monredis
Puis je vérifie avec inspect. Si l'update s'est mise en pause:
docker service update monredis
Il est possible de passer des arguments à docker service update; voir
docker service update --help
Après une update, la sortie de docker service ps monservice affiche les mises à jour.
Déployer avec un réseau (routing mesh)
Si tous les ports sont bien ouverts, on peut normalement disposer d'un "routing mesh", en réseau maillé entre nos noeuds afin de publier nos services.
La syntaxe:
docker service create --name truc --publish published=<port exterieur>,target=<port interne> IMAGE
Par exemple avec:
docker service create --name my-web --publish published=8080,target=80 --replicas 2 nginx
... mon conteneur nginx sera dispo sur le port 8080 de chacun de mes workers. En réalité, sur chaque worker, un load balancer est présent; quelque soit le worker auquel j'accède, il saura où renvoyer le trafic. Si l'IP est routable, le port est dispo de l'extérieur de l'hôte. Sinon, le port est dispo depuis l'intérieur de l'hôte.