前言
Docker作为当前最主流的容器化运行时,已经在开发、测试和生产环境中得到了广泛的应用。对Docker容器及其宿主机的运行状态进行监控,是保障容器化应用稳定运行的重要环节。
Zabbix从Agent 2版本开始,提供了原生Docker监控插件,通过调用Docker API直接获取容器和守护进程的运行数据,无需额外安装脚本或工具,大大简化了监控部署的复杂度。
本文将详细介绍如何使用Zabbix Agent 2监控Docker容器,涵盖安装配置、权限设置、模板链接等完整流程。
一、实验环境说明
| 组件 | 配置 |
|---|---|
| Docker宿主机 | AlmaLinux 9.1(IP: 192.168.38.26) |
| Zabbix Server | 192.168.38.30 |
| Zabbix Agent 2 | 6.4.x 版本 |
| Docker版本 | 20.10.x 及以上 |
| Docker API | Unix套接字(/var/run/docker.sock) |
二、监控原理
2.1 Agent 2 Docker插件架构
Zabbix Agent 2内置了Docker监控插件,其核心原理是通过调用Docker的Unix Socket API来获取容器和守护进程的运行数据。

2.2 关键特性
| 特性 | 说明 |
|---|---|
| 原生支持 | Agent 2内置插件,无需额外安装 |
| API通信 | 通过Docker官方API获取数据,可靠高效 |
| 自动发现 | 自动发现所有运行中的容器 |
| 实时监控 | 支持容器CPU、内存、网络等实时指标 |
| 版本兼容 | 支持Docker 1.12及以上版本 |
2.3 与传统Agent的区别
| 对比项 | Zabbix Agent(v1) | Zabbix Agent 2 |
|---|---|---|
| Docker监控支持 | ❌ 不支持 | ✅ 原生插件支持 |
| 插件架构 | 无插件机制 | 支持Go语言插件 |
| 并发处理 | 单进程 | 高并发插件框架 |
⚠️ 重要提示 :监控Docker容器必须使用Zabbix Agent 2,旧版Zabbix Agent不支持Docker监控功能。
三、部署前准备
3.1 确认Docker服务运行状态
在宿主机上确认Docker服务正常运行:
[root@docker-host ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled)
Active: active (running) since ...
[root@docker-host ~]# docker info | head -20
Client:
Context: default
Debug Mode: false
Server:
Containers: 5
Running: 3
Paused: 0
Stopped: 2
Images: 12
3.2 验证Docker API可访问性
Docker守护进程默认通过Unix套接字 /var/run/docker.sock 提供API访问,验证方法如下:
[root@docker-host ~]# curl -s --unix-socket /var/run/docker.sock http://localhost/version | jq .
{
"Platform": {
"Name": "Docker Engine - Community"
},
"Version": "20.10.17",
"ApiVersion": "1.41",
"MinAPIVersion": "1.12",
...
}
3.3 确认套接字文件权限
[root@docker-host ~]# ls -la /var/run/docker.sock
srw-rw---- 1 root docker 0 Jun 15 10:00 /var/run/docker.sock
四、安装配置Zabbix Agent 2
4.1 安装Zabbix Agent 2
如果尚未安装Agent 2,可通过以下命令安装:
# 添加Zabbix官方仓库
[root@docker-host ~]# rpm -Uvh https://repo.zabbix.com/zabbix/6.4/rhel/9/x86_64/zabbix-release-6.4-1.el9.noarch.rpm
# 安装Zabbix Agent 2
[root@docker-host ~]# yum install -y zabbix-agent2
4.2 修改Agent配置文件
编辑 /etc/zabbix/zabbix_agent2.conf 配置文件:
# Zabbix Server地址(被动模式)
Server=192.168.38.30
# Zabbix Server地址(主动模式)
ServerActive=192.168.38.30
# 本机主机名(需与Zabbix Web端添加的主机名一致)
Hostname=192.168.38.26
# 日志文件配置
LogFile=/var/log/zabbix/zabbix_agent2.log
LogFileSize=10
# 插件配置目录
Plugins=/etc/zabbix/zabbix_agent2.d/plugins.d/
4.3 将Zabbix用户加入Docker组
这是最关键的一步!Agent 2需要通过 /var/run/docker.sock 与Docker守护进程通信,而该套接字文件属于 docker 用户组,因此需要将 zabbix 用户加入到 docker 组中。
[root@docker-host ~]# usermod -aG docker zabbix
验证用户组是否添加成功:
[root@docker-host ~]# id zabbix
uid=998(zabbix) gid=996(zabbix) groups=996(zabbix),992(docker)
⚠️ 重要提示 :执行
usermod命令后,需要重新启动Zabbix Agent 2服务,新的组权限才会生效。
4.4 启动Agent服务
[root@docker-host ~]# systemctl start zabbix-agent2
[root@docker-host ~]# systemctl enable zabbix-agent2
[root@docker-host ~]# systemctl status zabbix-agent2
● zabbix-agent2.service - Zabbix Agent 2
Loaded: loaded (/usr/lib/systemd/system/zabbix-agent2.service; enabled)
Active: active (running) since ...
4.5 验证Agent状态
[root@docker-host ~]# netstat -tlnp | grep 10050
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 12345/zabbix_agent2
tcp6 0 0 :::10050 :::* LISTEN 12345/zabbix_agent2
五、Zabbix Web端配置
5.1 添加主机
-
登录Zabbix Web管理界面
-
进入 数据采集(Data collection) → 主机(Hosts)
-
点击 创建主机(Create host)
填写主机信息:
| 参数 | 值 |
|---|---|
| 主机名称(Host name) | 192.168.38.26 |
| 可见名称(Visible name) | Docker-Host |
| 群组(Groups) | Linux Servers(或自建Docker群组) |
| 接口类型 | Agent |
| 接口IP | 192.168.38.26 |
| 接口端口 | 10050 |
5.2 链接Docker监控模板
在主机配置页面的 模板(Templates) 选项卡中:
-
点击 链接新模板(Link new templates)
-
搜索 Docker by Zabbix agent 2
-
勾选该模板
-
点击 更新(Update) 保存配置
如下图所示:

