How to fix Traefik "Gateway Timeout" for Docker services
Problem
If you have setup your Traefik instance with Docker providers, you will often encounter an issue where every service running on Docker or docker-compose
will return
Gateway Timeout
(HTTP response 504) after a couple of seconds.
Why does the gateway timeout occur?
This issue is caused by the Traefik instance not being on the same Docker network(s) as the containers running the services. Therefore, the IP address of the traefik
container is firewalled from being able to access the IP addresses of the docker
containers.
There are two ways to fix this issue.
Preferred solution: Use host networking
The host is able to access all docker containerIP addresses. Therefore, we can operate the traefik
contaienr with network_mode: "host"
so it doesn’t receive a separate IP address in a separate network but uses the hosts’s IP address and ports directly.
In order enable host networking in a docker-compose
-based setup, use
network_mode: "host"
For example:
version: "3.3"
services:
traefik:
image: "traefik:v2.4.8"
network_mode: "host"
# [...]
The approach of using host network also has the added advantage of increasing traefik
throughput, since you don’t need any docker port forwarding but the host ports (like port 80
for HTTP and port 443
for HTTPS) are connected directly to traefik
.
Alternate solution: Add traefik
to every docker network
You can also add the traefik instance to each and every docker network where a service container is located. This will work, but you need to remember to add the traefik
instance to every docker container. Since this is not only often a lot of work (especially if you have many services with separate networks running in your setup)