Docker Swarm with Traefik:容器已启动但收到 404

Docker Swarm with Traefik: containers are up but getting 404

我正在努力使用 traefik 设置 Docker 群堆栈。我决定尝试使用 traefik 作为 jwolder/nginx-proxy 的替代品,不幸的是后者似乎不支持 Docker swrarm 模式。但我发现 traefik 是个问题(可能是我的错!)。

我有一个 WordPress 容器(复制)和一个 MySQL 容器,以及 traefik 容器。 swarm 中的所有容器都已创建并启动,docker logs <container_id> 没有显示任何错误,但是当我访问 'example.org'(不是真实域)时,我只看到 404 page not found。所以这一定是 traefik 和我希望代理的容器之间的通信问题。但是我也没有看到 traefik 仪表板,所以可能还有其他事情正在发生。

这是我的 docker-compose 文件:

version: '3'

services:
  traefik:
    image: traefik:latest
    command: --api.insecure=true \
      --providers.docker=true \
      --providers.docker.exposedbydefault=false \
      --providers.docker.swarmmode=true \
      --providers.docker.watch=true \
      --logLevel=DEBUG
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - traefik
    deploy:
      mode: global
      placement:
        constraints:
          - node.role == manager

  db:
    image: mysql:5.7
    volumes:
      - ./db/initdb.d:/docker-entrypoint-initdb.d
    networks:
      - traefik
    environment:
      MYSQL_ROOT_PASSWORD: <root_password>
      MYSQL_DATABASE: <db_name>
      MYSQL_USER: <db_user>
      MYSQL_PASSWORD: <user_password>
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3

  app:
    image: my-repo/wordpress:latest
    depends_on:
      - db
    networks:
      - traefik
    environment:
      - VIRTUAL_PORT=80
      - VIRTUAL_HOST=example.org
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
      labels:
        - "traefik.enable=true"
        - "traefik.frontend.rule=Host:example.org"

networks:
  traefik:

原始的 nginx-proxy 设置工作得很好,但是,正如我所说,不允许我 运行 群。我只试用了一天的 traefik,所以这可能是某种小学生的错误。

N.B:我在 /etc/hosts 中将我的实际 .org 域别名为 127.0.0.1。也许这是个问题?我无法想象会是这样,我已经运行宁 Docker 个容器使用该设置很长时间了,没有任何问题。

好的,所以我使用以下 docker-compose 文件使其在非集群模式下工作:

版本:'3'

services:
  traefik:
    image: "traefik:v2.0.0-rc3"
    container_name: "traefik"
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - traefik

  db:
    image: mysql:5.7
    volumes:
      - ./db/initdb.d:/docker-entrypoint-initdb.d
    networks:
      - traefik
    environment:
      MYSQL_ROOT_PASSWORD: <root_password>
      MYSQL_DATABASE: <db_name>
      MYSQL_USER: <db_user>
      MYSQL_PASSWORD: <user_password>

  app:
    image: my-repo/wordpress:latest
    depends_on:
      - db
    networks:
      - traefik
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.app.rule=Host(`example.org`)"
      - "traefik.http.routers.app.entrypoints=web"

networks:
  traefik:

然后我尝试了以下 swarm 配置,它起作用了:

version: '3'

services:
  traefik:
    image: "traefik:v2.0.0-rc3"
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.swarmmode=true"
      - "--providers.docker.exposedbydefault=false"
      - "--providers.docker.endpoint=unix:///var/run/docker.sock"
      - "--entrypoints.web.address=:80"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - traefik
    deploy:
      mode: global
      placement:
        constraints: [node.role==manager]

  db:
    image: mysql:5.7
    volumes:
      - ./db/initdb.d:/docker-entrypoint-initdb.d
    networks:
      - traefik
    environment:
      MYSQL_ROOT_PASSWORD: <root_password>
      MYSQL_DATABASE: <db_name>
      MYSQL_USER: <db_user>
      MYSQL_PASSWORD: <user_password>
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3

  app:
    image: my-repo/wordpress:latest
    networks:
      - traefik
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.app.rule=Host(`example.org`)"
        - "traefik.http.routers.app.entrypoints=web"
        - "traefik.http.services.app.loadbalancer.server.port=80"

networks:
  traefik:

更具体地说,我只是在添加命令后才让它工作

- "--providers.docker.endpoint=unix:///var/run/docker.sock"

和代理容器标签

- "traefik.http.services.app.loadbalancer.server.port=80"

... 所以我不太确定我做对了什么。如果能对此有所启发,我们将不胜感激。

不过,至少现在可以用了。

更新:Traefik 文档声明标签

traefik.http.services.<service_name>.loadbalancer.server.port

mandatory for Docker swarm mode(在该页面的 服务 下查看)。所以好像我只是错过了那个。