如何为 Docker 扫地
docker system prune
使用docker system prune命令是目前最便捷的清理方式
清理未被使用的containers、networks、images,可选清理volumes
# 为防止数据丢失,该命令**默认不清理volumes**
docker system prune
# 清理所有未被使用的资源,包括未被使用的volumes
# 🚨 🚨 🚨 可能造成数据丢失
docker system prune -a --volumes
仅清理未被使用的 images
docker image prune
仅清理未被使用的 container
docker container prune
仅清理未被使用的 volumes
# 🚨 🚨 🚨 可能造成数据丢失
docker volume prune
为什么需要为 Docker 扫地?(旧的解决方案)
相同名字和 tag 的 Docker image 在更新以后,旧的 image 并不会被删除( docker rmi ),一般只会被删除 tag,如果你也像我们一样在测试环境中快速迭代版本,那用不了多久就会产生很多 tag 为 none 的无用 image,它们会占用很多磁盘空间;
在日常使用中,也可能产生很多已停止的 container,它们有些是由于手动运行而忘记关掉的,有些是由于其他原因挂掉了而保留下来的“尸体”;
这些 untagged image 和 stopped container 都是我们要清理的对象;
如何快速清理?
如果你确定这些 image 和 container 都是可以被清理掉的, 那么可以使用以下这些命令来进行快速清理。
清理掉所有未被使用的 image
docker images -q -f dangling=true | xargs --no-run-if-empty docker rmi
清理掉所有 untagged image
docker rmi $(docker images | grep "<none>" | awk "{print $3}")
docker rmi $(docker images | grep "YOUR_KEYWORD" | awk "{print $3}")
根据关键字清理 container
docker rm $(docker ps -a | grep 'YOUR_KEYWORD' | awk '{print $1}')
清理掉所有 stopped container
docker ps -q -f status=exited | xargs --no-run-if-empty docker rm
使用 docker-compose 来管理 container
在使用 docker-compose down 或者 docker-compose up (更新)时,旧的 container 会自动被删除掉。
注意保护你的数据!
- 在使用 docker 的时候,无论是 image 还是 container 都不应该用来保存数据和文件;
- 在使用 docker 的时候,image 和 container 应该被视为被编译后的程序和文件,它们极易在迭代的时候被抛弃和删除掉;
- 如果你的程序会生产数据和文件,请一定要通过 volume 映射到宿主机的磁盘上,或者存储于外部数据库,如果你的数据库也是通过 docker 运行,请一定要将数据库存储的文件也映射到宿主机上;