Mettre en place du load balancing avec Caddy

Linux 9 juil. 2026

Caddy est souvent utilisé comme reverse proxy HTTPS grâce à sa configuration simple et à la gestion automatique des certificats TLS.

Au delà de sa fonctionnalité de serveur web et Reverse Proxy, Caddy peut aussi faire du load balancing entre plusieurs backends.

Dans cet article, nous allons configurer Caddy pour répartir le trafic HTTP vers plusieurs serveurs web.

Objectif

Nous allons créer l’architecture suivante :

Client
  |
  v
caddy-lb.local
  |
  v
Caddy
  |
  +--> web-01
  +--> web-02
  +--> web-03

Donc en interrogeant le nom local caddy-lb.local, il faut qu'un des 3 serveurs web redirige notre requête vers le serveur web Caddy.

Prérequis

Pour suivre cet article, il faut disposer de :

  • Docker et Docker Compose
  • Un accès sudo
  • Un fichier /etc/hosts modifiable

Le projet

Voici les 2 fichiers qui composent notre projet :

.
├── Caddyfile
└── docker-compose.yml

Le fichier hosts

Commencez par éditer votre fichier /etc/hosts en ajoutant l'entrée suivante :

172.50.0.100 caddy-lb.local

Testez la résolution DNS en exécutant la commande suivante :

ping caddy-lb.local
Retour attendu :
$ ping caddy-lb.local
PING caddy-lb.local (172.50.0.100) 56(84) bytes of data.
64 bytes from caddy-lb.local (172.50.0.100): icmp_seq=1 ttl=64 time=0.132 ms
64 bytes from caddy-lb.local (172.50.0.100): icmp_seq=2 ttl=64 time=0.136 ms
64 bytes from caddy-lb.local (172.50.0.100): icmp_seq=3 ttl=64 time=0.121 ms
64 bytes from caddy-lb.local (172.50.0.100): icmp_seq=4 ttl=64 time=0.090 ms

Le Docker Compose

Notre fichier docker-compose.yml va nous servir à :

  • Déployer notre serveur web Caddy
  • Déployer notre 3 backends qui font office de Load Balancers
  • Un réseau Docker commun.

Créer le fichier comme suivant :

services:
  caddy:
    image: caddy:2
    container_name: caddy-lb
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config
    networks:
      caddy-net:
        ipv4_address: 172.50.0.100

  web-01:
    image: traefik/whoami
    container_name: web-01
    restart: unless-stopped
    hostname: web-01
    networks:
      caddy-net:
        ipv4_address: 172.50.0.11

  web-02:
    image: traefik/whoami
    container_name: web-02
    restart: unless-stopped
    hostname: web-02
    networks:
      caddy-net:
        ipv4_address: 172.50.0.12

  web-03:
    image: traefik/whoami
    container_name: web-03
    restart: unless-stopped
    hostname: web-03
    networks:
      caddy-net:
        ipv4_address: 172.50.0.13

networks:
  caddy-net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.50.0.0/16
          gateway: 172.50.0.1

volumes:
  caddy_data:
  caddy_config:

L’image traefik/whoami est pratique pour les tests, car elle affiche le nom du conteneur qui répond.

Configurer Caddy

Créer le fichier :

http://caddy-lb.local {
    reverse_proxy web-01:80 web-02:80 web-03:80
}

Caddy va recevoir les requêtes sur caddy-lb.local, puis les répartir entre les trois conteneurs.

Le préfixe http:// est volontaire : comme caddy-lb.local est un domaine local, Let’s Encrypt ne pourra pas générer de certificat public.

Démarrer les conteneurs

Lancer la stack :

docker compose up -d

Vérifier l'état des conteneurs :

docker compose ps
Résultat attendu :
NAME       IMAGE            STATUS
caddy-lb   caddy:2          Up
web-01     traefik/whoami   Up
web-02     traefik/whoami   Up
web-03     traefik/whoami   Up

Tester le load balancing

Faire une première requête :

curl http://caddy-lb.local

Puis lancer plusieurs requêtes :

for i in {1..10}; do curl -s http://caddy-lb.local | grep Hostname; done
Exemple de résultat :
Hostname: web-01
Hostname: web-02
Hostname: web-03
Hostname: web-01
Hostname: web-02

On voit ici que ce n'est pas systématiquement le même backend qui répond !

Choisir une stratégie de répartition

Par défaut, Caddy répartit les requêtes entre les backends disponibles. Vous pouvez forcer une stratégie avec lb_policy.

Exemple avec round_robin :

http://caddy-lb.local {
    reverse_proxy web-01:80 web-02:80 web-03:80 {
        lb_policy round_robin
    }
}

Et bien d'autres configurations possibles...

Conclusion

Nous avons déployé Caddy avec Docker Compose pour faire du load balancing entre plusieurs conteneurs web.

Cette configuration permet de :

  • lancer rapidement un reverse proxy
  • répartir le trafic entre plusieurs backends
  • tester avec un domaine local
  • ajouter des health checks
  • passer facilement sur un vrai domaine avec HTTPS automatique.

etc...

Caddy est une solution simple, moderne et très pratique pour exposer plusieurs applications derrière un reverse proxy déployé via Docker.

Mots clés