Docker 容器中的Traefik和我的web应用

Docker 容器中的Traefik和我的web应用,docker,traefik,Docker,Traefik,我正在尝试做一些我认为很简单的事情,但看起来我错过了一件事 我有一个web应用程序,它是我管理的docker映像包。它在端口9000上启动侦听服务器。它在/admin/metrics上有一个端点发布度量。 应用程序部署在需要我在端口9100上发布这些度量的系统上,路径为/metrics。我可以更改应用程序、运行第二台服务器等,但为了好玩,我尝试了一些更快的方法(我想): 运行伴随的反向代理 我选择了traefik,并设法使用文件提供程序对其进行了正确配置:在我的机器上运行时(无容器),它会正确地

我正在尝试做一些我认为很简单的事情,但看起来我错过了一件事

我有一个web应用程序,它是我管理的docker映像包。它在端口9000上启动侦听服务器。它在
/admin/metrics
上有一个端点发布度量。 应用程序部署在需要我在端口9100上发布这些度量的系统上,路径为
/metrics
。我可以更改应用程序、运行第二台服务器等,但为了好玩,我尝试了一些更快的方法(我想): 运行伴随的反向代理

我选择了traefik,并设法使用文件提供程序对其进行了正确配置:在我的机器上运行时(无容器),它会正确地将调用从端口9100上的
/metrics
重定向到我的应用程序的
/admin/metrics
。但是当在容器中时,它只给出404个错误,尽管配置是正常的。我还尝试只运行应用程序,让traefik在我的机器上路由到容器中的应用程序,但也失败了

这是我的配置:

#/app/traefik.toml
[entryPoints]
  [entryPoints.MetricsProxy]
    address = ":9100"

[providers]
  providersThrottleDuration = 42
  [providers.file]
    directory = "/app"
    watch = false

[api]
  insecure = false
  dashboard = false
  debug = false

[log]
  level = "TRACE"
请注意,我试图用
127.0.0.1
localhost
替换
0.0.0
,两者都不起作用

最后,
Dockerfile

FROM openjdk:8-jre-slim

WORKDIR /app

RUN \
  apt-get update -qq && apt-get install -y -qq curl && \
  curl -sSL https://github.com/containous/traefik/releases/download/v2.0.4/traefik_v2.0.4_linux_amd64.tar.gz | tar -xz

COPY bin/myapp.sh .
COPY target/universal/bluevalet-server.zip .
COPY deploy/traefik/traefik.toml .
COPY deploy/traefik/metrics.toml .
COPY deploy/nginx.conf .
COPY deploy/run.sh .

#run.sh ~~> ./traefik --configfile /app/traefik.toml & ./myapp.sh
CMD [ "/app/run.sh" ]
EXPOSE 9000
EXPOSE 9100
我猜服务定义中有“localhost”的内容,但无法理解是什么


有人有想法吗?

不知道为什么它会这样工作,但我成功地为traefik使用了另一种配置:

[http]
  [http.routers]
    [http.routers.Router0]
      entryPoints = ["MetricsProxy"]
      middlewares = ["PathConvert"]
      service = "MetricsService"
      rule = "Path(`/metrics`)"
  [http.services]
    [http.services.MetricsService]
      [http.services.MetricsService.loadbalancer]
        [[http.services.MetricsService.loadBalancer.servers]]
          url = "http://localhost:9000/"
  [http.middlewares]
    [http.middlewares.PathConvert]
      [http.middlewares.PathConvert.replacePathRegex]
        regex = "^/metrics"
        replacement = "/admin/metrics/prometheus"

它似乎将我重定向到,而不是。在toml文件中配置服务时,您是否尝试将端口声明作为单独的指令分开?通常情况下,这是单独完成的,因此我提出了建议,但您也说过它在本地对您有效,所以我不太相信这会有所帮助。我接下来的步骤是启用Traefik仪表板,并进行调试以验证日志。
[http]
  [http.routers]
    [http.routers.Router0]
      entryPoints = ["MetricsProxy"]
      middlewares = ["PathConvert"]
      service = "MetricsService"
      rule = "Path(`/metrics`)"
  [http.services]
    [http.services.MetricsService]
      [http.services.MetricsService.loadbalancer]
        [[http.services.MetricsService.loadBalancer.servers]]
          url = "http://localhost:9000/"
  [http.middlewares]
    [http.middlewares.PathConvert]
      [http.middlewares.PathConvert.replacePathRegex]
        regex = "^/metrics"
        replacement = "/admin/metrics/prometheus"