针对 docker system prune -a --volumes 这条命令,这是最彻底、最有效的清理手段。为了让你清晰地了解该命令对当前服务器(根分区 99% 满载)的影响,我将其补充进手册中,并作为核心操作进行详细解读。 以下是更新后的 Markdown 手册片段,你可以直接替换或追加到之前的文档中:
Docker 维护手册:核心清理篇
1. 核心清理命令详解
当根分区(/)使用率达到 99% 告警时,应优先执行以下命令进行紧急释放。
命令原型
docker system prune -a --volumes
参数深度解析
该命令是 Docker 清理的“核选项”,它会扫描整个 Docker 系统并删除所有未被使用的数据。
执行效果预判
在你的服务器上执行该命令后,预期会发生以下变化:
释放大量空间:
由于根分区 (/dev/vda1) 仅剩 1.9G,清理未使用的镜像通常会瞬间释放数 GB 甚至数十 GB 的空间。
这里的 "Unused Images" 指的是没有正在运行的容器正在使用的镜像。
保留关键数据:
正在运行的容器不会被停止或删除。
正在运行的容器所需的镜像不会被删除。
容器内正在写入的数据不受影响。
⚠️ 重要风险提示
在输入 y 确认执行前,请务必确认以下几点:
停止的容器将无法直接重启:
如果你有停止状态的容器,执行后它们会被删除。若要恢复,必须使用 docker run 重新创建。
镜像需要重新拉取:
如果你有构建好的镜像但当前没有容器在运行(例如处于停机维护状态),这些镜像会被删除。下次启动服务前需要重新 docker pull 或构建。
数据卷安全:
匿名卷:如果容器停止了,其关联的匿名卷会被删除(数据丢失)。
绑定挂载:如 -v /app/data:/data 这种映射到宿主机目录的,绝对不会被删除,非常安全。
具名卷:如果未被任何容器使用,会被删除。请确认没有存储重要数据的闲置卷。
2. 标准操作流程 (SOP)
建议按照以下步骤操作,避免误删关键业务数据。
步骤一:检查运行状态
确认哪些容器是活跃的,避免误删正在提供服务的环境。
docker ps
*记录下正在运行的容器名称/ID,确认它们是唯一的业务实例。*
步骤二:检查数据卷使用情况
查看是否存在可能被误删的重要数据卷。
docker volume ls
步骤三:执行清理
系统会列出将要删除的资源清单,并提示输入 y。
docker system prune -a --volumes
输出示例:
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all volumes not used by at least one container
- all images without at least one container associated to them
- all build cache
Are you sure you want to continue? [y/N]
仔细核对列表后,输入 y 并回车。
步骤四:验证结果
清理完成后,检查磁盘空间是否已释放。
df -h /
查看 Use% 是否下降,Avail 是否增加。
3. 常见问题与回滚
Q: 执行后服务报错找不到镜像怎么办?
A: 该命令只会删除“当前无容器使用”的镜像。如果服务正在运行,不会报错。如果报错,说明之前容器是停止状态被清理了。
解决方法:
重新拉取镜像:docker pull <镜像名>
重启服务:docker-compose up -d 或 docker run ...
Q: 重要数据卷被误删了怎么办?
A: prune 删除的数据通常无法通过简单命令恢复。
预防措施:
生产环境建议使用绑定挂载 将数据存储在 /docker_scripts 等独立分区。
或者在执行前备份重要卷:# 备份卷数据到本地tar包
docker run --rm -v <卷名>:/data -v $(pwd):/backup busybox tar cvf /backup/volume_backup.tar /data
4. 自动化清理 (可选)
如果服务器空间经常满,且确认无重要停止状态的容器/镜像,可以设置定时任务自动清理。
创建定时任务:
crontab -e
添加以下行(每周日凌晨 3 点自动清理):
0 3 * * 0 docker system prune -a --volumes -f > /var/log/docker_prune.log 2>&1
注意:-f 参数表示强制执行,不需要确认。请确保业务逻辑允许定期重置镜像。