如何清理Docker占用的磁盘空间?

使用docker容器技术的好处:

  • 所有主机的配置都非常简单,只需要安装Docker,这样新增主机的时候要简单很多。
  • 可以非常方便地在不同主机之间迁移各种服务,下载Docker镜像就可以运行,不需要手动配置运行环境。
  • 开发/测试环境与生产环境严格一致,不用担心由于环境问题导致部署失败。
但是,docker容器技术有一个不大不小的问题,就是比较消耗磁盘空间。如果Docker一不小心把磁盘空间全占满了,你的服务也就玩完了,因此所有Docker用户都需要对此保持警惕。当然,大家也不要紧张,这个问题还是挺好解决的。


1. docker system命令 先查看本地文件系统的磁盘状况
# df -h

  • docker system df
docker system df命令,类似于Linux上的df命令,用于查看Docker的磁盘使用情况:
如何清理Docker占用的磁盘空间?
文章图片

可知,Docker镜像占用了14.88GB磁盘,Docker容器占用了447MB磁盘,Docker数据卷占用了0GB磁盘,build缓存占用了0GB磁盘。
  • docker system prune
清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)
# docker system prune

删掉所有没有容器使用的Docker镜像,清理得更加彻底
# docker system prune -a

注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的Docker镜像都删掉了,所以使用之前一定要想清楚。
查看Docker的磁盘使用情况
# docker system df

查看清理之后的磁盘状态
# df -h



2. 手动清理Docker镜像/容器/数据卷
对于旧版的Docker(版本1.13之前),是没有docker system命令的,因此需要进行手动清理,这里给出几个常用的命令。
  • 停止所有运行的容器
# docker stop $(docker ps -a | awk '{print $1}')

  • 删除所有关闭的容器
# docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm

  • 删除所有dangling镜像(即无tag的镜像):
# docker rmi $(docker images | awk "{print $2}" | grep "^")

  • 删除所有dangling数据卷(即无用的volume):
# docker volume rm $(docker volume ls -qf dangling=true)

查看清理之后的磁盘状态
# df -h



3. 重启Docker
还有一次,当我清理了镜像、容器以及数据卷之后,发现磁盘空间并没有减少。根据Docker disk usage提到过的建议,我重启了Docker,发现磁盘使用率从83%降到了19%。根据高手指点,这应该是与内核3.13相关的BUG,导致Docker无法清理一些无用目录:
我查看了一下内核版本,发现真的是3.13:
# uname -r 3.13.0-86-generic

如果你的内核版本也是3.13,而且清理磁盘没能成功,不妨重启一下Docker。当然,这个晚上操作比较靠谱。


4. 参考文章
【如何清理Docker占用的磁盘空间?】http://blog.csdn.net/B9Q8e64lO6mm/article/details/79070442

    推荐阅读