使用Traefik和Docker Compose在同一主机上提供两个服务,但路由不同
我有两个前端应用程序,都由Nginx在端口80中提供使用Traefik和Docker Compose在同一主机上提供两个服务,但路由不同,docker,nginx,docker-compose,dockerfile,traefik,Docker,Nginx,Docker Compose,Dockerfile,Traefik,我有两个前端应用程序,都由Nginx在端口80中提供 应用程序登录 应用程序联系人 我正在尝试使用Docker Compose配置Traefik以实现以下目标: 两个应用程序都在同一台主机上提供(例如abc.com或localhost:4000) 应用程序登录将从localhost:4000/login(或abc.com/login)访问 app contacts将从localhost:4000/contacts(或abc.com/contacts)访问 但问题是:到目前为止我所做的一切都不
应用程序登录
应用程序联系人
- 两个应用程序都在同一台主机上提供(例如abc.com或localhost:4000)
将从localhost:4000/login(或abc.com/login)访问应用程序登录
将从localhost:4000/contacts(或abc.com/contacts)访问app contacts
Dockerfile
,以及dockercompose.yml
app登录
Dockerfile:
#构建阶段
来自节点:lts作为构建阶段
WORKDIR/app
复制包*.json/
运行npm安装
复制
运行npm运行构建
#生产阶段
来自nginx:稳定的阿尔卑斯山作为生产阶段
复制--from=buildstage/app/dist/usr/share/nginx/html
暴露80
CMD[“nginx”,“-g”,“守护进程关闭;”]
appcontacts
Dockerfile:(有点复杂,但它与登录app类似)
###第一阶段:构建AngularJS应用程序###
来自节点:lts作为构建阶段
运行apk——无缓存添加git
WORKDIR/app
复制package.json/app/
运行npm安装
复制
#生产模式构建
运行npm运行构建:prod
###阶段2:添加Nginx以托管AngularJS应用程序###
来自nginx:稳定的阿尔卑斯山作为生产阶段
#删除默认的nginx html文件
运行rm-rf/usr/share/nginx/html/*
#复制包
复制--from=buildstage/app/dist/usr/share/nginx/html
#复制默认nginx.conf
COPY--from=buildstage/app/nginx.conf/etc/nginx/conf.d/default.conf
卷[“/usr/share/nginx/html/env”]
暴露80
#将.env文件和shell脚本复制到容器
WORKDIR/usr/share/nginx/html
复制./scripts/generate_env.sh。
抄送.env。
#添加bash
运行apk add--无缓存bash
#使shell脚本可执行
运行chmod+x generate_env.sh
#启动Nginx服务器
CMD[“/bin/bash”、“-c”、“/usr/share/nginx/html/generate\u env.sh&&nginx-g\”守护进程关闭;\”“]
docker compose.yml
不知道我哪里做错了
我搜索了谷歌,在某处我看到人们正在使用这个堆栈,但我也不知道如何配置它
谢谢。默认情况下,Traefik侦听端口80。您必须将“81:81”替换为“81:80”。在web浏览器中,您必须使用端口81,它将在Traefik容器中映射到80 编辑:
标签中有几个语法错误
- ==而不是最后一行中的=
- 路径应该用引号引起来``
在您当前的配置中,NGINX应该在path/login和/contacts上接受请求,而不是默认的/。您可以使用下面的标签,如果您想在转发到NGINX之前删除路径部分(登录或联系人),那么这两条附加行非常有用,这样您就可以在默认情况下使用NGINX侦听了/
app-login:
image: app-login
labels:
- "traefik.http.routers.app-login.rule=PathPrefix(`/login`)"
- "traefik.http.routers.app-login.middlewares=app-login-stripprefix"
- "traefik.http.middlewares.app-login-stripprefix.stripprefix.prefixes=/login"
app-contacts:
image: app-contacts
labels:
- "traefik.http.routers.app-contacts.rule=PathPrefix(`/contacts`)"
- "traefik.http.routers.app-contacts.middlewares=app-contacts-stripprefix"
- "traefik.http.middlewares.app-contacts-stripprefix.stripprefix.prefixes=/contacts"
我发现了问题
基于此链接
倒勾还是引号?
要设置规则的值,请使用backticks`或转义双引号\'。
不接受单引号,因为值是Golang的字符串文字。
所以规则必须是
"traefik.http.routers.app-contacts.rule==Path(`/contacts`)"
“traefik.http.routers.app contacts.rule==Path(`/contacts`)”我将
81:81
更新为80:80
,但它仍然不起作用。我可以docker compose up-d
,但在那之后,当我试图转到localhost/login或localhost/contacts时,它说404页面未找到
。顺便说一句,如果我有这个-”traefik.http.routers.esn frontend login.rule=Path(/login)“
,我必须在浏览器中键入什么路由才能打开页面?
"traefik.http.routers.app-contacts.rule==Path(`/contacts`)"