首页 > 解决方案 > Traefik 和我在容器中的 Web 应用程序

问题描述

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

我有一个 Web 应用程序,它封装在我管理的 docker 映像中。它启动一个在端口 9000 上侦听的服务器。它确实有一个端点发布指标,在/admin/metrics. 该应用程序部署在需要我在端口 9100 上发布这些指标的系统上,路径为/metrics. 我可以更改应用程序、运行第二台服务器等,但为了好玩,我尝试了一些更快的方法(我想):运行一个配套的反向代理。

我选择了 traefik,并设法使用文件提供程序正确配置它:在我的机器(无容器)上运行时,它确实将/metrics端口 9100 上的调用正确重定向到我的应用程序的/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"
#/app/metrics.toml
[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://0.0.0.0:9000"
  [http.middlewares]
    [http.middlewares.PathConvert]
      [http.middlewares.PathConvert.addPrefix]
        prefix = "/admin"

请注意,我尝试0.0.0.0127.0.0.1or替换localhost,但都不起作用。

最后,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”的东西,但不明白是什么。

有人有想法吗?

标签: dockertraefik

解决方案


不知道为什么它会以这种方式工作,但我成功地为 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"

推荐阅读