17.docker:监控及日志

文章目录

Docker:监控及日志

Docker 监控

Docker 自带的监控命令

docker ps - 查看容器状态

这是最基础的监控命令,就像看"谁在运行"一样简单。

bash 复制代码
# 查看正在运行的容器
docker ps

# 查看所有容器(包括停止的)
docker ps -a

# 查看最近创建的容器
docker ps -l

# 显示更多信息(包括端口映射)
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"

# 只看容器的ID
docker ps -q

docker top - 查看容器内部进程

想知道容器里面在运行什么程序?用它!

bash 复制代码
# 查看容器内部的进程
docker top <容器名或ID>

# 示例
docker top my-web-app
# 输出类似:
# UID    PID    PPID   C   STIME   TTY   TIME       CMD
# root   1234   5678   0   10:30   ?     00:00:00   nginx: master process

命令后面还可以跟上 Linux 操作系统 ps 命令的参数显示特定的信息,比如 -au

为什么有用

  • 容器卡死了?看看是不是某个进程占用了100% CPU
  • 内存泄漏?看看哪个进程内存一直在涨

docker stats - 实时性能监控

这是 Docker 自带的"性能监视器",可以实时看 CPU、内存、网络等使用情况。

bash 复制代码
# 查看所有运行中容器的实时状态
docker stats

# 只看特定容器
docker stats nginx-container mysql-container

# 不显示历史数据,只显示当前
docker stats --no-stream

# 格式化输出
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

输出解释

复制代码
CONTAINER   CPU %     MEM USAGE / LIMIT     MEM %     NET I/O       BLOCK I/O
nginx       0.50%     50MiB / 2GiB          2.45%     1.2kB/3.4kB   0B/0B
mysql       5.20%     300MiB / 2GiB         14.65%    2.1kB/5.6kB   0B/0B

参数说明

  • CPU %:CPU使用百分比
  • MEM USAGE / LIMIT:已用内存 / 内存限制
  • NET I/O:网络输入/输出
  • BLOCK I/O:磁盘读写

常用快捷键

  • Ctrl+C 退出实时监控
  • 默认每1秒刷新一次

高级监控工具:cAdvisor

cAdvisor(Container Advisor)是 Google 开发的容器监控工具,比 docker stats 更强大!

主要特点

  • 监控容器资源使用情况(CPU、内存、网络、文件系统)
  • 提供Web界面,可视化查看
  • 支持历史数据
  • 完全免费开源
安装和运行 cAdvisor
bash 复制代码
# 最简单的方式:用Docker运行cAdvisor
[root@docker ~]# docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest
69790e1682db28d0e8d775dcc459d8de5545e2601d01de7ba8c5f5cf24ecf732
使用 cAdvisor
  1. 访问Web界面

    • 浏览器打开:http://你的服务器IP:8080

      首次打开比较慢,系统需要收集数据并绘制图表

  2. 查看的内容

    • 所有容器的实时状态
    • 每个容器的历史图表(CPU、内存、网络)
    • 容器内部文件系统使用情况
    • 事件日志
  3. 监控指标

    • CPU:使用率、负载
    • 内存:使用量、缓存、交换空间
    • 磁盘:IOPS、读写速度
    • 网络:带宽、包数量

总结:

  • 缺点:操作界面略显简陋,而且需要在不同页面之间跳转,并且只能监控一个 host。
  • 优点:可以将监控到的数据导出给第三方工具,由这些工具进一步加工处理。

结论:我们把 cAdvisor 定位为一个监控数据收集器,并导出数据给第三方工具,而非展示数据。

小提示:cAdvisor 适合单机监控,如果是多台服务器,建议用 Prometheus + Grafana。


Docker 日志管理

高效的监控和日志管理对保持生产系统持续稳定地运行以及排查问题至关重要。

docker logs - 查看容器日志

基础用法
bash 复制代码
# 查看容器日志
docker logs <容器名或ID>

# 示例
docker logs my-web-server

# 跟踪实时日志(类似 tail -f)
docker logs -f <容器名>

# 查看最后N行
docker logs --tail 100 <容器名>  # 最后100行

