Docker swarm with traefik basic config
DockerDocker SwarmTraefikUpdate: 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 #
- 2 instances on Google Cloud Patform, or watever you'll have to test with
(Easy to prototype for almost free). - Traefik for reverse proxy and load balancer.
- Whoami as a POC (proof of concept).
- Sub-domain with DNS that will aim the master swarm node. In my case, it will be test.sirap.ovh.
Google Cloud Platform #
In compute engine tab, I created 2 instances (micro), with Ubuntu 18-04 LTS minimal image loaded. I need to :
- Install docker
- Initialize swarm
- create backend overlay network
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:
- Docker, Traefik Reverse Proxy and Hugo
- Docker Swarm, Traefik, HAProxy on Google Cloud Platform in real life
- Should You Still Use Docker Swarm in 2021