Scaling docker-compose avec haproxy

  1. 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 ».

  1. 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
  1. 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 ?

  1. 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.