使用Docker轻松运行Prometheus并在容器中监控运行的服务
关于在Docker上运行Prometheus以进行简单的操作确认的方法备忘录。
由于已经有很多类似的信息,所以请参考那些详细的资料。
本次我們嘗試的環境是Prometheus v2.2.1。
创建prometheus.yml文件
首先,创建Prometheus服务器监视配置。
在主机操作系统上创建以下文件。
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'node'
static_configs:
- targets:
- '172.19.0.8:9100'
这是一项最小必要设置。
以上是一个配置,它通过172.19.0.8的9100端口从exporter定期以15秒的间隔进行轮询并收集数据。
job_name可以是任意字符串,但重要的是targets的配置。请注意,如果来自Prometheus服务器的连接目标exporter的IP:端口信息不正确,则无法监视。
job_name将用作后面的PromQL筛选条件,作为一个标签信息的处理。
启动 Prometheus Server
使用 Prometheus 的官方 Docker 镜像来启动 Prometheus 服务器。
为了展示由刚刚创建的主机端目录挂载的 prometheus.yml 数据来记录 Prometheus 的监控配置,需要进行卷配置。
$ docker run -p 9090:9090 -v /home/prometheus-data:/prometheus-data prom/prometheus --config.file=/prometheus-data/prometheus.yml
只要这样就可以启动了。
启动Node Exporter。
我会在 prometheus.yml 中指定的 node exporter 目标上运行 node exporter。
我们这次从这个页面获取了已编译好的二进制文件并执行。
$ wget https://github.com/prometheus/node_exporter/releases/download/v0.16.0-rc.1/node_exporter-0.16.0-rc.1.linux-amd64.tar.gz
$ tar xvzf node_exporter-0.16.0-rc.1.linux-amd64.tar.gz
$ cd node_exporter-0.16.0-rc.1.linux-amd64
$ ./node_exporter
暂时使用默认设置启动。
在仪表盘上查看情况。
我将在仪表板上确认结果。
访问http://Docker主机的IP:9090。
如果您从“图形”菜单中选择您想查看的信息并进行输出,那就可以了。此示例中输出了从节点导出器中收集的平均负载1分钟的值。

使用cAdvisor进行容器监控
接下来,我们将尝试引入cAdvisor来监视Docker容器。
据我所知,并没有官方提供的适用于容器的出口程序,只能使用第三方产品。
虽然有一个名为container-exporter的选项,但它已经在cAdvisor中被弃用,所以使用cAdvisor似乎更好。
启动运行cAdvisor的容器
docker run -v /:/rootfs:ro -v /var/run:/var/run:rw -v /sys:/sys:ro -v /var/lib/docker/:/var/lib/docker:ro -v /dev/disk/:/dev/disk:ro -p 8080:8080 -d --name=cadvisor google/cadvisor:latest
启动此容器后,您将能够通过/var/run/docker.sock从容器中收集主机的docker信息。
修改prometheus.yml文件
我們將在最初所建立的prometheus.yml文件中定義從上述cAdvisor運行的端口中獲取信息。
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'node'
static_configs:
- targets:
- '172.19.0.8:9100'
## 以下を追記 ##
- job_name: 'docker-container'
static_configs:
- targets:
- '172.19.0.10:8080'
运行cAdvisor的172.19.0.10:8080进行信息抓取。
当您查看屏幕时,会自动收集在主机上运行的各个容器的统计信息,如下所示。

只选择PromQL中所需的信息。
经过尝试到现在,已经收集了很多信息。
现在需要好好筛选出「想查看的信息」和「想了解的信息」。
Prometheus提供了一种通过PromQL查询执行来过滤监控结果数据的功能。
只显示特定容器的信息
如果您只想获取先前容器监视结果中特定容器的信息,请使用以下查询方式。
container_cpu_user_seconds_total{name='zabbix-server_1'}
这是一个例子,从容器的总CPU用户时间中提取只包含容器名为zabbix-server_1的信息。
针对从特定图像启动的容器信息进行函数处理并显示。
如果在Docker容器中进行运营,我认为经常会有基于相同镜像的容器进行多次扩展并运行的情况。例如,在这种情况下,不需要逐个查看容器的信息,可以很容易地通过整体规模来了解情况。
sum(container_cpu_user_seconds_total{image='nginx'}) # nginxイメージから稼働しているコンテナのCPUユーザ時間の合計
avg(container_cpu_user_seconds_total{image='nginx'}) # nginxイメージから稼働しているコンテナのCPUユーザ時間の平均
还有其他各种可供使用的函数。
总结
最近的趨勢是盡可能地集結可獲取的信息,並從這些集合的數據中輕鬆地提取出有用的信息。我認為Prometheus的exporter和PromQL的想法非常有趣,應用範圍非常廣泛。