docker - 使用traefik时如何映射docker容器内的特定端口?

标签 docker reverse-proxy traefik

这是我的 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:8080 进行配置但是localhost localhost/bloglocalhost/docs都是404 page not found
附注 :我不确定端口是否是我应该调查的问题,因为将一个 node.js 服务更改为 port 80不解决难题。我在 traefik 仪表板上看到规则是 主机( blog-dev )

最佳答案

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等等..

关于docker - 使用traefik时如何映射docker容器内的特定端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59054551/

相关文章:

nginx - Airflow + Nginx 设置给 Airflow 404 = 很多圈子

security - 在同一个 kubernetes 集群上安装两个 traefik ingress controller

docker - 是否可以集成SonarQube,Jenkins和GitLab(全部在docker中)?

ubuntu - SSH 服务器不接受连接

docker - Netflix | Spring Cloud Eureka部署在ECS上时未注册

traefik - 使用 Traefik 的 VueJS 路由器历史记录模式

kubernetes - 通过负载均衡器 ip 从 kubernetes pod 发送请求

docker - 在 Windows Docker 容器中附加到 PATH

caching - Varnish和ESI,性能如何?

ruby-on-rails - 反向代理 NGINX 的认证/访问控制模块