【问题标题】:Why am I unable to route to my API backend with Traefik为什么我无法使用 Traefik 路由到我的 API 后端
【发布时间】:2021-02-05 22:15:12
【问题描述】:

我有两个容器前端 (nginx:80) 和后端 (nodejs:3000)。 我正在尝试将所有路径重定向到我的前端:localhost/* 到我的前端 除了我的后端 API 的一条路径:localhost/v1/* 到我的后端

我只允许与我的后端通信来保护我的数据库容器 (mongodb)

这是我的 docker-compose.yml(我只用这个)

version: '3'

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

  frontend:
    image: registry.gitlab.com/test/frontend
    container_name: frontend
    build:
      context: ../frontend/.
    labels:
      - traefik.enable=true
      - traefik.http.routers.frontend.rule=PathPrefix(`/`)
      - traefik.http.routers.frontend.entrypoints=web    
    networks:
      - traefik-network

  backend:
    image: registry.gitlab.com/test/backend
    container_name: backend
    build:
      context: ../backend/.
    labels:
      - traefik.enable=true
      - traefik.http.routers.backend.rule=PathPrefix(`/v1`)
      - traefik.http.routers.backend.service=backend
      - traefik.http.routers.backend.entrypoints=web
      - traefik.http.services.backend.loadbalancer.server.port=3000
    command: yarn start
    environment:
      - MONGODB_URL=mongodb://mongodb:27017/backend
    depends_on:
      - mongodb
    volumes:
      - ../backend/.:/usr/src/backend
    networks:
      - traefik-network
      - backend-network

  mongodb:
    image: mongo:4.2.1-bionic
    container_name: mongodb
    ports:
      - 27017:27017
    volumes:
      - dbdata:/data/db
    networks:
      - backend-network

volumes:
  dbdata:

networks:
  backend-network:
  traefik-network:

问题是……

如果前端(后端和traefik也是)打开

  • 到 localhost/* 的路径工作(这是我想要的),
  • 但是到 localhost/v1/* 的路径不起作用(这里有问题!)。

如果前端关闭但traefik和后端打开

  • 到 localhost/* 的路径不起作用(当然,没错),
  • 但是到 localhost/v1/* 的路径可以工作(当然,这是我想要的)。

我尝试了很多解决方案,但似乎都没有按照我想要的方式工作。 我误会了什么?

感谢您的帮助, 祝你有美好的一天

【问题讨论】:

    标签: docker traefik


    【解决方案1】:

    尝试在后端服务中添加以下标签

    - "traefik.http.routers.backend.rule=Host(`servicex.me`) && Path(`/v1`)"
    

    和前端

    - traefik.http.routers.frontend.rule=Host(`servicex.me`)
    

    您还需要将此行添加到您的/etc/hosts

    127.0.0.1 servicex.me
    

    并确保您停止并启动服务

    完整示例

    version: '3'
    
    services:
      traefik:
        image: traefik:v2.3
        container_name: traefik
        command:
          - --api.insecure=true
          - --providers.docker=true
          - --providers.docker.exposedbydefault=false
          - --entrypoints.web.address=:80
        ports:
          - "8080:8080"
          - "443:443"
          - "80:80"
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock:ro
    
      frontend:
        image: registry.gitlab.com/test/frontend
        container_name: frontend
        build:
          context: ../frontend/.
        labels:
          - traefik.enable=true
          - traefik.http.routers.frontend.rule=Host(`servicex.me`)
          - traefik.http.routers.frontend.entrypoints=web
          - traefik.http.routers.frontend.service=frontend
          - traefik.http.services.frontend.loadbalancer.server.port=80
        networks:
          - traefik-network
    
      backend:
        image: registry.gitlab.com/test/backend
        container_name: backend
        build:
          context: ../backend/.
        labels:
          - traefik.enable=true
          - "traefik.http.routers.backend.rule=Host(`servicex.me`) && Path(`/v1`)"
          - traefik.http.routers.backend.service=backend
          - traefik.http.routers.backend.entrypoints=web
          - traefik.http.services.backend.loadbalancer.server.port=3000
        command: yarn start
        environment:
          - MONGODB_URL=mongodb://mongodb:27017/backend
        depends_on:
          - mongodb
        volumes:
          - ../backend/.:/usr/src/backend
        networks:
          - traefik-network
          - backend-network
    
      mongodb:
        image: mongo:4.2.1-bionic
        container_name: mongodb
        ports:
          - 27017:27017
        volumes:
          - dbdata:/data/db
        networks:
          - backend-network
    
    volumes:
      dbdata:
    
    networks:
      backend-network:
      traefik-network:
    

    顺便说一句,为什么你需要traefik和nginx(两者都在做同样的工作),如果你能用另一个替换一个会更好。

    【讨论】:

    • 感谢您的帮助!它不起作用,localhost/v1 将我发送到前端。 Nginx 仅用于为我的 Angular 应用程序提供服务。我不想在与我的应用程序相同的容器中混合反向代理。我错了吗?
    • 可以分享一下traefik(创建规则的那个)管理界面的截图吗?
    • i.ibb.co/rxhh84H/test.png这是你需要的吗?
    • 是的,也就是说,从它配置的屏幕截图来看,它似乎不错。也许您可以使用 localhost 以外的其他域。我更新了此更改的答案
    • 还有一点需要注意,在这一行加上双引号很重要——"traefik.http.routers.backend.rule=Host(servicex.me) && Path(/v1)"
    【解决方案2】:

    我将此标签添加到我的容器中

    traefik.docker.network=traefik-network

    现在可以正常使用了

    【讨论】:

      猜你喜欢
      • 2019-09-29
      • 2019-04-19
      • 2019-10-13
      • 2020-11-01
      • 1970-01-01
      • 2013-11-26
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多