首页 > 解决方案 > 使用 traefik 时如何映射 docker 容器内的特定端口?

问题描述

这是我的docker-compose.yml

version: '3'
services:
  website:
    build: ./website
    expose: [3000]
    labels:
      - "traefik.frontend.rule=Host:localhost"
  blog:
    build: ./blog
    expose: [4000]
    labels:
      - "traefik.frontend.rule=Host:localhost;PathPrefix:/blog"
  docs:
    build: ./docs
    expose: [3000]
    labels:
      - "traefik.frontend.rule=Host:localhost;PathPrefix:/docs"
  proxy:
    image: traefik
    command: --api.insecure=true --providers.docker
    networks:
      - webgateway
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

networks:
  webgateway:
    driver: bridge

我想要的是通过不同的路由访问三个不同的 node.js 网站。但这三个 node.js 网站实际上暴露了不同的端口。现在我的 treafik 正在运行。我可以通过localhost:8080Butlocalhost localhost/bloglocalhost/docsare all进行配置404 page not found

PS:我不确定端口是否是我应该调查的问题,因为将一个 node.js 服务更改为port 80并不能解决难题。我在 traefik 仪表板上看到规则是Host( blog-dev)

标签: dockerreverse-proxytraefik

解决方案


PathPrefix:/blog

当您将此作为路由规则时,traefix 在发送到容器时不会自动删除前缀。

因此,除非您的容器内有路线,否则您/blog将获得 404。

所以你通常做的也是添加一个中间件来剥离这个 -> https://docs.traefik.io/middlewares/stripprefix/

此外,您似乎没有根据您的服务设置规则。

以您的第一次服务为例blog

尝试->

labels:
    - "traefik.http.routers.blog.rule=Host(`localhost`) && PathPrefix(`/blog`)"
    - "traefik.http.routers.blog.middlewares=strip-blog"
    - "traefik.http.middlewares.strip-blog.stripprefix.prefixes=/blog"

然后对你的其他路线做同样的事情,不要忘记routers.blogrouters.docs等替换。


推荐阅读