如何使用 docker container stats 命令监控容器资源

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何使用 docker stats 命令有效监控 Docker 容器的资源使用情况。你将探索如何实时显示所有运行中容器的资源占用,以及如何通过容器名称或 ID 查看特定容器的资源使用情况。

此外,你还将了解如何查看所有容器(包括已停止的容器)的资源使用情况,以及如何使用自定义模板来格式化 docker stats 命令的输出。最后,你将学习如何获取容器统计数据的单次快照,而无需持续流式输出。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/top("Display Running Processes in Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/ps -.-> lab-555123{{"如何使用 docker container stats 命令监控容器资源"}} docker/stop -.-> lab-555123{{"如何使用 docker container stats 命令监控容器资源"}} docker/top -.-> lab-555123{{"如何使用 docker container stats 命令监控容器资源"}} docker/pull -.-> lab-555123{{"如何使用 docker container stats 命令监控容器资源"}} end

实时显示所有运行中容器的资源使用情况

在本步骤中,你将学习如何使用 docker stats 命令实时显示所有运行中 Docker 容器的资源使用情况。该命令会实时输出容器资源使用数据流,包括 CPU、内存、网络 I/O 和块 I/O。

首先,让我们启动几个容器以便进行监控。我们将使用 ubuntu 镜像并以分离模式 (-d) 运行它们,使它们在后台运行。同时我们会为容器命名以便于识别。

docker pull ubuntu
docker run -d --name container1 ubuntu sleep infinity
docker run -d --name container2 ubuntu sleep infinity
docker run -d --name container3 ubuntu sleep infinity

现在我们已经运行了一些容器,可以使用 docker stats 命令查看它们的资源使用情况。

docker stats

你将看到一个表格,显示每个运行中容器的信息,包括容器 ID、名称、CPU 使用率、内存使用量、网络 I/O、块 I/O 和 PIDs。这些输出会实时更新。

要停止 docker stats 命令,请按 Ctrl+C

通过名称或 ID 显示特定容器的实时资源使用情况

在上一步中,你已学会如何显示所有运行中容器的资源使用情况。本步骤将教你如何通过向 docker stats 命令提供容器名称或 ID 来显示特定容器的资源使用情况。

要查看单个容器的统计信息,只需在 docker stats 命令后指定其名称或 ID。例如,查看 container1 的统计信息:

docker stats container1

此时你将仅看到 container1 的实时资源使用情况。按 Ctrl+C 可停止输出。

你也可以同时指定多个容器名称或 ID 来查看多个容器的统计信息。例如,查看 container1container2 的统计信息:

docker stats container1 container2

这将同时显示 container1container2 的实时资源使用情况。按 Ctrl+C 可停止输出。

在实际使用中,相比容器 ID,使用容器名称通常更便于记忆和操作,特别是在运行多个容器的情况下。

显示所有容器(运行中和已停止)的资源使用情况

默认情况下,docker stats 仅显示运行中容器的统计信息。本步骤将教你如何使用 -a--all 标志来显示所有容器的资源使用情况,包括已停止的容器。

首先,让我们停止在前几步中启动的一个容器:

docker stop container3

现在,如果你不带任何标志运行 docker stats,你将只能看到仍在运行的 container1container2

docker stats

Ctrl+C 可停止输出。

要查看所有容器的统计信息(包括已停止的 container3),请使用 -a 标志:

docker stats -a

此时你将看到 container1container2container3 都被列出。对于已停止的容器,大多数资源使用字段会显示为 0%0B,因为它们当前并未实际消耗资源。

这个功能对于获取系统中所有容器的完整概览非常有用,包括它们在停止前的最后已知资源使用情况。

使用自定义模板格式化容器统计信息输出

在本步骤中,你将学习如何使用自定义 Go 模板来格式化 docker stats 命令的输出。这使你可以仅显示所需的信息,并以易于解析或阅读的格式呈现。

docker stats 命令支持 --format 标志,该标志接受一个 Go 模板字符串作为参数。你可以在模板中使用各种占位符来表示不同的容器信息片段。一些常用的占位符包括:

  • .ContainerID:容器 ID
  • .Name:容器名称
  • .CPUPerc:CPU 使用百分比
  • .MemUsage:内存使用量
  • .NetIO:网络 I/O
  • .BlockIO:块 I/O
  • .PIDs:进程 ID 数量

让我们尝试格式化输出,仅显示容器名称、CPU 使用率和内存使用量:

docker stats --format "{{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

在这个命令中:

  • --format 指定我们要使用自定义格式
  • "{{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" 是 Go 模板字符串
    • {{.Name}} 显示容器名称
    • \t 插入制表符用于分隔
    • {{.CPUPerc}} 显示 CPU 使用百分比
    • {{.MemUsage}} 显示内存使用量

你将看到容器名称、CPU 使用率和内存使用量的实时流,用制表符分隔。按 Ctrl+C 可停止输出。

你可以尝试不同的占位符和格式来获得所需的输出。例如,要包含容器 ID 和网络 I/O:

docker stats --format "ID: {{.ContainerID}}\tName: {{.Name}}\tNetIO: {{.NetIO}}"

这提供了更加定制化的容器统计信息视图。

获取容器统计信息的单次快照(非流式输出)

默认情况下,docker stats 会持续输出实时资源使用情况。但有时你可能只需要获取当前统计信息的单次快照,而不需要持续更新。本步骤将教你如何使用 --no-stream 标志来实现这一需求。

--no-stream 标志会指示 docker stats 仅收集一次统计信息后立即退出,而不是持续更新输出。

让我们获取所有运行中容器的单次统计快照:

docker stats --no-stream

你将看到容器统计信息的表格只出现一次,随后命令就会退出。这在编写脚本或只需快速查看当前资源使用情况时非常有用。

你可以将 --no-stream 与其他标志组合使用,例如结合 -a 标志查看所有容器(包括运行中和已停止的)的快照:

docker stats -a --no-stream

这将显示所有容器的单次快照。

你也可以配合指定特定容器使用:

docker stats container1 container2 --no-stream

这将为你提供 container1container2 的单次统计快照。

当你不需要实时更新,只需捕获当前资源使用状态时,使用 --no-stream 会非常高效。

总结

在本实验中,你学习了如何有效使用 docker stats 命令来监控 Docker 容器的资源使用情况。首先,你查看了所有运行中容器的实时资源使用数据,观察了 CPU、内存、网络 I/O 和块 I/O 的实时数据流。

随后,你通过指定容器名称或 ID 来聚焦特定容器的监控,查看它们各自的资源消耗情况。这种方法使得针对单个容器的性能分析成为可能。