Skip to content
60.Docker»60.CNB下的Docker应用»LV055-容器监控与管理.md

LV055-容器监控与管理

一、概述

1. 为什么需要容器监控

  • 容器化应用资源隔离、数量多、生命周期短
  • 监控能提前发现问题、快速定位故障
  • 常见监控对象:CPU、内存、网络、磁盘、应用健康状态

2. 监控的主要指标

我们监控的指标主要有:CPU 利用率、内存占用网络流量、I/O(读写速率)运行状态、健康检查等。

3. 监控的原理

  • Docker Engine 通过 API 暴露实时数据
  • 监控工具/命令定期拉取、展示 docker 容器状态

二、容器生命周期管理

以下是一些最常用的容器管理命令:

bash
docker ps -a # 列出所有容器(包括停止的容器)
docker ps    # 仅列出运行中的容器
docker start <container_id> # 启动容器
docker stop <container_id> # 停止容器
docker restart <container_id> # 重启容器

docker rm <container_id>    # 删除容器(需要先停止)
docker rm -f <container_id> # 强制删除运行中的容器

三、容器资源监控

Docker 提供了多种方式来监控容器的资源使用情况。我们这里还是在 CNB 中测试,可以通过下面的命令启动两个容器:

shell
docker run -d --name nginx_V1 nginx:alpine
docker run -it -d -p 8080:8080 tomcat:8.5.46-jdk8-openjdk

【例】

image-20251102193032633

1. docker stats

1.1 基本命令

docker stats 命令用于实时显示 Docker 容器的资源使用情况,包括 CPU、内存、网络 I/O 和块 I/O。类似于 Linux 系统中的 top 命令,但它专门针对 Docker 容器。通过 docker stats,用户可以监控容器的资源使用情况,帮助优化性能和进行故障排除。

shell
docker stats [OPTIONS] [CONTAINER...]

OPTIONS

  • --all , -a : 显示所有的容器,包括未运行的。
  • --format : 指定返回值的模板文件。
  • --no-stream : 展示当前状态就直接退出了,不再实时更新。
  • --no-trunc : 不截断输出。

1.2 使用示例

  • (1)显示所有运行的容器的资源使用情况
shell
docker stats

【例】

shell
  /workspace git:(main) docker stats
CONTAINER ID   NAME              CPU %     MEM USAGE / LIMIT   MEM %     NET I/O       BLOCK I/O   PIDS
c393a2008839   angry_blackwell   211.90%   124.6MiB / 16GiB    0.76%     726B / 0B     0B / 0B     53
af4256a91eee   nginx_V1          0.00%     10.36MiB / 16GiB    0.06%     1.32kB / 0B   0B / 0B     9
CONTAINER ID   NAME              CPU %     MEM USAGE / LIMIT   MEM %     NET I/O       BLOCK I/O   PIDS
c393a2008839   angry_blackwell   211.90%   124.6MiB / 16GiB    0.76%     726B / 0B     0B / 0B     53
af4256a91eee   nginx_V1          0.00%     10.36MiB / 16GiB    0.06%     1.32kB / 0B   0B / 0B     9

然后就会一直打印状态,按 Ctrl+c 即可退出。

CONTAINER ID 与 NAME: 容器 ID 与名称。

CPU % 与 MEM %: 容器使用的 CPU 和内存的百分比。

MEM USAGE / LIMIT: 容器正在使用的总内存,以及允许使用的内存总量。

NET I/O: 容器通过其网络接口发送和接收的数据量。

BLOCK I/O: 容器从主机上的块设备读取和写入的数据量。

PIDs: 容器创建的进程或线程数。

  • (2)只显示一次数据而不是持续刷新
shell
docker stats --no-stream

【例】

shell
  /workspace git:(main) docker stats --no-stream
CONTAINER ID   NAME              CPU %     MEM USAGE / LIMIT   MEM %     NET I/O       BLOCK I/O   PIDS
c393a2008839   angry_blackwell   0.07%     128.1MiB / 16GiB    0.78%     866B / 0B     0B / 0B     53
af4256a91eee   nginx_V1          0.00%     10.36MiB / 16GiB    0.06%     1.39kB / 0B   0B / 0B     9
  /workspace git:(main) docker stats --no-stream
CONTAINER ID   NAME              CPU %     MEM USAGE / LIMIT   MEM %     NET I/O       BLOCK I/O   PIDS
c393a2008839   angry_blackwell   0.07%     128.2MiB / 16GiB    0.78%     866B / 0B     0B / 0B     53
af4256a91eee   nginx_V1          0.00%     10.36MiB / 16GiB    0.06%     1.39kB / 0B   0B / 0B     9

2. docker inspect

2.1 基本命令

docker inspect 命令用于获取 Docker 对象(容器、镜像、卷、网络等)的详细信息。它返回 JSON 格式的详细信息,可以帮助用户了解对象的配置和状态。

