使用 docker-compose 进行 Prometheus 服务发现

2023-12-13

我有以下 docker-compose 文件:

version: '3.4'

services:
    serviceA:
        image: <image>
        command: <command>
        labels:
           servicename: "service-A"
        ports:
         - "8080:8080"

    serviceB:
        image: <image>
        command: <command>
        labels:
           servicename: "service-B"
        ports:
         - "8081:8081"

    prometheus:
        image: prom/prometheus:v2.32.1
        container_name: prometheus
        volumes:
          - ./prometheus:/etc/prometheus
          - prometheus_data:/prometheus
        command:
          - '--config.file=/etc/prometheus/prometheus.yml'
          - '--storage.tsdb.path=/prometheus'
          - '--web.console.libraries=/etc/prometheus/console_libraries'
          - '--web.console.templates=/etc/prometheus/consoles'
          - '--storage.tsdb.retention.time=200h'
          - '--web.enable-lifecycle'
        restart: unless-stopped
        expose:
          - 9090

        labels:
          org.label-schema.group: "monitoring"

volumes:
    prometheus_data: {}

docker-compose 还包含具有以下配置的 Prometheus 实例:

global:
  scrape_interval:     15s # By default, scrape targets every 15 seconds.


scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 5s
    static_configs:
      - targets: ['localhost:9090', 'serviceA:8080', 'serviceB:8081']

ServiceS 和 Service 公开 prometheus 指标(每个指标都在其自己的端口上)。

当有one每个服务的实例一切正常,但是当我想要扩展服务并运行多个实例时,普罗米修斯指标收集开始弄乱指标收集,并且数据已损坏。

我为此问题寻找了 docker-compose 服务发现,但没有找到合适的。我该如何解决这个问题?


这个问题的解决方案是使用实际的服务发现而不是静态目标。这样,Prometheus 将在每次迭代期间抓取每个副本。

如果只是 docker-compose(我的意思不是 Swarm),您可以使用 DNS 服务发现(dns_sd_配置) 获取属于某个服务的所有 IP:

# docker-compose.yml
version: "3"
services:
  prometheus:
    image: prom/prometheus

  test-service:  # <- this
    image: nginx
    deploy:
      replicas: 3
---
# prometheus.yml
scrape_configs:
  - job_name: test
    dns_sd_configs:
      - names:
          - test-service  # goes here
        type: A
        port: 80

这是启动和运行最简单的方法。

接下来,您可以使用专用的 Docker 服务发现:docker_sd_配置。除了目标列表之外,它还为您提供更多标签数据(例如容器名称、镜像版本等),但它还需要连接到 Docker 守护进程才能获取这些数据。在我看来,这对于开发环境来说是一种矫枉过正,但在生产中可能是必不可少的。这是一个示例配置,大胆复制粘贴自https://github.com/prometheus/prometheus/blob/release-2.33/documentation/examples/prometheus-docker.yml :

# A example scrape configuration for running Prometheus with Docker.

scrape_configs:
  # Make Prometheus scrape itself for metrics.
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

  # Create a job for Docker daemon.
  #
  # This example requires Docker daemon to be configured to expose
  # Prometheus metrics, as documented here:
  # https://docs.docker.com/config/daemon/prometheus/
  - job_name: "docker"
    static_configs:
      - targets: ["localhost:9323"]

  # Create a job for Docker Swarm containers.
  #
  # This example works with cadvisor running using:
  # docker run --detach --name cadvisor -l prometheus-job=cadvisor
  #     --mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock,ro
  #     --mount type=bind,src=/,dst=/rootfs,ro
  #     --mount type=bind,src=/var/run,dst=/var/run
  #     --mount type=bind,src=/sys,dst=/sys,ro
  #     --mount type=bind,src=/var/lib/docker,dst=/var/lib/docker,ro
  #     google/cadvisor -docker_only
  - job_name: "docker-containers"
    docker_sd_configs:
      - host: unix:///var/run/docker.sock # You can also use http/https to connect to the Docker daemon.
    relabel_configs:
      # Only keep containers that have a `prometheus-job` label.
      - source_labels: [__meta_docker_container_label_prometheus_job]
        regex: .+
        action: keep
      # Use the task labels that are prefixed by `prometheus-`.
      - regex: __meta_docker_container_label_prometheus_(.+)
        action: labelmap
        replacement: $1

