You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何识别占用VM资源的rogue Docker容器?求监控记录状态方案

识别内存耗尽的Docker容器及崩溃前状态记录方案

一、先阻止单个容器耗尽VM内存

  • 给所有容器设置内存上限:使用docker run时添加--memory <数值>(例如--memory 2g),或在docker-compose.yml中配置mem_limit: 2g。这样单个容器最多占用指定内存,不会吃光VM的RAM,保留登录排查的操作空间。

二、识别 rogue 容器的方法

  • 持续监控容器资源使用:
    1. 后台运行脚本记录docker stats输出:
      nohup sh -c 'while true; do docker stats --no-stream --format "table {{.Name}}\t{{.MemUsage}}\t{{.CPUPerc}}\t{{.PIDs}}" >> /var/log/docker_stats.log; sleep 10; done' &
      
      该脚本每隔10秒将所有容器的内存、CPU、进程数信息追加到日志文件,VM崩溃后只要磁盘正常,就能从日志中找到内存持续飙升的容器。
    2. 查看Docker默认持久化日志:宿主机/var/lib/docker/containers/<容器ID>/<容器ID>-json.log是容器的日志存储目录,即使容器重启,这些文件也不会丢失,直接查看可疑容器的日志即可,无需进入容器。

三、自定义镜像记录崩溃前状态

你可以自行构建轻量监控镜像,定期抓取Docker状态并写入宿主机文件:

1. 编写监控脚本(monitor.sh)

#!/bin/sh
# 宿主机挂载的日志目录,需提前创建
HOST_LOG_DIR="/host/docker-monitor-logs"
mkdir -p "$HOST_LOG_DIR"

while true; do
  # 生成带时间戳的日志片段,避免单文件过大
  TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
  LOG_FILE="$HOST_LOG_DIR/container_stats_$TIMESTAMP.log"
  
  # 写入容器状态,包含名称、内存使用、CPU占比、PID
  docker stats --no-stream --format "{{.Name}}\t{{.MemUsage}}\t{{.CPUPerc}}\t{{.PIDs}}" > "$LOG_FILE"
  
  # 可选:当容器内存超过阈值时,额外记录进程详情
  for container in $(docker ps --format "{{.Names}}"); do
    mem_usage=$(docker stats --no-stream --format "{{.MemUsage}}" "$container" | awk '{print $1}')
    # 示例:判断内存是否超过1.5G(单位可根据实际调整)
    if echo "$mem_usage" | grep -q "G" && [ $(echo "$mem_usage" | sed 's/G//') -gt 1.5 ]; then
      docker top "$container" >> "$HOST_LOG_DIR/container_top_${container}_$TIMESTAMP.log"
    fi
  done

  sleep 5
done

2. 编写Dockerfile

FROM alpine:latest
# 安装Docker客户端,用于调用docker命令
RUN apk add --no-cache docker-cli
COPY monitor.sh /usr/local/bin/monitor.sh
RUN chmod +x /usr/local/bin/monitor.sh
CMD ["monitor.sh"]

3. 构建并运行镜像

# 构建镜像
docker build -t docker-monitor .

# 运行容器,挂载Docker套接字(用于访问Docker API)和宿主机日志目录
docker run -d \
  --name docker-monitor \
  --restart always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /opt/docker-monitor-logs:/host/docker-monitor-logs \
  docker-monitor

监控容器会持续将状态写入宿主机的/opt/docker-monitor-logs目录,即使VM崩溃,重启后也能查看崩溃前的最后几轮记录,快速定位内存飙升的容器。

内容的提问来源于stack exchange,提问作者bpoepen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:22:45