Docker 码头工人和Traefik蜂拥而至:集装箱正在增加,但数量达到404

Docker 码头工人和Traefik蜂拥而至:集装箱正在增加,但数量达到404,docker,docker-compose,traefik,docker-swarm-mode,Docker,Docker Compose,Traefik,Docker Swarm Mode,我正在努力使用traefik设置Docker swarm堆栈。我决定尝试将traefik作为jwolder/nginx代理的替代品,因为不幸的是后者似乎不支持Docker swrarm模式。但我发现traefik是个问题(可能是我的错!) 我有一个WordPress容器(已复制)和一个MySQL容器,以及traefik容器。swarm中的所有容器都已创建并启动,docker日志没有显示任何错误,但当我访问“example.org”(不是真正的域)时,我只看到404页面未找到。所以这一定是trae

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

我有一个WordPress容器(已复制)和一个MySQL容器,以及traefik容器。swarm中的所有容器都已创建并启动,
docker日志
没有显示任何错误,但当我访问“example.org”(不是真正的域)时,我只看到
404页面未找到
。所以这一定是traefik和我希望代理的容器之间的通信问题。然而,我也看不到traefik仪表板,所以可能还有其他事情要做

这是我的docker撰写文件:

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:
版本:“3”
服务:
特拉菲克:
图片:traefik:最新
命令:--api.unsecure=true\
--providers.docker=true\
--providers.docker.exposedbydefault=false\
--providers.docker.swarmmode=true\
--providers.docker.watch=true\
--日志级别=调试
端口:
- "80:80"
- "8080:8080"
卷数:
-/var/run/docker.sock:/var/run/docker.sock
网络:
-特拉菲克
部署:
模式:全球
安置:
限制条件:
-node.role==管理器
db:
图片:mysql:5.7
卷数:
-./db/initdb.d:/docker入口点initdb.d
网络:
-特拉菲克
环境:
MYSQL\u ROOT\u密码:
MYSQL\u数据库:
MYSQL\u用户:
MYSQL\u密码:
部署:
副本:1份
重新启动\u策略:
条件:故障时
延迟:5秒
最多尝试次数:3次
应用程序:
图片:my repo/wordpress:最新
取决于:
-分贝
网络:
-特拉菲克
环境:
-虚拟_端口=80
-虚拟主机=example.org
部署:
副本:2份
重新启动\u策略:
条件:故障时
延迟:5秒
最多尝试次数:3次
标签:
-“traefik.enable=true”
-“traefik.frontend.rule=Host:example.org”
网络:
特拉菲克:
原始的nginx代理设置工作得很好,但正如我所说的,它不允许我运行swarm。我用traefik做实验才一天,所以这可能是小学生犯的某种错误


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

好的,所以我让它在非swarm模式下使用以下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:
版本:“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:
和代理容器标签

- "traefik.http.services.app.loadbalancer.server.port=80"
。。。所以我不确定我做对了什么。如果能提供任何线索,我将不胜感激

不过,至少现在起作用了

更新:Traefik文档声明标签

traefik.http.services.<service_name>.loadbalancer.server.port
traefik.http.services..loadbalancer.server.port
是(请在该页的服务下查看)。看来我只是错过了这一点

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