docker - 使用 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:8080
Butlocalhost
localhost/blog
和localhost/docs
are all进行配置404 page not found
PS:我不确定端口是否是我应该调查的问题,因为将一个 node.js 服务更改为port 80
并不能解决难题。我在 traefik 仪表板上看到规则是Host( 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.blog
用routers.docs
等替换。
推荐阅读
- javascript - React 前端 + Express.js 会话
- reactjs - 仅在单击时使用参数调用函数的正确方法是什么?
- mysql - MySQL:使用 LOAD DATA 时压缩一列中的数据
- javascript - Jquery 选择下一个嵌套嵌套的嵌套输入
- python - 如何提高图像质量?
- java - Spring Boot JPA如何在用户和权限表之间实现外键?
- vb.net - 显示时如何保持相同的字体样式?
- winium - 如何在桌面应用程序的 Chrome 旧窗口中定位自动化 ID(winium 自动化)
- c++ - MATLAB 的 rng(seed, 'twister') 函数的等效 C++ 实现
- css - ReactJS 在页面调整大小时更改图像/徽标