docker客户端与守护进程通信不产生网络流量,因使用unix域套接字(/var/run/docker.sock)绕过tcp/ip协议栈;需监控dockerd自身资源消耗及容器真实网络流量。
docker 客户端与守护进程(dockerd)之间的通信本身不产生可观测的“网络流量”指标——它们通过 unix 域套接字(默认路径 /var/run/docker.sock)本地通信,不走 tcp/ip 协议栈,因此不会出现在 ifconfig、netstat 或 ss 的网络接口统计中,也不会被 iftop、vnstat 等传统网络监控工具捕获。
真正需要监控的,是守护进程自身对系统资源的消耗(CPU、内存、I/O),以及它所管理的容器产生的实际网络流量(即容器进出的 HTTP、gRPC、数据库连接等),这两者常被误认为是“客户端与守护进程间的流量”。
以下是分场景的实用监控方式:
守护进程(dockerd)自身健康与开销监控
dockerd 是一个长期运行的 Linux 进程,其稳定性直接影响所有容器。需单独关注:
-
CPU 与内存占用
ps -o pid,ppid,%cpu,%mem,cmd -C dockerd # 或持续观察 top -p $(pgrep dockerd)
-
Unix socket 响应延迟(间接反映负载)
使用time测试基础 API 响应:time curl -s --unix-socket /var/run/docker.sock http://localhost/version | head -n1
超过 100ms 可能提示
dockerd正在处理高并发请求或卡在存储/网络操作中。 -
守护进程日志异常信号
查看是否频繁出现context deadline exceeded、failed to start daemon、graphdriver failed等错误:journalctl -u docker --since "1 hour ago" | grep -i -E "(error|fail|timeout)"
容器真实网络流量监控(这才是业务关心的“流量”)
客户端调用 docker run、docker exec 等命令后,实际网络行为发生在容器内部。监控重点在容器级网络 I/O:
-
使用
docker stats查看实时网络吞吐docker stats --no-stream --format "{{.Name}}\t{{.NetIO}}" # 输出示例:my-api 12.4MB / 8.7MB(接收 / 发送) -
定位高流量容器(基于 cgroup + net_cls)
若启用了网络策略标签(如--cgroup-parent=net-frontend),可结合tc或iptables统计:# 查看桥接网卡 docker0 的整体收发 cat /sys/class/net/docker0/statistics/{rx,tx}_bytes # 按容器 ID 查其网络命名空间内接口(需 nsenter) PID=$(docker inspect -f '{{.State.Pid}}' my-api) nsenter -t $PID -n cat /proc/net/dev | grep eth0 -
持久化网络连接数监控
容器内应用是否泄漏连接?用conntrack统计 NAT 连接:conntrack -L -n | awk '$3=="ipv4" {print $4}' | sort | uniq -c | sort -nr | head -5
不推荐但常见误区:试图监控 /var/run/docker.sock 流量
有人尝试用 strace -e trace=sendto,recvfrom -p $(pgrep dockerd) 抓取 socket 数据,但这会导致严重性能抖动,且返回的是二进制 API 请求(如 POST /v1.45/containers/create),无业务语义,生产环境禁用。
真正有效的做法是:
✅ 在容器内应用层埋点(OpenTelemetry HTTP 拦截器)
✅ 用 sidecar(如 Envoy)代理出口流量并暴露 Prometheus 指标
✅ 用 eBPF 工具(如 bpftrace 或 Cilium Hubble)跟踪容器间通信(无需修改应用)
不复杂但容易忽略。











