Scaling docker-compose avec haproxy¶
Mettre en place la structure de projet suivante :
.
├── Dockerfile
├── docker-compose.yml
├── haproxy
│ └── haproxy.cfg
├── requirements.txt
└── run.py
avec dans run.py le code du service Flask Redis précédent que nous nommons ici « web ».
Le fichier haproxy.cfg
Voici l’intégralité du fichier haproxy.cfg à utiliser :
# haproxy config file
# on utilise le dns embarqué de Docker
# la directive server-template web- 4 web:5000 signifie qu'on peut avoir jusqu'à
# 4 containers basés sur le template du service web
defaults
mode http
balance roundrobin
timeout client 60s
timeout connect 60s
timeout server 60s
# cf https://www.haproxy.com/documentation/hapee/latest/configuration/config-sections/resolvers/#
resolvers docker
nameserver dns1 127.0.0.11:53
hold valid 10s
hold other 30s
hold refused 30s
hold nx 30s
hold timeout 30s
hold obsolete 30s
# How many times to retry a query
resolve_retries 3
# How long to wait between retries when no valid response has been received
timeout retry 1s
# How long to wait for a successful resolution
timeout resolve 1s
frontend http
bind *:80
mode http
use_backend all
backend all
mode http
server-template web- 4 web:5000 check resolvers docker init-addr libc,none
listen stats
bind *:80
mode http
stats enable
stats uri /stats
stats refresh 10s
Mettez en place le docker-compose.yml correspondant
Le service « web » :
web:
build: .
ports:
- 5000
deploy:
mode: replicated
replicas: 4
Le service redis ne change pas et le service lb (load balancing) est assez simple :
lb:
image: haproxy
ports:
- "4000:80"
volumes:
- ./haproxy:/usr/local/etc/haproxy
Quel lien de dépendance faut-il ajouter à ce service ?
Puis lancement avec scaling :
docker-compose up -d --scale web=4
Testez en consultant: http://127.0.0.1:4000
Que se passe-t-il si on enlève au docker-compose la directive : port : 5000 pour le service web ?
Pour des configurations avec du routage avancé et de l’équilibrage de charge (load balancing), voir les derniers slides du cours et la section sur l’utilisation de Traefik plus loin : traefik.