« Docker swarm » : différence entre les versions

De Justine's wiki
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Aucun résumé des modifications
Ligne 40 : Ligne 40 :
==== Faire revenir un node ====
==== Faire revenir un node ====
  docker node update --availability active swarm1
  docker node update --availability active swarm1
==== Quitter le swarm ====
Depuis le node:
docker swarm leave
==== Supprimer un node ====
docker node rm monnode


=== Services (sans docker-compose) ===
=== Services (sans docker-compose) ===
Ligne 95 : Ligne 102 :


[[Fichier:ingress-routing-mesh.jpg|sans_cadre]]
[[Fichier:ingress-routing-mesh.jpg|sans_cadre]]
Je peux publier un port pour mon service à tout moment:
docker service update --publish-add published=<PUBLISHED-PORT>,target=<CONTAINER-PORT> <SERVICE>
Je peux vérifier mes ports:
docker service inspect --format="{{json .Endpoint.Spec.Ports}}" my-web

Version du 16 avril 2022 à 13:18

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

Quitter le swarm

Depuis le node:

docker swarm leave

Supprimer un node

docker node rm monnode

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.

Je peux publier un port pour mon service à tout moment:

docker service update --publish-add published=<PUBLISHED-PORT>,target=<CONTAINER-PORT> <SERVICE>

Je peux vérifier mes ports:

docker service inspect --format="Modèle:Json .Endpoint.Spec.Ports" my-web