DevOps Blog - Nicolas Paris

Docker swarm with traefik basic config

DockerDocker SwarmTraefik

Update: a full stack in production, with load balancers, more complexe and reliable, was describe on this blog post.

Let's setup a basic 2 hosts load-balanced whoami with docker swarm and Traefik.

The setup

Google Cloud Platform

In compute engine tab, I created 2 instances (micro), with Ubuntu 18-04 LTS minimal image loaded. I need to :

wget -O - https://get.docker.com/ | sudo bash
sudo usermod -aG docker <username>
exit
docker swarm init
docker network create --driver=overlay backend

Make sure you has joined the node with something like :

docker swarm join --token SWMTKN-1-4uci0t...ve4q0-bnp...q8e 10.142.xx.xx:2377

docker-compose.yml

I've done simple, without ACME, no https, just plain http.

Here the docker-compose.yml, I had problem without the - "--docker.network=backend", as it couldn't get
the network right, I had lot's of 504 gateway timeout.

version: "3"

networks:
backend:
driver: overlay
external: true

services:
traefik:
image: traefik
ports:
- "80:80" # The HTTP port
- "443:443"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command:
- "--api"
- "--entrypoints=Name:http Address::80"
- "--defaultentrypoints=http"
- "--docker"
- "--docker.swarmMode"
- "--docker.domain=mydomain.ca"
- "--docker.watch"
- "--docker.network=backend"
networks:
- backend
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
whoami:
image: emilevauge/whoami
deploy:
replicas: 2
labels:
- "traefik.port=80"
- "traefik.frontend.rule=Host:test.sirap.ovh"
networks:
- backend
ports:
- 8081:80

Now, let's deploy the stack.

docker stack deploy -c docker-compose.yml test

Let's check the result, seem's good, it load balance from one host to another.

:~$ http "test.sirap.ovh" | grep Hostname
Hostname: d5b3ba65bb5c
:~$ http "test.sirap.ovh" | grep Hostname
Hostname: c9ca97496d84
:~$ http "test.sirap.ovh" | grep Hostname
Hostname: d5b3ba65bb5c

Related to: