基于 Docker 部署 Zabbix 6.0 监控 Docker 容器状态实战与避坑指南
在单台 Linux 服务器上使用 Docker 部署了 Halo 博客、MySQL、Nginx Proxy Manager 等多个服务时,仅监控服务器的 CPU、内存和磁盘是远远不够的。一旦某个业务容器崩溃或异常退出,宿主机资源往往毫无波动,导致“服务已挂但告警未响”。
本文记录如何基于 Docker Compose 环境部署 Zabbix 6.0 LTS,配置 Zabbix Agent 2 实现 Docker 容器的自动发现(LLD)与状态免配告警,并记录关键的 Socket 权限避坑方案。
一、 核心架构与监控原理
Zabbix Server / Web / MySQL:以容器形式运行,提供数据处理、告警判断与可视化控制台。
Zabbix Agent 2:相较于传统 C 语言编写的 Agent 1,Agent 2 使用 Go 语言开发,内置了原生 Docker 采集插件。
自动发现机制(LLD):Agent 2 通过挂载宿主机的
/var/run/docker.sock与 Docker 守护进程通信,自动拉取当前运行的所有容器列表,并按模板原型自动生成监控项与触发器。告警逻辑:当任何容器的状态从
running变为exited、dead或非正常退出时,Zabbix 自动在仪表盘弹出严重级别告警。
二、 部署配置:从 Agent 1 升级到 Agent 2
由于官方模板 Docker by Zabbix agent 2 依赖专属插件,必须运行 zabbix-agent2 镜像,并赋予访问 Docker Socket 的权限。
在 /opt/zabbix/docker-compose.yml 中调整 zabbix-agent 服务定义:
YAML
version: '3.8'
services:
zabbix-agent:
image: zabbix/zabbix-agent2:alpine-6.0-latest
container_name: zabbix-agent
restart: unless-stopped
privileged: true
user: root # 关键:指定以 root 权限运行,避免 docker.sock 访问拒绝
ports:
- "10050:10050"
environment:
- ZBX_HOSTNAME=Zabbix server
- ZBX_SERVER_HOST=zabbix-server
volumes:
- /:/host/root:ro
- /var/run/docker.sock:/var/run/docker.sock:ro # 挂载宿主机 Docker 套接字
- /proc:/host/proc:ro
- /sys:/host/sys:ro
networks:
- default
# zabbix-server、zabbix-web 等服务保持原有配置...
应用并拉起新容器:
Bash
docker compose stop zabbix-agent
docker compose rm -f zabbix-agent
docker compose up -d zabbix-agent
验证方法:执行
docker ps | grep zabbix-agent,确认镜像显示为zabbix/zabbix-agent2:alpine-6.0-latest且处于Up状态。
三、 关键踩坑:解决 Socket 权限拒绝问题
1. 现象描述
在 Web 控制台关联模板后,进入 Configuration -> Hosts -> Discovery,发现 Docker by Zabbix agent 2: Containers discovery 处于 Not supported 状态,右侧报错提示:
Plaintext
dial unix /var/run/docker.sock: connect: permission denied
2. 原因分析
Alpine 镜像内部默认使用的执行用户可能没有操作宿主机 /var/run/docker.sock 文件的读取权限。
3. 彻底解决方案
双管齐下处理权限限制:
放行宿主机 Socket 权限:
Bash
chmod 666 /var/run/docker.sock容器级别提权: 在
docker-compose.yml中显式指定user: root和privileged: true(如第二节配置所示),避免守护进程重启后权限回滚。
四、 Web 控制台配置:绑定模板与激活发现
1. 确保 Server 与 Agent 网络通信正常
进入 Configuration(配置) -> Hosts(主机),点击
Zabbix server。在 Interfaces(接口) 区域:
Connect to:必须勾选 DNS(容器化环境中 IP 模式连 127.0.0.1 会指向 Server 自身)。
DNS name:填写容器名
zabbix-agent。
点击 Update 保存。
2. 关联 Docker 官方模板
在
Zabbix server编辑页面中,找到 Templates 输入框。搜索并关联:
Docker by Zabbix agent 2。点击底部 Update 保存。
3. 强制立即执行自动发现(加速纳管)
默认情况下,自动发现扫描周期为 15 分钟或 1 小时。为了无需漫长等待:
点击
Zabbix server行的 Discovery 链接。勾选
Docker by Zabbix agent 2: Containers discovery复选框。点击页面底部的 Execute now(立即执行)。
等待 15~30 秒刷新页面,确认该规则状态显示为绿色的 Enabled,红色的
[ i ]报错图标彻底消除。
五、 端到端故障注入与验证
1. 查看自动纳管的容器项
进入 Monitoring(监测) -> Latest data(最新数据),筛选主机 Zabbix server 并搜索关键词 Docker。 若能看到各业务容器的具体指标(如 Docker: Container halo: State、Docker: Container halo-mysql: State),说明数据抓取成功。
2. 模拟容器宕机
在宿主机终端手动停止任意一个正在运行的容器:
Bash
docker stop halo
3. 观察告警闭环
等待 30~60 秒,刷新 Zabbix 控制台的 Monitoring -> Dashboard(或 Problems 页面)。
告警上屏:列表中自动弹出严重级别告警,显示容器已处于停止状态:
Plaintext
Container halo: Container has been stopped故障恢复(自愈测试): 重新拉起容器:
Bash
docker start halo约 15~30 秒后再次刷新 Dashboard,该告警条目自动关闭并移入历史记录,系统面板全绿恢复。
六、 总结与最佳实践
区分 Agent 选型:基础主机监控用普通 Agent 即可,但中间件与 Docker 原生指标采集优先选择 Zabbix Agent 2。
白盒与黑盒双重兜底:
白盒(Docker 模板):监控容器自身存活、CPU 占用、内存用量。
黑盒(Web 场景监测):监控实际对外提供访问的 URL(检测是否返回 HTTP 200),防范“容器进程活着但应用假死 502”的场景。
二者配合,即可在不侵入业务代码的前提下,构建出完整的容器基础设施保障体系。
基于 Docker 部署 Zabbix 6.0 监控 Docker 容器状态实战与避坑指南
https://originspace.work/archives/ji-yu-docker-bu-shu-zabbix-6.0-jian-kong-docker-rong-qi-zhuang-tai-shi-zhan-yu-bi-keng-zhi-nan
评论