Zabbix监控Docker容器应用实践完整指南

前言

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 添加主机

  1. 登录Zabbix Web管理界面

  2. 进入 数据采集(Data collection)主机(Hosts)

  3. 点击 创建主机(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) 选项卡中:

  1. 点击 链接新模板(Link new templates)

  2. 搜索 Docker by Zabbix agent 2

  3. 勾选该模板

  4. 点击 更新(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微服务应用实践》

如果文章对您有帮助,欢迎点赞收藏!如有疑问,请在评论区留言交流。

原创文章,转载请注明出处。

相关推荐
hweiyu002 小时前
Linux命令:info
linux·运维
xiaoxiangsiyan2 小时前
机房交换机交换技术与服务器链路聚合深度指南
运维·服务器·网络·学习·自动化·bond
星空2 小时前
WordPress在docker中部署
运维·docker·容器
wsad05323 小时前
CentOS Stream 10 Docker 容器无法访问外网:xt_addrtype 内核模块缺失解决方法
linux·网络·docker·云原生·eureka·centos
x17388062733 小时前
Linux
linux
加油码3 小时前
探秘 volatile关键字:编译器的过度优化
linux·bug·信号处理
怦怦蓝3 小时前
Windows 安装 Docker Desktop 踩坑完整实战指南(WSL2 故障排错实录)
windows·docker·容器
梦想的旅途23 小时前
企微社群裂变实战:自动化群接龙与活动打卡系统搭建
运维·自动化·企业微信
Neolnfra3 小时前
使用 Netdata 给服务器增加一个实时监控面板
运维·服务器