如何以Docker为服务发现提供商连接两台服务器的Traefik实例?
跨服务器Traefik实例互联与Docker服务发现配置
一、主从Traefik实例基础互联配置
要通过主服务器Traefik访问从服务器的Traefik,核心是让主Traefik能路由请求到从Traefik的服务端口,同时确保从服务器的Traefik端口允许主服务器访问:
确保从服务器Traefik可被主服务器访问
- 从服务器的Traefik容器需暴露API/dashboard端口(比如
8080),并且服务器防火墙允许主服务器IP访问该端口。 - 从服务器Traefik静态配置需开启API和dashboard:
api: dashboard: true
- 从服务器的Traefik容器需暴露API/dashboard端口(比如
主服务器Traefik添加路由规则
在主服务器Traefik的动态配置中添加路由,指向从服务器的Traefik地址:http: routers: slave-traefik: rule: "Host(`slave-traefik.your-domain.com`)" service: slave-traefik-service services: slave-traefik-service: loadBalancer: servers: - url: "http://<从服务器IP>:8080"
二、基于Docker的服务发现方案(Docker Swarm集群)
如果想通过Docker原生服务发现来管理两台Traefik实例,需要将两台服务器加入同一个Docker Swarm集群,利用Swarm的服务发现能力实现自动互联:
步骤1:搭建Docker Swarm集群
- 在主服务器执行初始化命令:
docker swarm init --advertise-addr <主服务器IP> - 复制输出的
docker swarm join命令,在从服务器执行,完成集群加入。
步骤2:在Swarm集群中部署Traefik实例
创建docker-compose.yml文件,配置Traefik使用Docker Swarm作为服务发现提供商,可指定部署到主/从节点或全局部署:
version: "3.8" services: traefik: image: traefik:v2.10 command: - "--api.insecure=true" # 生产环境建议关闭,改用HTTPS - "--providers.docker=true" - "--providers.docker.swarmMode=true" - "--providers.docker.exposedbydefault=false" - "--entrypoints.web.address=:80" ports: - "80:80" - "8080:8080" volumes: - "/var/run/docker.sock:/var/run/docker.sock:ro" deploy: placement: constraints: - node.role == <worker/manager> # 去掉约束则全局部署到所有节点
执行部署命令:
docker stack deploy -c docker-compose.yml traefik-cluster
步骤3:通过Swarm服务发现实现Traefik互联
在Swarm集群中,每个Traefik实例作为Swarm服务存在,可直接通过服务名访问。在主Traefik的路由配置中,直接指向从Traefik的Swarm服务名即可:
http: routers: slave-traefik: rule: "Host(`slave-traefik.your-domain.com`)" service: traefik-cluster_traefik # Swarm服务名格式为<stack名>_<服务名> services: traefik-cluster_traefik: loadBalancer: serversTransport: insecureSkipVerify: true # 如果从Traefik使用自签证书需添加
这样无需手动配置从服务器IP,Swarm会自动维护服务的地址信息,实现动态服务发现。
内容的提问来源于stack exchange,提问作者Anish kumar
相关产品推荐
相关产品推荐