最后,有dockerswarm_sd_config显然,它是与 Docker Swarm 一起使用的。这是三者中最复杂的,因此,有全面的官方设置指南。像docker_sd_config它在标签中包含有关容器的附加信息,甚至更多(例如,它可以告诉容器在哪个节点上)。此处提供了示例配置:https://github.com/prometheus/prometheus/blob/release-2.33/documentation/examples/prometheus-dockerswarm.yml,但您应该真正阅读文档才能理解它并自行调整。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 docker-compose 进行 Prometheus 服务发现 的相关文章

  • 如何构建一个不链接到 musl libc 的 go 可执行文件

    So 官方的 Go 构建容器基于 Alpine 高山用途musl https www musl libc org 作为 libc 而不是 glibc 我需要在容器中构建一个可以在使用 glibc 的 Ubuntu 上运行的 Go 可执行文件
  • 在 Windows 上构建 Docker 映像:入口点脚本“没有这样的文件或目录”

    我在这上面浪费了两天时间 直到我终于解决了我的问题 所以我想我会分享 我将概述我在这里遇到的问题 然后概述答案中的解决方案 My Dockerfile看起来像这样 FROM php 7 2 fpm COPY custom docker ph
  • Docker Python 脚本找不到文件

    我已经成功构建了一个 Docker 容器 并将应用程序的文件复制到 Dockerfile 中的容器中 但是 我正在尝试执行引用输入文件 在 Docker 构建期间复制到容器中 的 Python 脚本 我似乎无法弄清楚为什么我的脚本告诉我它无
  • 重启docker Windows 10命令行

    我试图弄清楚如何在命令行中重新启动 docker 以便我可以制作一个 bat 脚本来重新启动它并启动一些容器 我使用管理员访问权限创建了一个 dos 提示符并运行以下命令 PS C Windows system32 gt net stop
  • 用于检查 URL 状态的 PowerShell 脚本

    与此问题类似 https stackoverflow com questions 18500832 script to check the status of a url我正在尝试监视一组网站链接是否已启动并运行或没有响应 我在 Inter
  • docker中的GitLab CI docker无法创建卷

    我在 docker 中使用 docker 来托管我的容器 因为它们通过管道工作 我根据代码创建的容器设置为具有一个卷 用于将 gcloud 密钥传递到容器 这在我的本地计算机上完美运行 但在 gitlab runner 上它无法正确链接 从
  • 如何从 Dockerfile 安装 Python 3.7 和 Pip

    我正在尝试构建基于 Ubuntu 18 04 的自定义 Docker 映像 Ubuntu 预装了 Python 3 6 但我想 1 安装 Python 3 7 2 将其设置为默认 Python 版本 这样就可以使用python代替pytho
  • 无法使用基于日志的指标显示数据(指标类型:“计数器”)

    我正在努力创建一个带有 stackdriver 监控和基于日志的指标的图表 我的指标是一个计数器 默认情况下没有单位 日志可用于我的基于日志的指标 但是当我使用我的指标创建图表时 它说no data is available for the
  • 使用入口点脚本初始化 influxdb2 存储桶

    我正在部署用于存储实时数据的 influxdb 我已经使用 1 8 4 一段时间了 最 近决定更新到 v2 My docker compose yml文件看起来像这样 influxdb image influxdb 2 0 4 alpine
  • 网络插件未准备好:cni 配置未初始化

    Kubelet未就绪 runtime network not ready NetworkReady false reason NetworkPluginNotReady message docker network plugin is no
  • 在 Dockerfile 中切换到 root 用户

    我运行了这个命令 docker pull mcr microsoft com mssql server 2019 latest 然后我创建了一个 dockerfile 来使用此容器映像作为另一个容器的基础映像 escape FROM mcr
  • Docker 容器可以访问 DNS,但无法解析主机

    我在运行 docker 容器时遇到一个有趣的问题 突然间 我无法从容器内解析 DNS 这是一个概要 一切都没有解决 apt get pip 一次性 ping 容器等正在运行docker run it dns 8 8 8 8 ubuntu p
  • 使用 mariaDB 将 sql 转储文件安装到 docker 容器

    我刚刚学习 docker 的基础知识 但一直停留在从本地系统导入 SQl 文件上 我使用的是 Windows 10 并允许我的 docker 容器访问我的共享驱动器 我有一个位于 D 上的 SQL 文件 我想导入到从 docker hub
  • docker compose run 命令中 env 变量的用法

    运行命令docker compose run e TYPE result mongo db backup应该给我给定 TYPE 变量的值 mongo db backup image mongo 3 4 volumes backup back
  • 如何在docker compose中为每个容器创建单独的卷

    我创建了一个docker我想为其运行多个容器的图像 这个 docker 镜像依赖于一些东西 这些东西对于所有容器来说都是相同的 但唯一的区别是容器的配置 version 2 4 services s1 image testdockerimg
  • 为什么 Docker ADD 命令不复制这个文件?

    在下面的文件中 该文件apprequirements txt被添加到容器中 我知道因为pip install作品 但是 那myworker py文件未被复制 添加 Why FROM python 2 7 ENV PYTHONUNBUFFER
  • Prometheus指标删除后不会消失

    我需要删除源自一台主机的一些 Prometheus 指标 为简单起见 我们假设需要删除主机中的所有指标 执行 POST 到delete series两个虚拟机上的端点 正如预期的那样 得到了 204 指标并没有消失 即使在通过强制缓存刷新之
  • 如何将 ARG 值传递给 ENTRYPOINT?

    Docker 1 9 允许将参数传递给 dockerfile 参见链接 https docs docker com engine reference builder arg https docs docker com engine refe
  • 如何确定性地构建 Docker 镜像?

    我正在尝试构建 Docker 映像 并且希望我的 Docker 映像具有确定性 令我惊讶的是 我发现即使是一个简单的 Dockerfile 例如 FROM scratch ENV a b 重复使用时生成不同的 IDdocker build
  • AWS Lambda Sam找不到docker

    我正在尝试使用以下命令测试我的 hello world lambda 函数aws sam cli在我的项目根文件夹中使用以下命令 sam local start api debug 这在控制台中给出了以下输出 2018 07 11 16 1

随机推荐