Docker 命令查看并清理数据卷及磁盘

Docker 在长时间使用的情况下,经常需要删除旧的容器并创建新的容器,长此以往,Docker 的数据卷 volumes 会产生了非常多的僵尸文件。

以下介绍如何查看并清理这些僵尸文件。

查询僵尸文件

在 Docker 1.9 以上的版本中,官方提供用于查询僵尸文件的命令:

$ docker volume ls -qf dangling=true

Docker 1.13 引入了类似于 Linux 上 df 的命令,用于查看 Docker 的磁盘使用情况

$ docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              47                  47                  11.89GB             879.7MB (7%)
Containers          156                 154                 868.7GB             0B (0%)
Local Volumes       642                 28                  1.359TB             389.5GB (28%)
Build Cache         0                   0                   0B                  0B

上述信息可以看出:

  • Docker 镜像占用了 11.89GB 磁盘,
  • Docker 容器占用了 868.7GB 磁盘,
  • Docker 数据卷占用了 1.359TB 磁盘。

删除无用数据卷

手动删除命令

删除所有 dangling 数据卷(即无用的 Volume,僵尸文件):

$ docker volume rm $(docker volume ls -qf dangling=true)

删除所有 dangling 镜像(即无 tag 的镜像):

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

删除所有关闭的容器:

$ docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm

清理 none 对象

删除关闭的容器、无用的数据卷和网络,以及 dangling 镜像(即无 tag 的镜像)

注意,所有关闭的容器都会被删除,请核查是否存在关闭运行但是需要保留的容器!

删除关闭的容器、无用的数据卷和网络:

$ docker system prune
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] y

删除更彻底,可以将没有容器使用 Docker 镜像都删掉:

$ docker system prune -a
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all images without at least one container associated to them
  - all build cache

Are you sure you want to continue? [y/N] y

docker system prune 命令是删除镜像、容器和网络的快捷方式。

在 Docker 17.06.0 及以前版本中,还可以删除卷。

在 Docker 17.06.1 及更高版本中必须为 docker system prune 命令明确指定 --volumes 标志才会删除卷。

$ docker system prune --volumes
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all volumes not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] y

重启 Docker

使用上面几个方法的命令可以有效清理 Docker 运行所产生的无用文件,且无需重启 Docker 即可生效。

但是 Docker 也许存在某些 bug(内核 3.13 版本的 Docker 确诊),导致 Docker 无法清理一些无用目录,不过重启 Docker 可以解决这个问题。

再次查看占用

$ docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              16                  16                  5.072GB             86.04MB (1%)
Containers          102                 102                 57.04MB             0B (0%)
Local Volumes       32                  9                   206.5MB             241.7kB (0%)
Build Cache         0                   0                   0B                  0B

相比上次,占用明显降低了。