docker - 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.0
用127.0.0.1
or替换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”的东西,但不明白是什么。
有人有想法吗?
解决方案
不知道为什么它会以这种方式工作,但我成功地为 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"
推荐阅读
- c - 如何在 X86 和 X64 上的 MinGW 中编译?
- c# - 无法获取 Session 值的源页面
- c - sscanf 处理最大无符号整数值的方式与赋值不同
- greedy - 最大化 arr[i]*i 的总和
- jmeter - Jmeter-从文件夹中读取所有文件并根据文件类型执行验证
- c++ - 模板容器的析构函数
- java - 使用 Java ServerSocket 发送数据包
- google-apps-script - 获取在 Google 电子表格中有注释的单元格的行和列值
- amazon-web-services - 如何通过 API Gateway、AWS Lambda 和 ElastiCache 设置提高安全性
- haproxy - 使轮换代理同时使用 HTTP 和 HTTPS