下面我将从基础命令、系统级监控和专业监控方案三个层面,为你详细介绍 Docker 的监控方法。

Docker 基础监控命令
这些是直接与 Docker 交互的命令,用于快速了解单个或多个容器的运行状态。
查看容器列表
docker ps 是最常用的命令,用于查看正在运行的容器。
# 查看正在运行的容器 docker ps # 查看所有容器(包括已停止的) docker ps -a # 只显示容器ID docker ps -q # 查看最后创建的N个容器 docker ps -n 5
常用选项:
-a: 显示所有容器-q: 静默模式,只显示容器ID--format: 自定义输出格式,非常适合脚本化# 以表格形式显示容器ID、名称和状态 docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
查看容器详细信息
docker inspect 可以获取容器或镜像的详细 JSON 配置信息。

# 查看指定容器的所有详细信息
docker inspect <container_id_or_name>
# 只查看容器的 IP 地址
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_id_or_name>
# 只查看容器的日志路径
docker inspect --format='{{.LogPath}}' <container_id_or_name>
查看容器资源使用情况
docker stats 提供了实时的容器资源消耗数据,非常直观。
# 实时查看所有运行中容器的资源使用情况 docker stats # 只查看指定容器的资源使用 docker stats <container_id_or_name> # 以非交互式模式运行,适合重定向到文件 docker stats --no-stream
输出列说明:
CONTAINER ID: 容器IDNAME: 容器名称CPU %: CPU使用率百分比MEM USAGE / LIMIT: 内存使用量 / 内存限制MEM %: 内存使用率百分比NET I/O: 网络输入/输出量BLOCK I/O: 块设备输入/输出量PIDS: 进程数
查看容器日志
docker logs 用于查看容器的标准输出和标准错误。
# 查看容器的所有日志 docker logs <container_id_or_name> # 实时跟踪日志输出(类似 `tail -f`) docker logs -f <container_id_or_name> # 只显示最新的N行日志 docker logs --tail 50 <container_id_or_name> # 显示带时间戳的日志 docker logs --timestamps <container_id_or_name>
查看系统级资源限制
docker info 显示 Docker 服务器和系统的整体信息,包括资源限制。
docker info
在输出中,你可以找到 Total Memory, CPU Count, Storage Driver 等关键信息。
系统级监控命令
容器运行在宿主机上,因此宿主机的系统状态同样重要,这些命令不直接调用 Docker,但对于排查问题至关重要。
CPU 监控
# 查看所有CPU核心的实时负载 top # 查看CPU使用情况(按CPU使用率排序) htop # 查看CPU的详细统计信息 mpstat 1 5 # 每1秒刷新一次,共5次 # 查看特定进程的CPU使用情况 ps aux --sort=-%cpu
内存监控
# 查看内存使用概况 free -h # 查看详细的内存使用情况 top # 查看特定进程的内存使用情况 ps aux --sort=-%mem
磁盘 I/O 监控
# 查看磁盘使用情况 df -h # 查看磁盘I/O统计 iostat -xz 1 # 查看目录大小 du -sh /var/lib/docker # 查看Docker数据目录大小
网络监控
# 查看网络连接状态 netstat -tuln # 查看网络接口的流量统计 iftop # 查看容器的网络命名空间 nsenter -t <container_pid> -n ip a
专业监控方案
对于生产环境,手动执行命令是不够的,我们需要一个自动、集中、可视化的监控解决方案,主流方案分为两类:
基于 Docker 自带功能的方案
a) Docker Stats + 日志收集
这是最简单的方案,使用 docker stats 和 docker logs 的输出来收集数据,然后发送到中央存储。
- 工具推荐:
cadvisor(Google开源)。 - 工作原理:
cadvisor作为容器在宿主机上运行,它会自动收集本机和所有容器的资源使用数据(CPU、内存、磁盘、网络)。 - 优点: 开箱即用,无需修改现有容器。
- 缺点: 功能相对简单,通常需要配合其他工具(如 InfluxDB, Prometheus, Grafana)才能形成完整的监控体系。
基于 Prometheus 的方案 (业界标准)
这是目前最流行、功能最强大的监控方案,尤其适合 Kubernetes 环境。
-
核心组件:
- Prometheus: 时序数据库,负责抓取和存储监控数据。
- Node Exporter: 部署在每个宿主机上,收集宿主机的系统级指标(CPU、内存、磁盘、网络)。
- cadvisor: 部署在每个宿主机上,收集容器级别的资源指标。
- Alertmanager: 处理告警规则,并管理告警的发送(如邮件、Slack)。
- Grafana: 数据可视化工具,用于创建仪表盘。
-
工作流程:
- Prometheus 配置抓取
Node Exporter和cadvisor的数据。 - 数据存储在 Prometheus 的时序数据库中。
- 在 Grafana 中连接 Prometheus 数据源,创建丰富的可视化仪表盘。
- 在 Prometheus 中配置告警规则,当指标超过阈值时,触发
Alertmanager发送通知。
- Prometheus 配置抓取
-
优点: 生态强大、查询语言强大(PromQL)、高可用、可扩展。
-
缺点: 架构相对复杂,需要一定的学习成本。
商业/云原生监控方案
许多云厂商和商业公司提供了成熟的 Docker/Kubernetes 监控服务。
-
Datadog: 功能全面的 APM 和监控平台,对 Docker 和 Kubernetes 支持非常好。
-
New Relic: 另一个强大的 APM 和监控平台。
-
Sysdig: 专注于容器和云原生安全与监控。
-
云厂商服务:
- AWS: Amazon CloudWatch
- Google Cloud: Cloud Monitoring
- Azure: Azure Monitor
-
优点: 开箱即用,功能强大,通常包含告警、日志、追踪等功能,提供专业支持。
-
缺点: 通常是付费服务,可能存在厂商锁定。
总结与建议
| 场景 | 推荐方案 | 优点 | 缺点 |
|---|---|---|---|
| 开发/测试环境 | docker stats + docker logs |
简单、快速、无需额外组件 | 功能有限,无法持久化,不适合生产 |
| 小型生产环境 | cadvisor + InfluxDB + Grafana |
轻量级,可视化效果好,功能足够 | 需要自己组装和配置,扩展性不如 Prometheus |
| 中大型/云原生环境 | Prometheus 生态 (Node Exporter, cAlertmanager, Grafana) | 业界标准,功能强大,高可用,可扩展 | 架构复杂,学习成本高 |
| 企业级/追求省心 | 商业监控工具 (Datadog, New Relic) 或云厂商服务 | 功能全面,开箱即用,有专业支持 | 付费,可能存在厂商锁定 |
入门建议:
如果你刚开始,可以先从 docker stats 和 docker logs 开始,熟悉基本概念,然后尝试搭建一个 cadvisor + InfluxDB + Grafana 的组合,这是体验专业监控的最佳起点,如果你的环境是 Kubernetes,那么直接学习 Prometheus 生态是必然的选择。
