在Docker Swarm中运行Traefik时如何解决问题“使用空前端规则过滤容器”

时间:2019-02-06 09:25:40

标签: docker-swarm traefik

在具有多台机器的Docker Swarm集群中运行时,Traefik既不会创建前端,也不会创建后端。

我按照以下教程https://docs.docker.com/get-started/part4/在MacBook(OS version: 10.14.2 (18C54))上创建了一个Docker Swarm。我的笔记本电脑上的docker-machine版本为0.14.0, build 89b8332,VM上运行的docker引擎版本为18.09.1, build 4c52b90。以下是创建的计算机的摘要:

docker-machines

一旦机器启动并运行并创建了集群,我就在集群中部署了以下堆栈:

version: '3.4'

services:
  api_gateway:
    image: traefik
    command: --api \
      --docker \
      --docker.swarmmode \
      --docker.watch \
      --logLevel=DEBUG
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - external
      - internal
    deploy:
      placement:
        constraints: [node.role==manager]
  redis:
    image: redis:latest
    command: ["redis-server", "--appendonly", "yes"]
    volumes:
      - redis:/data
    networks:
      - internal
    deploy:
      placement:
        constraints: [node.role==worker]
  nginx-test:
    image: valian/nginx-test-page
    labels:
      - "traefik.frontend.rule=Host:api.local.mydomain.com"
    depends_on:
      - redis
    networks:
      - external
      - internal
    deploy:
      placement:
        constraints: [node.role==worker]
networks:
  external:
    driver: overlay
    external: true
  internal:
    driver: overlay
volumes:
  redis:

下面的屏幕快照显示了正在运行的服务以及该群的集群可视化器:

portainer-services

portainer-cluster

据我了解, Traefik 应该已经发现了服务 nginx-test ,然后为其创建了前端和后端。这是Traefik仪表板的截图:

traefik-dashboard

api_gateway 服务(Traefik)似乎无法识别为 nginx-test 服务定义的前端规则,您可以在以下日志中找到:

2019-02-06T09:04:37.139463121Z time="2019-02-06T09:04:37Z" level=debug msg="Filtering container with empty frontend rule webserver_nginx-test.1 "

我在Traefik设置上缺少什么吗?在Docker Swarm集群中运行反向代理时,还有另一种设置方法吗?

1 个答案:

答案 0 :(得分:3)

使用Swarm,标签部分必须在deploy部分中定义。

https://docs.traefik.io/configuration/backends/docker/#using-docker-with-swarm-mode

version: "3"
services:
  whoami:
    deploy:
      labels:
        traefik.docker.network: traefik