shell
docker inspect [OPTIONS] NAME|ID [NAME|ID...]

OPTIONS

  • -f, --format: 使用 Go 模板语法格式化输出。
  • --type: 返回指定类型的对象信息(可选类型:containerimagenetworkvolume)。

2.2 使用示例

shell
docker ps
docker inspect container_id

3. docker top

3.1 基本命令

docker top 命令用于显示指定容器中的正在运行的进程。类似于 Linux 中的 topps 命令,它帮助用户查看容器内的进程信息,便于监控和调试容器内的活动。

shell
docker top [OPTIONS] CONTAINER [ps OPTIONS]

3.2 使用示例

  • (1)查看容器内的进程
shell
docker top container_id

【例】

image-20251102194000753

  • (2)使用自定义 ps 选项
shell
docker top container_id -o pid,user

【例】

shell
  /workspace git:(main) docker top c393a2008839 -o pid,user
PID                 USER
388                 root

这将显示容器 container_id 中所有正在运行的进程,并只显示 pid 和 user 列。

4. docker top

4.1 基本命令

docker port 命令用于显示容器的端口映射信息,即容器内部的端口如何映射到宿主机的端口。

shell
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
  • CONTAINER: 要查询端口映射的容器的名称或 ID。
  • PRIVATE_PORT (可选): 容器内部的端口号。
  • PROTO (可选): 协议类型(tcpudp),默认是 tcp

4.2 使用示例

  • (1)查看容器的所有端口映射
bash
docker port container_id # 查看容器端口映射

【例】

image-20251102194413342

四、容器日志与调试

1. 基本命令

docker logs 命令用于获取和查看容器的日志输出。

shell
docker logs [OPTIONS] CONTAINER

OPTIONS

  • -f, --follow: 跟随日志输出(类似于 tail -f)。
  • --since: 从指定时间开始显示日志。
  • -t, --timestamps: 显示日志时间戳。
  • --tail: 仅显示日志的最后部分,例如 --tail 10 显示最后 10 行。
  • --details: 显示提供给日志的额外详细信息。
  • --until: 显示直到指定时间的日志。

2. 使用示例

bash
docker logs <container_id> # 查看容器日志
docker logs -f <container_id> # 实时查看最新日志
docker logs --tail 100 <container_id> # 查看最近 100 行日志
docker logs -t <container_id> # 显示时间戳

五、可视化监控工具

1. 简介

docker 也有一些可视化的监控工具,比如:

  • Portainer:简单、直观的 Docker 管理 Web 面板
  • cAdvisor:实时采集容器资源消耗,Google 开发
  • Prometheus+Grafana:企业级监控与可视化

2. Portainer 简介

2.1 简介

官网的描述就很简单:简单、直观的 Docker 管理界面,让容器编排更轻松。

Portainer 是一个轻量级的 Docker 管理工具,提供了直观的 Web 界面来管理 Docker 环境。它提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm 集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。

官网:Portainer - Docker 可视化管理面板

2.2 主要功能

仪表盘概览 查看环境整体状态
监控资源使用情况
查看事件日志
容器管理 创建、启动、停止、删除容器
查看容器日志和统计信息
进入容器终端
修改容器配置
镜像管理 拉取和删除镜像
构建新镜像
推送镜像到仓库
网络管理 创建和管理 Docker 网络
配置容器网络连接
数据卷管理 创建和删除数据卷
管理数据卷权限

3. 安装 Portainer

这里我们还是在 CNB 默认云原生开发环境进行,安装工具部分其实看官网就行:

bash
# 创建 Portainer 数据卷
docker volume create portainer_data

# 运行 Portainer 容器
docker run -d -p 9000:9000 \
    --name portainer \
    --restart=always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v portainer_data:/data \
    portainer/portainer-ce:2.29.2

注意:/var/run/docker.sock 这个文件一般不要暴露到公网(就是不要让公网可以访问到这个文件),除非是有一个完全安全的环境。

安装完成后,在 cnb 上我们可以通过添加一个 9000 的端口映射来实现外网访问, 可以按照如下步骤来配置。

image-20251102195732132

3. 使用 Portainer

3.1 创建用户

刚才我们在宿主机运行起来 portainer 容器后,我们就可以访问http://localhost:9000/,进来后会首先需要创建一个用户,输入密码然后创建即可:

image-20251102200010541

创建完毕后就会来到主界面了:

image-20251102200021470

3.2 查看宿主机容器

我们点击【home】会看到如下界面:

image-20251102200252800

然后进入这个local,从这里就可以看到我们宿主机上有多少个容器,多少个镜像,以及数据卷等信息:

image-20251102200327288

3.3 容器状态

我们在这里就可以看到容器的状态:

image-20251102200638060

莫道桑榆晚 为霞尚满天.