Traefik "Gateway Timeout" für Docker-Dienste beheben
Problem
Wenn die Traefik-Instanz mit Docker-Providern eingerichtet wurde, tritt häufig ein Problem auf, bei dem jeder Dienst, der auf Docker oder docker-compose läuft, nach einigen Sekunden
Gateway Timeout(HTTP-Antwort 504) zurückgibt.
Warum tritt das Gateway-Timeout auf?
Dieses Problem wird dadurch verursacht, dass sich die Traefik-Instanz nicht im selben Docker-Netzwerk befindet wie die Container, auf denen die Dienste laufen. Daher ist die IP-Adresse des traefik-Containers durch eine Firewall blockiert und kann nicht auf die IP-Adressen der docker-Container zugreifen.
Es gibt zwei Möglichkeiten, dieses Problem zu beheben.
Bevorzugte Lösung: Host-Networking verwenden
Der Host kann auf alle Docker-Container-IP-Adressen zugreifen. Daher kann der traefik-Container mit network_mode: "host" betrieben werden, sodass er keine separate IP-Adresse in einem separaten Netzwerk erhält, sondern die IP-Adresse und Ports des Hosts direkt verwendet.
Um Host-Networking in einem docker-compose-basierten Setup zu aktivieren, verwenden
network_mode: "host"Beispielsweise:
services:
traefik:
image: "traefik:v2.4.8"
network_mode: "host"
# [...]Der Ansatz mit Host-Networking hat auch den zusätzlichen Vorteil, dass der traefik-Durchsatz erhöht wird, da kein Docker-Port-Forwarding erforderlich ist, sondern die Host-Ports (wie Port 80 für HTTP und Port 443 für HTTPS) direkt mit traefik verbunden sind.
Alternative Lösung: traefik zu jedem Docker-Netzwerk hinzufügen
Die Traefik-Instanz kann auch jedem Docker-Netzwerk hinzugefügt werden, in dem sich ein Dienst-Container befindet. Dies funktioniert, aber es muss daran erinnert werden, die traefik-Instanz zu jedem Docker-Container hinzuzufügen. Da dies nicht nur oft viel Arbeit ist (insbesondere wenn viele Dienste mit separaten Netzwerken im Setup laufen)