文章目录
- Docker:监控及日志
-
- [Docker 监控](#Docker 监控)
-
- [Docker 自带的监控命令](#Docker 自带的监控命令)
-
- [`docker ps` - 查看容器状态](#
docker ps- 查看容器状态) - [`docker top` - 查看容器内部进程](#
docker top- 查看容器内部进程) - [`docker stats` - 实时性能监控](#
docker stats- 实时性能监控)
- [`docker ps` - 查看容器状态](#
- 高级监控工具:cAdvisor
-
- [安装和运行 cAdvisor](#安装和运行 cAdvisor)
- [使用 cAdvisor](#使用 cAdvisor)
- [Docker 日志管理](#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
-
访问Web界面:
-
浏览器打开:
http://你的服务器IP:8080首次打开比较慢,系统需要收集数据并绘制图表
-
-
查看的内容:
- 所有容器的实时状态
- 每个容器的历史图表(CPU、内存、网络)
- 容器内部文件系统使用情况
- 事件日志
-
监控指标:
- 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 # 进入容器