Introduction

Tout est dans le titre ! Dans cet article nous allons voir comment mettre en place le load balancer Traefik devant 2 applications.

Nous allons déployer 2 nginx pour simuler 2 sites statiques et nous allons customiser la page d’accueil de chacun de nos Nginx avec les messages Hello world 1 et Hello world 2. On ne peut pas plus simple !

Installtion

Docker-compose

Créer un fichier docker-compose.yml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
version: "3.5"

services:

traefik:d
restart: alwaysd
image: traefik:1.7.10
command: --api --docker --docker.domain=app.test --logLevel=DEBUG # Enables the web UI and tells Traefik to listen to docker
depends_on:
# our setup relies on the 2 apps running. Trying to spin up traefik will bring up those too
- "app1"
- "app2"
ports:
- "80:80"
# Management UI
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./traefik.toml:/etc/traefik/traefik.toml:ro
networks:
outside-world:
internal-network:

app1:
image: nginx:alpine
labels:
- "traefik.port=80"
- "traefik.frontend.rule=Host:app1.test"
volumes:
- ./app1/:/usr/share/nginx/html:ro
networks:
internal-network:
# the aliases are not required, but are useful if the applications want to internally
# reference each other by host name
aliases:
- "app1.test"

app2:
image: nginx:alpine
labels:
- "traefik.port=80"
- "traefik.frontend.rule=Host:app2.test"
volumes:
- ./app2/:/usr/share/nginx/html:ro
networks:
internal-network:
aliases:
- "app2.test"

networks:
# everything that is *only* on "internal network" cannot talk to WAN
internal-network:
internal: true
# add this network to a container to make it talk to the rest of the world
outside-world:

Contenus HTML des apps

Créer 2 répertoires app1 et app2 contenant les fichiers index.html customisés.

Vous devriez obtenir l’arborescence suivante:

1
2
3
4
5
├── app1
│   └── index.html # Contient le texte: Hello world 1
├── app2
│   └── index.html # Contient le texte: Hello world 2
└── docker-compose.yml

/etc/hosts

Si vous êtes en local, il vous faudra configurer votre /etc/hosts avec le nom de domaine permettant d’accéder aux apps et à Traefik.

Pour ce faire editez le fichier (en mode root) /etc/hosts, et ajoutez les 3 entrées suivantes:

1
2
3
127.0.0.1       app.test
127.0.0.1 app1.test
127.0.0.1 app2.test

Test

Exécutez la commande:

1
docker-compose up

Puis rendez-vous sur http://app.test:8080 pour accéder à l’admin de Traefik et sur vos apps http://app1.test et http://app2.test.

Et voilà !

image

Pour aller plus loin, vous pouvez ajouter un fichier acme.json et le monter comme volume dans votre service Traefik pour avoir de l’HTTPS. - ./acme.json:/acme.json

Voici la doc officielle (j’en ferais peut-être un article si le temps me le permet :D) https://docs.traefik.io/configuration/acme/

htpasswd

Il est également possible d’ajouter un htpasswd:

1
htpasswd -n username

Voici ce que l’on obtient avec admin/admin (à ne pas utiliser):

1
admin:$apr1$IBj9Hfsd$kf7vXLpY4/9XD365jcp/n1

Modifier le fichier docker-compose.yml et ajoutez le label suivant dans le service traefik:

1
2
labels:
- "traefik.frontend.auth.basic=admin:$$apr1$$IBj9Hfsd$$kf7vXLpY