Docker 监控清理与常见问题
容器跑起来只是开始,日常巡检要看资源占用、清磁盘垃圾,出了问题还要能快速定位。本章给出监控清理三板斧和一份高频问题速查表。
docker stats 实时监控
docker stats 实时显示容器 CPU、内存占用,是判断「谁在吃资源」的第一工具:
docker stats --no-stream # 一次性快照
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" # 自定义列
docker system df 与 events
df 统计镜像、容器、数据卷、构建缓存占用的磁盘;events 输出容器生命周期事件流,排查「容器什么时候被谁动过」:
docker system df
# 输出:TYPE TOTAL ACTIVE SIZE RECLAIMABLE
# Images 12 4 2.5GB 1.2GB
docker system events --since 1h --filter type=container
docker system prune 清理
prune 一键回收停止的容器、悬空镜像、无用网络与构建缓存:
docker system prune # 只清悬空资源
docker system prune -a # 连未被容器引用的镜像也一起删
docker volume prune # 删除未被使用的数据卷
注意:prune 默认不碰数据卷;-a 会删掉「当前没在跑」的镜像(以后可能还要用),卷必须 docker volume prune 单独清——动手前先 docker ps -a、docker volume ls 确认,重要数据卷宁可留着。
常见问题速查表
| 现象 | 表现/退出码 | 排查与解决 |
|---|---|---|
| 端口被占用 | Error ... address already in use | ss -tlnp 找占用进程,换映射端口或停掉对方 |
| 容器反复秒退 | 退出码 137 | 多为内存超限被 OOM 杀掉,调大 -m 或减小应用内存 |
| 前台 Ctrl+C 退出 | 退出码 130 | 收到 SIGINT,属正常中断而非故障 |
| 启动即失败 | 退出码 127 | 命令不存在:检查 CMD 路径、脚本是否可执行 |
| exec 进不去 | exec: "bash": not found | 精简镜像没有 bash,改用 docker exec -it 容器名 sh |
| ENTRYPOINT 不生效 | 启动参数对不上 | 显式指定 docker run --entrypoint 或改 Dockerfile |
| 挂载文件权限异常 | 容器内读/写被拒 | 文件属主与容器 uid 不符,chown 到容器用户(如 1000) |
| 容器内时间不对 | date 显示 UTC | 挂载 /etc/localtime 只读或设环境变量 TZ=Asia/Shanghai |
| 中文乱码 | 输出变问号 | 安装 locales 并设置 LANG=C.UTF-8 |
| 容器里没有 curl | command not found | 装 curl/wget,或换带工具的镜像调试 |
小结
运维三件套:stats 盯资源、system df 看磁盘、prune 定期清垃圾(-a 与 volume prune 务必先确认);再背熟速查表里的退出码与典型报错,绝大多数线上问题都能在几分钟内定位。