阿猫的博客

阿猫的博客

Docker 服务器磁盘满排查思路

113
2025-11-11

最近博客频繁出现不可访问的问题,但因为最近没怎么在写文章,所以倒没怎么管,直到收到博友圈发来的邮件:

登上去一看,发现服务器的磁盘居然满了(之前出现过内存满的情况,重启一下 Halo 的服务就能解决)。因为这台机器上都是用 Docker/Docker Compose 启动的服务,所以自然只需要去考虑 Docker 的问题。

当然,在这之前也是先用 df -h 看了一下,全都指向 /var/lib/docker/overlay2/xxxoverlay 这样的东西,所以能确定是 Docker 的问题。如果占用大的在其他目录,那就稍微复杂一点,可以用 du -h --max-depth=1 一点点去排查。

overlay          79G   57G   20G  75% /var/lib/docker/overlay2/89ed74e70d3e59b7c5de6e53522eece539a74e013c9c03c76fc7ac4d73045ed7/merged

其实到这里我就懵逼了,这些服务都没什么会落盘的,不应该一下产生很大的数据才是,所以找了 AI 帮忙,它建议我先运行:

docker system df -v

这里提醒了我两个问题,一个是我有很多镜像没有清理,二是有些卷没有清理,于是先执行了下面两条命令,先释放一点空间。这两条命令都只会清除没有使用的镜像和卷,所以是比较安全的。这一步清理掉了几个 G,但是磁盘还是很满。

docker image prune -a
docker volume prune

于是让 AI 帮忙写了个脚本,查一下到底是哪个容器的卷占用空间大:

echo "VOLUME_NAME                              SIZE       CONTAINER(S)" && docker volume ls -q | while read vol; do size=$(docker volume inspect $vol --format '{{.Mountpoint}}' | xargs du -sh 2>/dev/null | cut -f1); containers=$(docker ps -a --filter volume=$vol --format '{{.Names}}' | tr '\n' ',' | sed 's/,$//'); [ -z "$containers" ] && containers="<unused>"; printf "%-40s %-10s %s\n" "$vol" "$size" "$containers"; done

最终找出来是 Halo 的容器。AI 建议我先考虑是容器日志的问题,用下面一条命令发现确实,于是又重启了一下容器,果然空间就被释放了。

find /var/lib/docker/containers/ -name "*.log" -exec ls -lh {} \; | sort -k5 -hr | head -10

但是这个方法治标不治本,它还顺便给我提出了限制日志大小的方法:

Docker

# 启动时添加日志选项
docker run -d \
  --log-opt max-size=100m \
  --log-opt max-file=3 \
  [其他原有参数...]

Docker Compose

version: '3'
services:
  your-service:
    image: your-image
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "3"

全局设置(针对所有新容器生效)

# 编辑 /etc/docker/daemon.json
cat > /etc/docker/daemon.json <<EOF
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  }
}
EOF

# 重启 Docker
systemctl restart docker

至此,这次磁盘爆满的问题就解决了。

番外

因为 Halo 老是出现 OOM,所以其实这次日志把磁盘写爆是因为 Halo 的问题。一看有一个新版本 Release,说是解决了潜在的内存泄漏问题,更新完好像就再没出现 OOM 的问题了。

我在关于页面里说过,选择 Halo 是因为它丰富的插件生态,完善的主题,还可以的性能,以及部署和发布的便利,现在我倒有了一些微词:

  • 专业版发布之后,不能再付费购买插件,必须购买专业版(现在也不能买断了,只能订阅)
  • 性能方面真的一塌糊涂,Java 的技术栈导致一个博客就吃掉了 0.5 G 的内存(之前有问题的时候甚至飙到了 1G+),这对内存寸土寸金的服务器来说简直是噩梦
  • 版本发布后经常有严重的恶性 bug,这完全不像是一个开源转商业项目该有的稳定性
  • 很多插件经常一连几个月都不维护,一般主程序改了点什么才会顺带维护一下;新出的插件也不怎么感兴趣,有点花里胡哨的

最近也看了不少设计优秀的独立博客,自由度高很多,也更方便发挥,更多东西可以折腾,再做一个自己的博客的念头也慢慢浮现,也许呢。