Docker镜像瘦身节省住宅主机硬盘空间

Docker镜像瘦身可以通过清理无用的镜像和容器、选择更小的基础镜像、使用多阶段构建等方式有效释放住宅主机的硬盘空间。
本文适合在低配置家庭服务器上跑Docker的用户,按步骤操作后可减少数GB甚至数十GB的占用。

先看看你的Docker占了多大空间

在执行任何清理前,先用命令确认当前磁盘占用情况。
登录SSH或宝塔终端,运行:

docker system df

输出会显示镜像、容器、数据卷和构建缓存的总大小。
重点看 ImagesBuild Cache 两列,它们通常是空间大户。
如果Images超过几GB,说明有必要做瘦身了。

如果你希望看到更直观的镜像列表(按大小排序):

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

清理无用的镜像、容器和缓存

住宅主机上最容易堆积的是悬空镜像(无标签的中间层镜像)和已停止的容器。
运行以下命令安全清理:

删除所有未使用的对象

docker system prune -a --volumes

这个命令会删除所有停止的容器、未被任何容器使用的网络、悬空镜像,以及所有未被使用的镜像(包括带标签但无容器引用的)。
加上 -a 标志会清理得更彻底。--volumes 会一并清理未被使用的数据卷,请确认没有重要数据后执行。

单独清理悬空镜像

如果你只想删除无标签的中间层:

docker image prune -f

清理构建缓存

Docker构建镜像时会缓存中间层,有时缓存会占用几GB。
在确认当前不需要重新构建后,可以清空:

docker builder prune -a -f

执行完上述步骤后,再用 docker system df 查看效果。
通常能释放30%-50%的硬盘空间。

构建更小的镜像:从源头减少体积

如果日常是自己构建镜像,可以从以下角度入手:

选择更小的基础镜像

  • 替代 ubuntu:latest(约188MB) → 用 alpine:latest(约5MB)或 debian:stable-slim(约80MB)
  • 对于Python应用,用 python:3.12-alpine 代替 python:3.12,体积从900MB降到约50MB

使用多阶段构建

在Dockerfile中定义多个FROM阶段,只把最终产物复制到最后一个阶段。
例如Go应用:

FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o app .

FROM alpine:latest
COPY --from=builder /app/app /app
CMD ["/app"]

这样最终镜像只包含编译好的二进制文件,不含Go编译器和依赖库,大小从几百MB降到几十MB。

合并RUN命令,删除临时文件

一个常见的减量技巧是:在同一个RUN层里先安装软件包、再删除包缓存,避免缓存层留到最终镜像。
例如:

RUN apt-get update \
    && apt-get install -y --no-install-recommends some-package \
    && rm -rf /var/lib/apt/lists/*

日常维护与避坑建议

  • 定期执行 docker system df 监控空间:建议每周一次,若发现Images或Build Cache异常增大,及时清理。
  • 拉取新镜像前检查大小:用 docker pull 前可以在Docker Hub或阿里云镜像仓库查看镜像大小,避免无意识下载巨型镜像。
  • 谨慎对待 --volumes 参数:数据卷中可能存有数据库或配置文件,硬删除后不可恢复。建议先 docker volume ls 查看正在使用的卷,如果不需要就手动删除 docker volume rm <卷名>
  • 启动容器时限制日志大小:容器日志也占空间。启动时加入参数 --log-opt max-size=10m --log-opt max-file=3,防止日志爆满。

常见问题解答

1. Docker磁盘空间被谁占了?

执行 docker system df 查看具体分布。
Images通常占大头,其次是Build Cache和容器层。

2. 如何一键清理所有未使用的镜像?

使用 docker system prune -a(不含卷)或 docker image prune -a
注意这会删除所有不被任何容器使用的镜像,包括带标签但无运行的。

3. 多阶段构建真的能减少镜像体积吗?

能,而且效果显著。
例如一个Go程序从1.2GB降到15MB。
多阶段构建只把最终产物发给生产环境,排除编译器和中间文件。

4. 住宅主机每天跑容器,怎么维持空间稳定?

设置cron任务每天凌晨执行 docker system prune -f(只清理已停止的容器和悬空镜像),再配合 docker builder prune -f 每三天清理一次构建缓存。
同时限制容器日志大小。

分享到:
上一篇
日志自动清理脚本避免磁盘占满服务器宕机
下一篇
Traefik反向代理统一容器多站点入口教程
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意