Docker 容器监控,这四个命令你必须知道!
-
docker logs
洞察容器内部活动 -
docker top
透视容器进程世界 -
docker stats
全方位资源监控 -
docker inspect
容器的详细档案
今天要介绍命令均服务于容器运行状态的观察、诊断和性能分析,通过获取日志输出、进程列表和资源使用统计,可以帮助用户排查容器内部的问题、优化资源分配或进行容量规划。由于它们聚焦于容器运行时的监控与调试,合并在同一起介绍有利于形成完整的监控视角。
1. docker logs
洞察容器内部活动
docker logs
命令在容器运维、故障排查、监控告警、审计合规、性能分析、业务洞察、开发测试以及容器生命周期管理等多个方面发挥着核心作用,是管理和理解 Docker 容器运行状态的重要工具。
➜ ~ docker run -d -p 3000:3000 --name hello-go hello-go:default
5d301eb6b03f5c6397096fb6efb4193f9970a876a93fbf3a16bf26249fa79efb
➜ ~ docker logs hello-go
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET / --> main.main.func1 (3 handlers)
[GIN-debug] GET /ping --> main.main.func2 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :3000
[GIN] 2024/04/13 - 04:06:33 | 200 | 33.754µs | 192.168.31.47 | GET "/"
[GIN] 2024/04/13 - 04:06:33 | 404 | 903ns | 192.168.31.47 | GET "/favicon.ico"
运行一个hello-go容器,-d
后台运行,-p 3000:3000
宿主机3000与容器内3000映射,--name hello-go
命名容器为hello-go,最后跟hello-go:default
指定我们启动容器所基于的镜像。
通过命令docker logs [容器名称 or 容器id]
,可以查看容器内应用的运行日志,方便诊断应用运行期间的问题。应用日志文件会写入日志文件进行存储,建议使用挂在卷的方式持久化存储,防止因容器停止或删除,丢失数据。
可以在加-f
,用于实时跟踪指定容器的日志输出,实时打印容器新增的日志条目。docker logs hello-go -f
2. docker top
透视容器进程世界
docker top
命令主要用于实时监控容器内部进程状态、资源使用情况,以及进行故障排查、安全审计、资源分配优化、自动化监控等任务,是管理和运维 Docker 容器过程中必不可少的诊断和分析工具。
➜ ~ docker top hello-go
UID PID PPID C STIME TTY
TIME CMD
root 1232 1213 0 00:06 ?
00:00:00 ./app
使用docker top hello-go
命令,根据输出容器内部只有一个运行中的进程(PID 为 1232),该进程以 root 用户身份运行,其父进程为 PID 1213。进程启动于6分钟前,未关联任何终端,且自启动以来未显著占用CPU时间。进程的主要任务是执行当前目录下的 app
可执行文件。
输出解释:
- UID: 表示在容器内部运行进程的用户标识符(User ID)。
- PID: 进程标识符(Process ID)。
- PPID: 父进程标识符(Parent Process ID)。
-
C: CPU 使用优先级或nice值。数值越小,优先级越高,占用CPU资源的可能性越大。此处为
0
,表示该进程具有普通(默认)的CPU使用优先级。 -
STIME: 进程启动时间。显示为
00:06
,表示该进程在当前时间的前6分钟启动。 -
TTY: 终端类型。符号
?
表示该进程没有关联到终端(non-TTY process),通常后台服务或守护进程会有这样的标记。运行容器加-t
会为容器分配伪TTY。 -
TIME: 进程累计占用CPU时间。显示为
00:00:00
,表示该进程自启动以来,尚未占用过CPU时间或者统计周期内未占用CPU时间。 -
CMD: 执行的命令及参数。此处为
./app
,表示该进程正在运行一个名为app
的可执行文件,该文件位于当前工作目录(.
)下。
3. docker stats
全方位资源监控
docker stats
命令是监控容器资源使用情况、进行性能分析与调优、容量规划、故障排查、智能调度、合规审计以及自动化运维的核心工具,对于有效管理大规模容器化环境、保障服务质量和降低成本具有重要意义。会显示指定容器(或所有正在运行的容器)的 CPU、内存、网络和磁盘 I/O 的使用统计信息。
使用命令docker stats hello-go
➜ ~ docker stats hello-go
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
5d301eb6b03f hello-go 0.00% 8.191MiB / 3.823GiB 0.21% 6.64kB / 4.04kB 7.11MB / 0B 6
输出解释:
-
CONTAINER ID: 容器的唯一标识符,一个长字符串,如
5d301eb6b03f
。 -
NAME: 容器的名称,如
hello-go
。这是您在创建容器时通过--name
参数指定的名称,或者 Docker 自动赋予的名称。 -
CPU %: 容器当前使用的 CPU 占比。这里始终显示为
0.00%
,说明在采样时刻,容器几乎未使用 CPU 资源。 -
MEM USAGE / LIMIT: 容器当前使用的内存(MEM USAGE)及其内存限制(LIMIT)。如
8.191MiB / 3.823GiB
表示容器使用了 8.191 MiB 内存,其内存限制为 3.823 GiB。后面的0.21%
是内存使用量相对于限制的百分比,说明容器的内存使用非常低。 -
NET I/O: 容器的网络输入(I/O)和输出(O)流量。如
6.64kB / 4.04kB
表示容器接收了 6.64 kB 的数据,发送了 4.04 kB 的数据。这些值都很小,说明容器在网络通信方面几乎没有活动。 -
BLOCK I/O: 容器对存储(磁盘)的读取(I/O)和写入(O)量。如
7.11MB / 0B
表示容器向磁盘写入了 7.11 MB 的数据,没有从磁盘读取数据。写入量稍大,但总体来看,容器的磁盘活动也相当有限。 -
PIDS: 容器内当前运行的进程数。这里始终显示为
6
,表示容器内部有 6 个进程正在运行。
综上所述,docker logs
、docker top
和docker stats
这三个命令构成了Docker容器日志与监控的核心工具集,分别从日志输出、进程信息和资源使用三个维度为运维人员提供了全面的容器观测手段。熟练运用这些命令,不仅能提升日常运维效率,还能在问题发生时迅速定位根源,确保容器化环境的稳定运行和高效利用。实现容器监控,为容器化应用的长期稳健运行保驾护航。
4. docker inspect
容器的详细档案
docker inspect
命令是Docker容器管理中的一个重要工具,用于获取指定容器的详细配置、状态及元数据信息。这些信息以JSON格式输出,包含容器的创建参数、运行状态、网络配置、存储挂载、资源限制、环境变量等诸多细节。
以下是使用 docker inspect
命令查询 hello-go
容器详细信息的示例:
➜ ~ docker inspect hello-go
在这条命令中,hello-go
是您要查询详细信息的容器名称或ID。执行命令后,Docker 会返回一个详细的JSON对象,包含容器的所有相关信息。由于JSON输出通常较为冗长且结构化,不在展示,请运行命令查看。
通过 docker inspect -f '{{json .<field>}}' <container>
可以只输出指定字段的信息。
例如,查询容器IP地址:docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' hello-go
。
输出解释:
-
Id
: 容器的唯一标识符(长哈希字符串)。 -
Name
: 容器的名称,即创建时通过--name
参数指定的名称或Docker自动分配的短名称。 -
State
: 容器当前运行状态,包括Running
、Paused
、Restarting
、Dead
等状态以及相关的详细信息,如启动时间、退出代码、是否可以自动重启等。 -
Config
: 容器创建时的配置信息,如命令、入口点、环境变量、工作目录、用户、资源限制(CPU、内存)等。 -
NetworkSettings
: 容器的网络配置,包括网络模式(桥接、主机、none、自定义网络)、端口映射、IP地址、DNS配置等。 -
Mounts
: 容器挂载的数据卷或绑定挂载信息,包括源路径、目标路径、类型(volume、bind、tmpfs)等。 -
Image
: 容器基于的镜像信息,包括镜像ID、镜像名称、标签等。 -
Labels
: 容器上设置的标签(键值对),用于组织和筛选容器。 -
HostConfig
: 与主机相关的配置,如内存、CPU限制、设备映射、特权模式、日志驱动、重启策略等。
综上所述,docker logs
、docker top
、docker stats
和docker inspect
这四个命令构成了Docker容器日志与监控的核心工具集,分别从日志输出、进程信息和资源使用、容器的详尽配置信息四个维度为运维人员提供了全面的容器观测手段。熟练运用这些命令,不仅能提升日常运维效率,还能在问题发生时迅速定位根源,确保容器化环境的稳定运行和高效利用。实现容器监控,为容器化应用的长期稳健运行保驾护航。
忍不住要加个关注!不是我吹,但你会后悔没关注的!