【问题标题】:Docker Swarm with Traefik: containers are up but getting 404使用 Traefik 的 Docker Swarm:容器已启动但收到 404
【发布时间】:2019-10-26 19:01:18
【问题描述】:

我正在努力使用 traefik 设置 Docker 群堆栈。我决定尝试使用 traefik 作为 jwolder/nginx-proxy 的替代品,因为不幸的是后者似乎不支持 Docker shrarm 模式。但我发现 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 设置运行良好,但正如我所说,不允许我运行 swarm。我只试验了一天的 traefik,所以这可能是某种小学生的错误。

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

【问题讨论】:

    标签: docker docker-compose traefik docker-swarm-mode


    【解决方案1】:

    好的,所以我使用以下 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(查看该页面上的服务)。所以好像我只是错过了那个。

    【讨论】:

      猜你喜欢
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多