5.3 验证监控数据
模板链接完成后,稍等片刻(约1-2个采集周期),进入 监控(Monitoring) → 最新数据(Latest data),筛选该主机,应能看到以下类型的监控数据:
-
Docker容器自动发现结果
-
各容器的CPU使用率
-
各容器的内存使用量
-
各容器的网络流量
-
Docker守护进程状态
六、监控指标详解
6.1 Docker守护进程核心指标
| 监控项 | 说明 | 监控意义 |
|---|---|---|
| Docker: Service status | Docker服务运行状态 | 服务是否存活 |
| Docker: Version | Docker版本信息 | 版本管理审计 |
| Docker: Total containers | 容器总数 | 容器总量变化趋势 |
| Docker: Running containers | 运行中容器数 | 当前活跃容器 |
| Docker: Paused containers | 暂停容器数 | 监控异常暂停 |
| Docker: Stopped containers | 停止容器数 | 监控容器退出情况 |
| Docker: Total images | 镜像总数 | 镜像存储管理 |
| Docker: Goroutines | Go协程数 | 监控Docker进程性能 |
| Docker: File descriptors | 文件描述符数 | 系统资源使用 |
6.2 容器级别监控指标(自动发现)
通过自动发现规则,模板会自动发现所有运行中的容器,并为每个容器创建以下监控项:
| 监控项 | 说明 | 监控意义 |
|---|---|---|
| Container CPU usage % | CPU使用率百分比 | ⚠️ 反映容器计算负载 |
| Container CPU throttling % | CPU限制节流百分比 | 反映CPU配额是否足够 |
| Container Memory usage | 内存使用量(字节) | ⚠️ 内存使用趋势 |
| Container Memory usage % | 内存使用率百分比 | 内存告警关键指标 |
| Container Network in | 网络入流量 | 网络接收速率 |
| Container Network out | 网络出流量 | 网络发送速率 |
| Container Uptime | 容器运行时长 | 服务稳定性 |
| Container State | 容器状态(running/paused/exited) | 容器健康状态 |
6.3 自动发现规则
Docker监控模板内置了自动发现规则,主要发现以下对象:
| 发现规则 | 发现对象 | 用途 |
|---|---|---|
| Docker containers discovery | 所有容器(含运行中及停止) | 创建容器级别监控项 |
| Docker running containers discovery | 仅运行中容器 | 监控活跃容器 |
七、常用Docker监控命令验证
7.1 通过zabbix_get测试监控项
在Zabbix Server上使用 zabbix_get 命令验证Agent是否能正常返回Docker数据:
# 获取Docker版本
zabbix_get -s 192.168.38.26 -k "docker.info[version]"
# 获取容器总数
zabbix_get -s 192.168.38.26 -k "docker.info[containers_total]"
# 获取运行中容器数
zabbix_get -s 192.168.38.26 -k "docker.info[containers_running]"
# 获取Docker服务状态
zabbix_get -s 192.168.38.26 -k "docker.ping"
7.2 获取特定容器指标
# 获取某个容器的CPU使用率(容器ID需替换)
zabbix_get -s 192.168.38.26 -k "docker.container_stats[container_id,cpu_usage_percent]"
# 获取某个容器的内存使用量
zabbix_get -s 192.168.38.26 -k "docker.container_stats[container_id,memory_usage]"
# 获取某个容器的运行状态
zabbix_get -s 192.168.38.26 -k "docker.container_status[container_id]"
八、告警规则配置建议
8.1 宿主机级别告警
| 告警项 | 建议阈值 | 告警级别 | 说明 |
|---|---|---|---|
| Docker服务不可用 | ping != 1 | 灾难 | 服务宕机 |
| 停止容器数 > 0 | 持续5分钟 > 0 | 警告 | 有容器异常退出 |
| 容器总数突增 | 环比 > 200% | 信息 | 可能存在异常扩容 |
8.2 容器级别告警
| 告警项 | 建议阈值 | 告警级别 | 说明 |
|---|---|---|---|
| 容器CPU使用率 | > 200%(多核) | 严重 | 计算资源紧张 |
| 容器内存使用率 | > 90% | 严重 | 内存即将耗尽 |
| 容器内存使用率 | > 80% | 警告 | 内存使用偏高 |
| 容器状态异常 | 状态 != "running" | 严重 | 容器停止服务 |
| 容器重启次数 | 1小时内 > 5次 | 严重 | 存在稳定性问题 |
九、高级配置
9.1 配置Docker插件参数
Zabbix Agent 2的Docker插件支持通过配置文件自定义行为,创建 /etc/zabbix/zabbix_agent2.d/plugins.d/docker.conf:
# Docker插件配置
plugins:
docker:
# Docker API连接地址
endpoint: unix:///var/run/docker.sock
# 超时时间(秒)
timeout: 5
# 是否跳过TLS验证
tls_skip_verify: false
9.2 监控特定容器
如果只想监控特定容器,可以修改自动发现规则,使用正则表达式过滤容器名称:
# 在模板宏变量中配置
{$DOCKER.FILTER} = "container_name:.*nginx.*" # 只监控名称含nginx的容器
9.3 远程Docker监控
如需监控远程Docker主机,可配置Docker守护进程监听TCP端口:
# 修改docker.service,添加-H参数
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
然后在Agent插件配置中指定远程地址:
plugins:
docker:
endpoint: tcp://remote-host:2375
⚠️ 安全警告:暴露Docker API到网络可能存在安全风险,生产环境建议启用TLS认证。
十、常见问题排查
10.1 Agent无法获取Docker数据
| 问题现象 | 排查步骤 |
|---|---|
| 所有Docker监控项无数据 | 检查zabbix用户是否在docker组中:id zabbix |
| 权限被拒绝 | 确认已执行usermod -aG docker zabbix并重启Agent |
| 套接字连接超时 | 确认/var/run/docker.sock存在且权限正确 |
快速诊断:
# 以zabbix用户测试Docker API访问
sudo -u zabbix curl -s --unix-socket /var/run/docker.sock http://localhost/version
# 检查Agent日志
tail -f /var/log/zabbix/zabbix_agent2.log | grep -i docker
10.2 部分容器监控不到
| 问题现象 | 排查方向 |
|---|---|
| 某些容器未出现在监控中 | 检查容器状态(是否已停止) |
| 新建容器未自动发现 | 等待自动发现周期(默认1小时) |
| 容器名称显示异常 | 检查容器命名是否包含特殊字符 |
10.3 权限问题深度排查
# 检查套接字文件权限
ls -la /var/run/docker.sock
# 检查zabbix用户组成员
groups zabbix
# 验证docker组是否有访问权限
# 如果仍然报错,检查SELinux状态
getenforce
# 如为Enforcing,尝试临时关闭测试
setenforce 0
如果是SELinux导致的问题,可配置以下策略永久解决:
setsebool -P zabbix_can_network on chcon -t docker_var_lib_t /var/run/docker.sock
十一、性能优化建议
11.1 采集频率优化
| 场景 | 建议采集间隔 | 说明 |
|---|---|---|
| 开发测试环境 | 60秒 | 降低系统负载 |
| 生产环境核心容器 | 30秒 | 及时发现问题 |
| 普通生产环境 | 60秒 | 平衡性能与时效 |
11.2 资源限制建议
对于大规模Docker环境(50+容器),建议:
| 优化项 | 建议 |
|---|---|
| 增加Agent内存 | 设置 zabbix-agent2 的JVM内存限制 |
| 调整历史数据保留期 | 减少不必要的历史数据保留天数 |
| 分批采集 | 避免在同一时间采集所有容器数据 |
十二、总结
本文详细介绍了使用Zabbix Agent 2监控Docker容器的完整方案,核心要点回顾:
-
Agent 2原生支持:Docker监控必须使用Zabbix Agent 2,旧版Agent不支持
-
Unix Socket通信 :通过
/var/run/docker.sock调用Docker API获取数据 -
用户组权限 :必须将
zabbix用户加入docker组才能访问套接字 -
自动发现:模板内置自动发现规则,动态监控容器变化
-
全方位监控:涵盖守护进程状态、容器资源使用、网络流量等指标
Docker监控是容器化运维的基础能力。通过Zabbix Agent 2的内置插件,我们能够以最小的部署成本,实现对Docker容器和守护进程的全面监控,为容器化应用的稳定运行提供有力保障。
📌 相关文章推荐:
《Zabbix监控MySQL与Redis应用实践》
《Zabbix监控Hadoop集群应用实践》
《Zabbix监控Tomcat与Java微服务应用实践》
如果文章对您有帮助,欢迎点赞收藏!如有疑问,请在评论区留言交流。
原创文章,转载请注明出处。