使用Traefik和Docker Compose在同一主机上提供两个服务,但路由不同

使用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)访问 但问题是:到目前为止我所做的一切都不

我有两个前端应用程序,都由Nginx在端口80中提供

  • 应用程序登录
  • 应用程序联系人
  • 我正在尝试使用Docker Compose配置Traefik以实现以下目标:

    • 两个应用程序都在同一台主机上提供(例如abc.com或localhost:4000)
    • 应用程序登录
      将从localhost:4000/login(或abc.com/login)访问
    • app contacts
      将从localhost:4000/contacts(或abc.com/contacts)访问
    但问题是:到目前为止我所做的一切都不起作用

    下面是2个应用程序的2个
    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

    编辑:

    标签中有几个语法错误

    • ==而不是最后一行中的=
    • 路径应该用引号引起来``
    如果您检查Traefik仪表板(http://localhost:8080/),您可以看到路由器状态和配置错误。

    在您当前的配置中,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`)"