Zabbix主动模式监控Docker状态+自动发现
Zabbix Docker 容器自动发现与资源监控完整方案
本文介绍如何基于 Zabbix 5.0+ 通过自定义脚本实现 Docker 容器自动发现,采集容器状态、CPU 和内存使用率,并自动生成监控图形和告警规则。
一、Docker 容器自动发现脚本 (docker_lld.sh)
#!/bin/bash
containers=$(docker ps --format '{{.Names}}')
echo -n '{"data":['
first=1
for name in $containers; do
if [ $first -eq 0 ]; then echo -n ","; fi
echo -n "{\"{#CONTAINER}\":\"$name\"}"
first=0
done
echo "]}"
此脚本输出符合 Zabbix LLD JSON 格式,用于自动发现当前所有运行的容器名称。
二、内存单位转换脚本 (docker_mem.sh)
#!/bin/bash
container_name="$1"
mem=$(docker stats --no-stream --format "{{.MemUsage}}" "$container_name" 2>/dev/null)
val=$(echo "$mem" | awk -F '[ /]+' '{print $1}')
unit=$(echo "$val" | sed 's/[0-9.]//g')
num=$(echo "$val" | sed 's/[^0-9.]//g')
if [ "$unit" = "KiB" ]; then
printf "%.0f\n" "$(awk "BEGIN {print $num*1024}")"
elif [ "$unit" = "MiB" ]; then
printf "%.0f\n" "$(awk "BEGIN {print $num*1024*1024}")"
elif [ "$unit" = "GiB" ]; then
printf "%.0f\n" "$(awk "BEGIN {print $num*1024*1024*1024}")"
else
echo 0
fi
此脚本将 docker stats 输出的内存使用单位转换为字节数,方便 Zabbix 采集和图形化处理。
三、Zabbix Agent 配置示例 (userparameters.conf)
UserParameter=docker.discovery,/etc/zabbix/zabbix_agentd.d/docker_lld.sh
UserParameter=docker.status[*],docker inspect -f '{{.State.Status}}' "$1" 2>/dev/null || echo "not_found"
UserParameter=docker.health[*],docker inspect -f '{{if .State.Health}}{{.State.Health.Status}}{{else}}no_health_check{{end}}' "$1" 2>/dev/null || echo "not_found"
UserParameter=docker.cpu[*],docker stats --no-stream --format "{{.Name}} {{.CPUPerc}}" "$1" | awk '{gsub(/%/, "", $2); print $2}'
UserParameter=docker.mem[*],/etc/zabbix/zabbix_agentd.d/docker_mem.sh $1
UserParameter=docker.mem_pct[*],docker stats --no-stream --format "{{.Name}} {{.MemPerc}}" "$1" | awk '{gsub(/%/, "", $2); print $2}'
将脚本路径根据实际情况调整,并确保 agent 进程有权限执行 docker 命令。
四、完整 Zabbix 模板 XML 自动发现规则示例
<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>
<version>5.0</version>
<date>2025-06-20T07:47:58Z</date>
<groups>
<group>
<name>Linux-OS</name>
</group>
</groups>
<templates>
<template>
<template>Linux-docker</template>
<name>Linux-docker</name>
<groups>
<group>
<name>Linux-OS</name>
</group>
</groups>
<applications>
<application>
<name>Docker容器监控</name>
</application>
</applications>
<discovery_rules>
<discovery_rule>
<name>Docker 容器状态 - {#CONTAINER}</name>
<type>ZABBIX_ACTIVE</type>
<key>docker.discovery</key>
<delay>60s</delay>
<item_prototypes>
<item_prototype>
<name>Docker容器 CPU 使用率-{#CONTAINER}</name>
<type>ZABBIX_ACTIVE</type>
<key>docker.cpu[{#CONTAINER}]</key>
<value_type>FLOAT</value_type>
<units>%</units>
<applications>
<application>
<name>Docker容器监控</name>
</application>
</applications>
</item_prototype>
<item_prototype>
<name>Docker容器内存使用量-{#CONTAINER}</name>
<type>ZABBIX_ACTIVE</type>
<key>docker.mem[{#CONTAINER}]</key>
<units>MiB</units>
<applications>
<application>
<name>Docker容器监控</name>
</application>
</applications>
</item_prototype>
<item_prototype>
<name>Docker容器内存使用率-{#CONTAINER}</name>
<type>ZABBIX_ACTIVE</type>
<key>docker.mem_pct[{#CONTAINER}]</key>
<value_type>FLOAT</value_type>
<units>%</units>
<applications>
<application>
<name>Docker容器监控</name>
</application>
</applications>
</item_prototype>
<item_prototype>
<name>Docker容器状态-{#CONTAINER}</name>
<type>ZABBIX_ACTIVE</type>
<key>docker.status[{#CONTAINER}]</key>
<trends>0</trends>
<value_type>TEXT</value_type>
<applications>
<application>
<name>Docker容器监控</name>
</application>
</applications>
<trigger_prototypes>
<trigger_prototype>
<expression>{last()}<>"running"</expression>
<name>Docker容器异常停止 - {#CONTAINER}</name>
<priority>DISASTER</priority>
</trigger_prototype>
</trigger_prototypes>
</item_prototype>
</item_prototypes>
<graph_prototypes>
<graph_prototype>
<name>Docker 资源使用 - {#CONTAINER}</name>
<show_work_period>NO</show_work_period>
<show_triggers>NO</show_triggers>
<graph_items>
<graph_item>
<sortorder>1</sortorder>
<drawtype>BOLD_LINE</drawtype>
<color>1A7C11</color>
<item>
<host>Linux-docker</host>
<key>docker.cpu[{#CONTAINER}]</key>
</item>
</graph_item>
<graph_item>
<sortorder>2</sortorder>
<drawtype>BOLD_LINE</drawtype>
<color>F63100</color>
<item>
<host>Linux-docker</host>
<key>docker.mem_pct[{#CONTAINER}]</key>
</item>
</graph_item>
<graph_item>
<sortorder>3</sortorder>
<drawtype>BOLD_LINE</drawtype>
<color>000000</color>
<yaxisside>RIGHT</yaxisside>
<item>
<host>Linux-docker</host>
<key>docker.mem[{#CONTAINER}]</key>
</item>
</graph_item>
</graph_items>
</graph_prototype>
</graph_prototypes>
<preprocessing>
<step>
<type>JSONPATH</type>
<params>$.data[*]</params>
</step>
</preprocessing>
</discovery_rule>
</discovery_rules>
</template>
</templates>
</zabbix_export>
五、说明
- 请确保 Zabbix Agent 运行用户对 Docker 命令有权限(通常是加入 docker 用户组)。
- 脚本和 UserParameter 路径请根据实际环境调整。
- 导入该 XML 模板后,自动发现功能会定期扫描所有运行的 Docker 容器,自动生成监控项和触发器。
- 告警触发条件为容器状态不为
running时触发灾难级别告警。

浙公网安备 33010602011771号