SHINCHVEN'S HEXO

如何为 Docker 扫地

Count: 455Reading time: 1 min
2018/07/10 Share

为什么需要为 Docker 扫地?

相同名字和 tag 的 Docker image 在更新以后,旧的 image 并不会被删除( docker rmi ),一般只会被删除 tag,如果你也像我们一样在测试环境中快速迭代版本,那用不了多久就会产生很多 tag 为 none 的无用 image,它们会占用很多磁盘空间;

在日常使用中,也可能产生很多已停止的 container,它们有些是由于手动运行而忘记关掉的,有些是由于其他原因挂掉了而保留下来的“尸体”;

这些 untagged image 和 stopped container 都是我们要清理的对象;

如何快速清理?

如果你确定这些 image 和 container 都是可以被清理掉的, 那么可以使用以下这些命令来进行快速清理。

清理掉所有未被使用的 image

1
docker images -q -f dangling=true | xargs --no-run-if-empty docker rmi

清理掉所有 untagged image

1
docker rmi $(docker images | grep "<none>" | awk "{print $3}")

清理掉所有 stopped container

1
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 运行,请一定要将数据库存储的文件也映射到宿主机上;
CATALOG
  1. 1. 为什么需要为 Docker 扫地?
  2. 2. 如何快速清理?
    1. 2.1. 清理掉所有未被使用的 image
    2. 2.2. 清理掉所有 untagged image
    3. 2.3. 清理掉所有 stopped container
    4. 2.4. 使用 docker-compose 来管理 container
  3. 3. 注意保护你的数据!