Ubuntu 磁盘空间清理实战:从 Docker 到 VirtualBox 的完整指南

1. 引言

服务器或开发机运行久了,磁盘空间总会被各种缓存、日志、旧版本软件悄悄占满。尤其是 Docker 环境,/var/lib/docker 动辄占用几百 GB,让人头疼不已。

本文整理了一套从基础到进阶的 Ubuntu 磁盘清理方案,涵盖系统缓存、日志、Snap 旧版本、Docker 镜像与构建缓存,以及 VirtualBox 虚拟机磁盘回收,帮你一步步把空间找回来。

2. 基础清理:系统缓存与日志

在动 Docker 之前,先清理系统层面的垃圾,这些操作简单且安全。

2.1 清理 apt 缓存

sudo apt clean
sudo apt autoremove --purge -y
  • apt clean:删除下载的 .deb 安装包缓存。
  • apt autoremove --purge:移除不再需要的依赖包,并同时删除其配置文件。

2.2 清理系统日志

# 将日志总大小限制为 20MB
sudo journalctl --vacuum-size=20M

# 只保留最近 3 天的日志
sudo journalctl --vacuum-time=3d

2.3 删除临时文件

sudo rm -rf /tmp/*
sudo rm -rf /var/tmp/*

2.4 清理应用日志(以 MySQL 为例)

# 删除 MySQL 日志文件,但保留 mysql 文件夹本身
sudo find /var/log/mysql -type f -name "*.log" -delete

2.5 查找大文件与大目录

# 查看占用空间最大的 30 个目录
sudo du -xh / 2>/dev/null | sort -h | tail -30

# 查找大于 100MB 的文件
sudo find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null

确认没用的缓存、旧内核、下载文件、回收站等,可以一并删除。

3. 清理 Snap 旧版本

Snap 会自动保留每个应用软件的多个旧版本,这是占用空间的主要原因。应该清理这些旧版本,而不是删除整个目录。

3.1 查看所有已安装的 Snap 及版本

snap list --all

3.2 手动删除特定软件的旧版本

先找到状态为 disabled 的旧版本,然后使用以下命令删除(将 <package-name><revision> 替换为实际值):

sudo snap remove <package-name> --revision=<revision>

3.3 使用脚本一键清理

运行以下脚本,它会自动找出并删除所有旧版本的 Snap:

#!/bin/bash
set -eu
snap list --all | awk '/disabled/{print $1, $3}' |
    while read snapname revision; do
        sudo snap remove "$snapname" --revision="$revision"
    done

也可以使用 snap clean 这类社区维护的自动化脚本。

4. Docker 空间清理(保留 Docker 环境)

如果你以后还想用 Docker,只是要把堆积的镜像、缓存和临时文件删掉,请按以下步骤操作。

4.1 查看空间占用情况

docker system df

这会显示镜像、容器、卷和构建缓存分别占了多少。想看更详细的空间分布,可以用:

docker system df -v

4.2 一键深度清理

# -a:删除所有未使用的镜像;-f:强制确认;--volumes:删除未使用的卷
docker system prune -a -f --volumes

⚠️ 警告--volumes 会删除所有未被容器使用的数据卷。如果你的数据库(如 MySQL)数据存放在 Docker 卷中且当前没有容器在使用它,数据会永久丢失。如果你不确定,先去掉 --volumes,只运行 docker system prune -a -f,这样只会删镜像和缓存,最安全。

4.3 手动清理构建缓存

如果上面的命令释放得不够多,单独清理构建缓存通常能放出几十 GB:

docker builder prune -a -f

4.4 查看镜像数量与大小

统计镜像总数量:

docker images -q | wc -l

查看详细列表(含大小、标签):

docker images
# 或者
docker image ls

输出示例:

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       22.04     abc123def456   2 days ago    77.8MB
nginx        latest    123abc456def   1 week ago    142MB

按大小排序,找出最大的镜像:

docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" | sort -k 3 -h

查看镜像总数 + 占用总空间:

docker system df

输出示例:

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          15        3         2.345GB   1.8GB (77%)
Containers      5         2         100MB     50MB (50%)
Local Volumes   2         1         1.2GB     0B (0%)
Build Cache     10        0         500MB     500MB (100%)

只看悬空镜像(<none>)的数量:

docker images -f "dangling=true" -q | wc -l

4.5 结合场景的清理策略

如果 /var/lib/docker 占了 439GB,可以先跑 docker system df 确认其中 Images 占了多少、Build Cache 占了多少。

  • 如果 Images 数量非常多(比如几百个),说明是旧版本堆积的问题,直接跑以下命令一键删除 7 天前的旧版本:
docker image prune -a -f --filter "until=168h"
  • 执行完后,再用 docker images -q | wc -l 对比清理前后的数量,就能直观看到效果。

5. Docker 深度清理:从日志到完全重置

5.1 清理容器日志(隐藏的百G杀手)

很多时候,438G 里有一大半是容器内部产生的标准输出日志,它们堆积在 /var/lib/docker/containers/ 下。这个操作不需要 Docker 命令,且几乎不会有风险。

# 一键清空所有容器的日志文件(保留文件,清空内容)
sudo find /var/lib/docker/containers -name "*-json.log" -exec truncate -s 0 {} \;

执行完这一步后,请立即运行 df -h /var/lib/docker 查看。如果空间释放了 100G 以上,说明找到了主要元凶。

5.2 精准诊断剩余占用

接下来查看 Docker 内部到底是谁在吃空间(此时磁盘已有余量,命令可以跑完):

docker system df

如果输出显示 Images(镜像)和 Build Cache(构建缓存)占了大头,继续往下执行。

5.3 分层清理(按释放力度排序)

第 1 步:清理构建缓存(最安全,常常超大)

如果你经常用 docker build,缓存很容易堆积到几十甚至上百 G:

docker builder prune -a -f

第 2 步:清理 7 天前的旧镜像(保留近期版本)

docker image prune -a -f --filter "until=168h"

168h 即 7 天,可改为 720h 即 30 天)

第 3 步:终极清理(删除所有未使用的资源)

如果上面两步释放得不够,且你确定没有重要数据,执行:

docker system prune -a -f --volumes

⚠️ 警告--volumes 会删除所有未被容器使用的数据卷。如果你的数据库数据放在卷里且容器已停止,数据会永久丢失。

5.4 核弹级清空(完全重置 Docker)

如果你这台机器打算彻底不再用 Docker,或者想推倒重来,直接物理删除是最快的:

sudo systemctl stop docker
sudo rm -rf /var/lib/docker
sudo systemctl start docker

执行后相当于新装 Docker,所有镜像、容器、网络全部归零。

6. VirtualBox 宿主机回收空间

这是最关键的一步!无论你在虚拟机里删了多少文件,宿主机的 .vdi 文件不会自动缩小。为了让宿主机真正腾出几百 G 空间,务必执行以下操作。

6.1 在 Ubuntu 内把空闲空间填 0

利用刚腾出来的大空位:

# 报错磁盘满后,删除它
sudo dd if=/dev/zero of=/var/lib/deleteme
sudo rm -f /var/lib/deleteme

6.2 关闭虚拟机

sudo shutdown now -h

6.3 在宿主机(Windows/macOS)命令行执行压缩

VBoxManage modifymedium disk "你的磁盘.vdi" --compact

Windows 下完整路径示例:

cd "C:\Program Files\Oracle\VirtualBox"
.\VBoxManage.exe modifymedium disk "你的Ubuntu.vdi路径" --compact

6.4 可选:TRIM 支持

如果虚拟机磁盘开启了 TRIM 支持,也可以执行:

sudo fstrim -v /dev/sdb2

7. 总结与操作顺序建议

步骤操作风险等级释放空间
1清容器日志(truncate)可能 100G+
2清构建缓存(builder prune)几十 G
3清 7 天前镜像(image prune --filter)视镜像数量
4system prune -a 或 rm -rf全部
5VirtualBox .vdi 压缩宿主机空间

参考:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq2108462953

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值