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 usess -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
容器里没有 curlcommand not found装 curl/wget,或换带工具的镜像调试

小结

运维三件套:stats 盯资源、system df 看磁盘、prune 定期清垃圾(-a 与 volume prune 务必先确认);再背熟速查表里的退出码与典型报错,绝大多数线上问题都能在几分钟内定位。

笔记加载中…