# 查看特定时间之后的日志
docker logs --since 2023-10-01 <容器名>
docker logs --since 1h <容器名>   # 最近1小时

# 查看时间戳
docker logs -t <容器名>

# 组合使用
docker logs -f -t --tail 50 <容器名>

docker logs 能够打印出自容器启动以来完整的日志,并且 -f 参数可以继续打印出新产生的日志,效果上与 Linux 命令 tail -f 一样。

日志驱动

Docker 支持多种日志存储方式:

bash 复制代码
# 查看容器的日志驱动
docker inspect <容器名> --format='{{.HostConfig.LogConfig.Type}}'

# 运行容器时指定日志驱动
docker run \
  --log-driver json-file \      # 默认,存为JSON文件
  --log-opt max-size=10m \      # 每个日志文件最大10MB
  --log-opt max-file=3 \        # 保留3个日志文件
  nginx:latest

常用日志驱动

  • json-file:默认,JSON格式文件
  • syslog:发送到系统日志
  • journald:systemd日志
  • none:不记录日志

实际应用场景

场景1:Web服务器出错排查
bash 复制代码
# 1. 查看容器是否运行
docker ps | grep nginx

# 2. 如果容器异常退出,查看最后100行日志
docker logs --tail 100 nginx-container

# 3. 实时监控日志
docker logs -f nginx-container

# 4. 配合grep过滤错误
docker logs nginx-container | grep -i error
docker logs nginx-container | grep "404"
场景2:监控容器性能
bash 复制代码
# 方案1:简单监控
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

# 方案2:定期检查并记录
while true; do
    docker stats --no-stream >> /tmp/container-stats.log
    sleep 60  # 每60秒记录一次
done

# 方案3:使用cAdvisor长期监控
# 访问 http://localhost:8080 查看图表
场景3:日志轮转和清理
bash 复制代码
# 查看日志文件大小
du -sh /var/lib/docker/containers/*/*-json.log

# 清理所有容器的日志(谨慎使用!)
truncate -s 0 /var/lib/docker/containers/*/*-json.log

# 更好的方式:运行时限制日志大小
docker run -d \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  nginx:latest

常用故障排查流程

复制代码
1. docker ps                     # 容器在运行吗?
2. docker logs --tail 50 <容器>  # 最近有什么错误?
3. docker stats <容器>           # 资源使用正常吗?
4. docker top <容器>             # 进程状态如何?
5. docker exec -it <容器> bash   # 进入容器内部检查

命令总结

bash 复制代码
# 监控
docker ps                    # 查看容器
docker top <容器>           # 查看进程
docker stats                # 实时监控
docker stats --no-stream    # 单次查看

# 日志
docker logs <容器>          # 查看日志
docker logs -f <容器>       # 实时日志
docker logs --tail 100      # 最后100行
docker logs --since 1h      # 最近1小时

# 高级
docker inspect <容器>       # 查看详细信息
docker exec -it <容器> bash # 进入容器
相关推荐
一颗青果2 小时前
Linux下的线程
linux·运维·服务器
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [fs]fs_context
linux·笔记·学习
_OP_CHEN2 小时前
【Linux系统编程】(十八)Linux 进程创建与终止进阶:等待机制与程序替换的底层密码
linux·服务器·操作系统·进程·进程等待·进程替换·exec函数族
未来之窗软件服务2 小时前
服务器运维(二十)服务器防护双雄:Fail2ban 与 CrowdSec 入门指南——东方仙盟炼气期
运维·服务器·东方仙盟
FreeBuf_2 小时前
n8n工作流自动化平台曝高危漏洞(CVE-2025-68613,CVSS 9.9):数万实例面临任意代码执行风险
运维·自动化
姚青&2 小时前
1、Linux 系统与 Shell 环境准备
linux·运维·服务器
Vin0sen2 小时前
无响应的状态码分析
linux
运维小斌2 小时前
ubuntu22.04.5配置ip并使用远程工具连接
linux·运维·网络·ubuntu
爬山算法2 小时前
Netty(29)如何实现基于Netty的长连接和推送通知?
运维·服务器·网络