avatar

ShīnChvën ✨

Effective Accelerationism

Powered by Druid

如何为 Docker 扫地

Tue Jul 10 2018

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 运行,请一定要将数据库存储的文件也映射到宿主机上;