Docker镜像瘦身节省住宅硬盘
很多朋友在住宅服务器或NAS上跑Docker,用着用着发现硬盘越来越少。
Docker镜像、容器日志和卷会悄悄吃掉几十GB空间,对家用小硬盘来说很心疼。
本文面向零基础用户,按步骤帮你给Docker“减肥”,释放可用空间。
清理前先看看是哪占了空间
打开终端执行以下命令,可以快速了解当前Docker占用的磁盘情况:
docker system df
输出会显示镜像、容器、卷、构建缓存各自的空间。
如果镜像那行占用很大,说明是你的瘦身重点。
截图或记下数据,方便后面对比效果。
分步操作:五步释放硬盘
第一步:一键清理未使用的Docker对象
这个命令会删除所有停止的容器、没被使用的镜像(包括 dangling 镜像和未打标签的层)、未被使用的网络,以及所有未被使用的卷(谨慎)。
docker system prune -a --volumes
注意:后面加上-a会删除所有没有容器使用的镜像,包括那些可能以后用到的。如果你不想删得太狠,可以先只执行docker system prune(只清理 dangling 镜像)。
第二步:手动清理大型镜像和临时层
查看当前所有镜像及其大小:
docker image ls --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
如果发现某个镜像很大(比如上G),且不再使用,可以用 docker image rm 镜像名:标签 删除。
如果你自己构建镜像,建议改用 Alpine 版基础镜像,比如 node:alpine 代替 node:latest,体积能小一半。
第三步:优化Dockerfile,减少层数
如果你自己写 Dockerfile,用多阶段构建可以显著减小最终镜像体积。
例如:
FROM node:alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
这样最终镜像只保留编译后的产物,不包含 node_modules 和源码。
第四步:设置容器日志大小限制
容器日志常被忽略,却能塞满 /var/lib/docker。
运行容器时加上 --log-opt max-size=10m --log-opt max-file=3,限制单个日志文件10MB,最多保留3个文件。
如果已有容器占用空间,可以配合清理命令:
sudo journalctl --vacuum-size=200M # 清理系统日志
第五步:定期自动清理脚本
创建脚本 /usr/local/bin/docker-clean.sh:
#!/bin/bash
# 保留最近7天的镜像,删除更老的未使用镜像
docker image prune -a --force --filter "until=168h"
# 清理所有未使用的卷
docker volume prune -f
给执行权限并加入 crontab:
crontab -e
0 3 * * 0 /usr/local/bin/docker-clean.sh
每周日凌晨3点自动执行。
避坑指南
- 不要删除正在使用的镜像:删除前先用
docker ps查看运行中的容器是否依赖该镜像。 - 谨慎使用
--volumes:如果卷里存放了数据库或重要数据,加--volumes会一并删除。建议先备份或单独处理。 - 多阶段构建的常见错误:最后阶段只复制了部分文件,可能导致运行时缺少依赖。测试时可以用
docker run --rm 你的镜像启动检查。
效果验证
再次运行 docker system df,对比之前的数值。
通常一次清理后能释放几十GB。
另外可以用 du -sh /var/lib/docker/ 查看 Docker 数据目录整体大小。
如果清理后某个容器启动失败,多半是镜像被误删了,重新拉取或构建即可。
高频问题解答
Q:docker system prune -a 删除了所有镜像怎么办?
A:重新拉取需要镜像:docker pull 镜像名:标签。如果拉取很慢,建议换国内镜像加速器。
Q:如何保留特定镜像不被清理?
A:给镜像打标签或者运行一个依赖于它的容器,之后 prune 就不会删除它。
Q:住宅服务器硬盘很小,还有更多释放空间的方法吗?
A:检查 /var/lib/docker/containers/ 下的日志,手动 truncate 大文件。也可以定期重启容器(不会影响新日志)。
如果你正在处理Docker镜像瘦身节省住宅硬盘,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。