Création d’un cluster Docker

modifié le : 13 septembre 2022,
par Guillaume Chéramy
 

Nous allons voir dans cert article comment créer un cluster de machines Docker et les administrer à partir d'un seul point.

Prérequis

Pour mettre en place un cluster Docker Swarm il nous faut dans un premier temps une machine avec Docker Machine installé. Reportez-vous à l'article sur docker-machine pour cela.

Je suppose aussi que vous avez les connaissances de base sur docker.

Je vais créer un cluster swarm à partir de mon Pc Bureautique et avec 3 machines :

  1. un swarm master : machine docker qui va gérer le cluster
  2. deux noeuds docker

Dans un prochain article nous parlerons de la mise en place d'un réseau commun entre les noeuds mais pour le moment chaque noeud sera indépendant.

 

Mise en place

Création d'un token

Le token va servir pour l'identification des noeuds dans le cluster. On verra aussi plus tard qu'il est possible de mettre en place des services de découverte pour automatiser l'inclusion de noeuds comme consul.

Pour créer le token :

# docker run --rm swarm create
a179bae09b0b9596ea536ad782bec650

 

Création du master

On utilise docker-machine et le drivers openstack :

# docker-machine create -d openstack --openstack-flavor-name="vps-ssd-1" --openstack-image-name="Debian 8"  --openstack-net-name="Ext-Net" --openstack-ssh-user="admin" --swarm --swarm-master --swarm-discovery token://a179bae09b0b9596ea536ad782bec650 sw-master

 

Création des noeuds

On utilise docker-machine et le drivers openstack :

# docker-machine create -d openstack --openstack-flavor-name="vps-ssd-1" --openstack-image-name="Debian 8"  --openstack-net-name="Ext-Net" --openstack-ssh-user="admin" --swarm --swarm-discovery token://a179bae09b0b9596ea536ad782bec650 swarm-node-01

# docker-machine create -d openstack --openstack-flavor-name="vps-ssd-1" --openstack-image-name="Debian 8"  --openstack-net-name="Ext-Net" --openstack-ssh-user="admin" --swarm --swarm-discovery token://a179bae09b0b9596ea536ad782bec650 swarm-node-02

 

On se retrouve donc maintenant avec un cluster de 3 machines docker :

$ docker-machine ls
NAME            ACTIVE   DRIVER      STATE     URL                          SWARM                DOCKER    ERRORS
sw-master       -        openstack   Running   tcp://167.114.227.195:2376   sw-master (master)   v1.11.1
swarm-node-01   -        openstack   Running   tcp://167.114.227.208:2376   sw-master            v1.11.1
swarm-node-02   -        openstack   Running   tcp://167.114.227.233:2376   sw-master            v1.11.1

Utiliser le cluster

On charge l'environnement du swarm-master

$ eval "$(docker-machine env --swarm sw-master)"

Pour obtenir des infos sur notre cluster :

$ docker info
Containers: 4
Images: 3
Server Version: swarm/1.2.1
Role: primary
Strategy: spread
Filters: health, port, containerslots, dependency, affinity, constraint
Nodes: 3
sw-master: 167.114.227.195:2376
└ ID: TBZN:6NS7:NBHU:7HUW:CYHE:YSSZ:K3JC:B6KY:UL6Z:2UQ6:Z6NO:LV46
└ Status: Healthy
└ Containers: 2
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 2.012 GiB
└ Labels: executiondriver=, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), provider=openstack, storagedriver=aufs
└ Error: (none)
└ UpdatedAt: 2016-05-05T05:46:03Z
└ ServerVersion: 1.11.1
swarm-node-01: 167.114.227.208:2376
└ ID: 4YPR:KMTL:XH73:WJ5F:I4KR:MSZT:EBMG:SXTB:VH2A:A6D7:ROEH:4R7H
└ Status: Healthy
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 2.012 GiB
└ Labels: executiondriver=, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), provider=openstack, storagedriver=aufs
└ Error: (none)
└ UpdatedAt: 2016-05-05T05:46:33Z
└ ServerVersion: 1.11.1
swarm-node-02: 167.114.227.233:2376
└ ID: YI57:CCDH:3UFH:43OD:L5C4:QVNS:XSTM:N3AO:BW3O:JVYD:XHIO:YWRB
└ Status: Healthy
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 2.012 GiB
└ Labels: executiondriver=, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux 8 (jessie), provider=openstack, storagedriver=aufs
└ Error: (none)
└ UpdatedAt: 2016-05-05T05:46:04Z
└ ServerVersion: 1.11.1
Kernel Version: 3.16.0-4-amd64
Operating System: linux
CPUs: 3
Total Memory: 6.037 GiB
Name: 66c588e676a8

On voit donc la liste de nos noeuds, et le cumul des ressources CPU et RAM.

On déploie un conteneur :

$ docker run --name web01 --hostname web01 -d nginx

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
91ad350c93c7        nginx               "nginx -g 'daemon off"   15 seconds ago      Up 14 seconds       80/tcp, 443/tcp     swarm-node-01/web01

Et un second :

$ docker run --name web02 --hostname web02 -d nginx

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
b43c76410135        nginx               "nginx -g 'daemon off"   3 seconds ago       Up 2 seconds        80/tcp, 443/tcp     swarm-node-02/web02
91ad350c93c7        nginx               "nginx -g 'daemon off"   45 seconds ago      Up 44 seconds       80/tcp, 443/tcp     swarm-node-01/web01

Swarm va répartir les conteneurs sur les serveurs du cluster.

Ce n'est qu'un début, pour consolider notre infrastructure il faudrait mettre de la redondance sur le master, et mettre en place des systèmes de failover entre les machines.