Docker : le cinquième pas.

Attention ceci est mon brouillon avant de faire une belle documentation sur Docker (il y a à boire et à manger).

Avant de me lancer dans « HAProxy« , je vais faire un test avec « Docker Swarm« .

Pour l’instant « Docker Swarn » n’est pas un répartiteur de charge comme « HAproxy ». En fait il répartit la charge au moment du déploiement. Et aussi il permet le déploiement sur plusieurs servers à la fois, ce qui est un gain de temps énorme pour les administrateurs.

Je vais donc me lancer dans « Docker Swarm« , la première étape est la suivante :

[root@localhost ~]# docker pull swarm
Using default tag: latest
latest: Pulling from library/swarm
8c01723048ed: Pull complete 
28ef38ffcca5: Pull complete 
f1f933319091: Pull complete 
a3ed95caeb02: Pull complete 
Digest: sha256:8b007c8fc861cfaa2f0b9160e6ed3a39109af6e28dfe03982a05158e218bcc52
Status: Downloaded newer image for swarm:latest

On crée le swarm :

[root@localhost ~]# docker run --rm swarm create
553e1256993f92792ddd075713b16e34

Ensuite on lance des agents (bien noter le token en vert pour la suite):

[root@localhost ~]# docker run -d swarm join --advertise 10.0.0.101:2375 token://553e1256993f92792ddd075713b16e34
b61b2c9ea993e85279f720ebaa7bb60f1e187f2f09aa073772f7ae1ac99df636
[root@localhost ~]# docker run -d swarm join --advertise 10.0.0.102:2375 token://553e1256993f92792ddd075713b16e34
7acaca267109e1505890757a03d01b2833dd6dc2a750520bab46bf463d4c344b
[root@localhost ~]# docker run -d swarm join --advertise 10.0.0.103:2375 token://553e1256993f92792ddd075713b16e34
6c8fae76bce2c75be454944b3fd04a591f3811f6109e400dd62b0f9cab3a8c11
[root@localhost ~]# docker run -d swarm join --advertise 10.0.0.104:2375 token://553e1256993f92792ddd075713b16e34
75003c0fea9dfe0df1f613d360968758d96257aa27c19b39a671d4028235685f

J’ai donc 4 agents qui sont sur 4 ip différentes et qui écoutent sur le port 2375.
Maintenant je lance le manageur

[root@localhost ~]# docker run -d -p 80:2375 swarm manage token://553e1256993f92792ddd075713b16e34
cd4d60fd7638f775a4e04afad034877adf38a2b627abc31e4d4182ddd6e43470
docker: Error response from daemon: driver failed programming external connectivity on endpoint compassionate_mahavira (b4edffad195ad03292147ffe3cc6d753c6814c9b6bcd16835e01f249e64364e6): Bind for 0.0.0.0:80 failed: port is already allocated.

Aie cela plante car j’ai oublié de tuer le précédent qui écoute aussi sur le port 80.

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
75003c0fea9d        swarm               "/swarm join --advert"   4 minutes ago       Up 4 minutes        2375/tcp                 nauseous_carson
6c8fae76bce2        swarm               "/swarm join --advert"   4 minutes ago       Up 4 minutes        2375/tcp                 adoring_visvesvaraya
7acaca267109        swarm               "/swarm join --advert"   4 minutes ago       Up 4 minutes        2375/tcp                 evil_northcutt
b61b2c9ea993        swarm               "/swarm join --advert"   4 minutes ago       Up 4 minutes        2375/tcp                 dreamy_lovelace
9cf698cacc2e        my-server           "/sbin/server"           About an hour ago   Up About an hour    0.0.0.0:80->80/tcp       my-server3
2fc533c55725        postgres            "/docker-entrypoint.s"   4 hours ago         Up 4 hours          0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# docker stop 9cf698cacc2e
9cf698cacc2e
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
75003c0fea9d        swarm               "/swarm join --advert"   5 minutes ago       Up 5 minutes        2375/tcp                 nauseous_carson
6c8fae76bce2        swarm               "/swarm join --advert"   5 minutes ago       Up 5 minutes        2375/tcp                 adoring_visvesvaraya
7acaca267109        swarm               "/swarm join --advert"   5 minutes ago       Up 5 minutes        2375/tcp                 evil_northcutt
b61b2c9ea993        swarm               "/swarm join --advert"   5 minutes ago       Up 5 minutes        2375/tcp                 dreamy_lovelace
2fc533c55725        postgres            "/docker-entrypoint.s"   4 hours ago         Up 4 hours          0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# docker run -d -p 80:2375 swarm manage token://553e1256993f92792ddd075713b16e34
37a3a8a409b6683c7495cbbda3f18f7e1bd2da3c364252303ba52860eaba9a64
[root@localhost ~]# docker run --rm swarm list token://553e1256993f92792ddd075713b16e34
10.0.0.104:2375
10.0.0.102:2375
10.0.0.103:2375
10.0.0.101:2375
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HTTP/1.1 400 Bad Request

Maintenant je peux donc repasser à HAproxy qui est un vrai loadbalanceur. Pour le loadbalanceur il y a aussi Nginx.

Les notions à connaitre sous Docker semblent être (dans un premier temps):

  • Consul pour la découverte des services de façon dynamique.
  • Nginx ou HAProxy pour la répartition de charge.
  • Registrator pour s’enregistrer en temps que service.
  • La création d’un Dockerfile
  • Le lancement, l’arrêt, le status de ./Container sous Docker.

Je vais essayer de faire une documentation détaillée quand je maitriserais un peu mieux.