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

莫道桑榆晚 为霞尚满天.