Docker资源监控需协同采集容器、daemon和宿主机的CPU、内存、磁盘I/O、网络及状态数据:CPU/内存用docker stats或cgroup v2路径获取,注意cache剔除与采样计算;磁盘I/O通过blkio cgroup和iostat分析;网络依赖cgroup+eBPF或iptables/conntrack;daemon健康需结合systemctl、socket ping、日志审计与events监听。

要对 Docker Engine 进行系统资源审计与监控指标收集,核心是获取容器、守护进程(daemon)、宿主机三者在 CPU、内存、磁盘 I/O、网络及运行状态层面的实时与历史数据,并确保采集方式轻量、稳定、可集成。
CPU 与内存使用率采集
Docker 自带 docker stats 命令可实时输出容器级 CPU 和内存使用百分比、绝对值(如 MiB)、内存限制(如果设置了 --memory)等。生产环境建议关闭流式输出(加 --no-stream),配合定时脚本或监控代理(如 Prometheus Node Exporter + cAdvisor)抓取快照。
关键注意点:
- 内存统计含 cache(page cache),实际“压力内存”应关注
memory.usage_in_bytes减去memory.stat: cache,可通过 cgroup v2 路径/sys/fs/cgroup/docker/和/memory.current memory.stat获取 - CPU 使用率基于 Linux cgroup 的
cpuacct.usage计算,单位为纳秒;需采样间隔差值再除以时间窗口,避免瞬时抖动误判 - 守护进程自身开销(
dockerd进程)需单独用ps或top -p $(pgrep dockerd)监控,不可忽略
磁盘与 I/O 指标提取
Docker 默认存储驱动(如 overlay2)不直接暴露容器层 I/O 统计,但可通过以下路径获取:
- 容器根目录的 cgroup blkio 子系统:
/sys/fs/cgroup/blkio/docker/(读写字节数)/blkio.io_service_bytes_recursive - 宿主机级磁盘压力:使用
iostat -x 1关注%util、await、avgqu-sz,尤其当大量容器共用同一块盘时 - 镜像与卷占用空间:
docker system df -v显示镜像、容器、本地卷、构建缓存的磁盘用量;定期调用并解析 JSON 输出(加--format '{{json .}}')便于入库分析
网络连接与流量监控
Docker 容器网络流量不经过宿主机常规网卡统计(如 /proc/net/dev),需依赖:
- cgroup net_cls + net_prio 控制组(需启动时配置
--cgroup-parent并打标)+tc或 eBPF 工具(如 Cilium 的hubble)实现细粒度追踪 - 更通用方案:使用
docker network inspect bridge查看网桥信息后,结合iptables -t filter -L -v -n或conntrack -L统计连接数与状态 - 容器内应用层出口流量(如 HTTP 请求)建议由应用埋点(OpenTelemetry)或 sidecar(如 Envoy)捕获,而非仅依赖网络栈指标
守护进程健康与事件审计
Docker daemon 状态直接影响所有容器生命周期,需持续审计:
- 通过
systemctl is-active docker或curl --unix-socket /var/run/docker.sock http://./_ping判断存活 - 启用 daemon 日志级别为
info或debug(修改/etc/docker/daemon.json中"log-level"),将日志接入 ELK 或 Loki 实现操作溯源 - 监听 Docker 事件流:
docker events --since '2024-01-01' --filter 'event=start' --filter 'event=die',可用于异常重启检测、容器漂移分析 - 检查 daemon 配置合规性:如是否启用
live-restore、是否禁用userns-remap、TLS 是否强制等,可用docker info | grep -E "(Live|Security|Labels)"快速筛查
不复杂但容易忽略的是指标采集的上下文对齐——比如容器内存使用率高,需同步查其 limit 设置、OOMKilled 事件、以及宿主机 swap 使用情况,单点指标无法定位真实瓶颈。








