docker compose down --rmi 是用于停止并移除服务容器、网络的同时,按需清理关联镜像的命令:--rmi local 仅删除 build 构建的本地镜像,保留远程拉取的基础镜像;--rmi all 则删除所有服务关联镜像,配合 --volumes 可彻底清除命名卷。

直接用 docker-compose down --rmi 配合定时任务和日志控制,就能把环境清理做成“自动收垃圾”的闭环。关键不是全删,而是按需、分层、可追溯地释放空间。
精准清理:用 down --rmi 区分镜像类型
镜像要不要删、删哪些,得看它从哪来、还在不在用:
-
--rmi local:只删
docker-compose build生成的本地镜像(比如你改了 Dockerfile 后构建的新版),保留从 registry 拉下来的 base 镜像(如nginx:alpine),开发调试后最安全的选择 - --rmi all:删所有被 compose 文件关联的镜像,包括拉取的和构建的——适合 CI 流水线末尾或彻底重置环境时用,但要确认没被其他服务共用
- 搭配 --volumes 才能清掉命名卷(
named volumes),否则down默认保留,数据还在磁盘里躺着
定时执行:用 crontab 做无人值守维护
别等磁盘报警才动手。根据环境定策略,写进 crontab:
- 开发机每天清理一次:
0 2 * * * cd /path/to/project && docker-compose down --rmi local --volumes 2>/dev/null - 测试环境每周清缓存:
0 3 * * 0 docker system prune -f --filter "until=168h"(只清 7 天前的悬空资源) - 生产环境慎用 full prune,建议每月跑一次
docker image prune -f --filter "dangling=true",专清无标签中间层
注意:所有定时命令加 cd 切到项目目录再执行,避免 compose 找不到 docker-compose.yml。
堵住源头:限制日志 + 优化构建
清理是补救,控量才是根本:
- 在
/etc/docker/daemon.json加日志轮转配置,防单个容器日志涨到几个 GB:{"log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"3"}}
改完记得sudo systemctl restart docker - 构建时用多阶段(multi-stage),把编译环境和运行环境分开,最终镜像不带源码、编译器、临时文件
- 避免在 Dockerfile 中反复
COPY+RUN rm,合并操作减少层数;不用docker build --squash(已弃用),改用buildx的--cache-to管理构建缓存
验证与监控:清理前后看得到效果
执行完别就不管了,用这几条命令确认是否真腾出空间:
-
docker system df -v:看镜像、容器、卷各自占多少,以及“Reclaimable”列有多少能回收 -
docker volume ls --filter "dangling=true":查孤立卷(没被任何容器引用的卷) -
docker images --filter "dangling=true":确认悬空镜像是否归零 - macOS 用户额外检查:
du -sh ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw,这是虚拟机磁盘文件,清理后可能需要docker system prune -a再重启 Docker Desktop 才真正缩容











