Docker是一个开放源代码软件,它允许开发人员将应用程序打包成“容器”,并在不同的操作系统和环境中快速、轻松地部署。这种灵活性使得Docker成为了开发人员的首选工具之一。然而,随着时间的推移,Docker容器和镜像占用的磁盘空间可能会变得非常大,尤其是在生产环境中。为了释放磁盘空间,本文将探讨如何删除Docker相关的不用的数据。
先看下docker system命令
docker system 目前拥有四个子命令,分别是:
docker system 其中最重要的一个命令就是 docker system prune 命令,清理没有使用的数据,包括镜像数据,已经停止的容器。
查看 docker system 帮助:
docker system df
提供Docker整体磁盘使用率的概况,包括镜像、容器和(本地)volume。所以我们现在随时都可以查看Docker使用了多少资源。
docker system prune
如果之前的命令展示出 docker 已经占用了太多空间,我们会开始清理。有一个包办一切的命令:
根据警告信息可知,这个命令会删除所有关闭的容器以及dangling镜像。示例中,含有3个1GB随机文件的镜像的名称被占用了,名称为:,为dangling镜像,因此会被删除。同时,所有的中间镜像也会被删除。
更进一步,使用-a选项可以做深度清理。这时我们会看到更加严重的WARNING信息:
这个命令将清理整个系统,并且只会保留真正在使用的镜像,容器,数据卷以及网络,因此需要格外谨慎。比如,我们不能在生产环境中运行prune -a命令,因为一些备用镜像(用于备份,回滚等)有时候需要用到,如果这些镜像被删除了,则运行容器时需要重新下载。
此时,所有未绑定容器的镜像将会被删除。由于第一次prune命令删除了所有容器,因此所有镜像(它们没有绑定任何容器)都会被删除。
如何清理none对象
Docker 采用保守的方法来清理未使用的对象(通常称为“垃圾回收”),例如镜像、容器、卷和网络。
除非明确要求 Docker 这样做,否则通常不会删除这些对象。这可能会导致 Docker 使用额外的磁盘空间。
对于每种类型的对象,Docker 都提供了一条 prune 命令。
另外,可以使用 docker system prune一次清理多种类型的对象。本主题讲解如何使用这些 prune 修剪命令
修剪镜像
清理none镜像(虚悬镜像)
命令: docker image prune
默认情况下,docker image prune 命令只会清理 虚无镜像(没被标记且没被其它任何镜像引用的镜像):
清理无容器使用的镜像
命令: docker image prune -a
默认情况下,系统会提示是否继续。要绕过提示,请使用 -f 或 --force 标志。
可以使用 --filter 标志使用过滤表达式来限制修剪哪些镜像。例如,只考虑 24 小时前创建的镜像:
修剪容器
停止容器后不会自动删除这个容器,除非在启动容器的时候指定了 –rm 标志。使用 docker ps -a 命令查看 Docker 主机上包含停止的容器在内的所有容器。你可能会对存在这么多容器感到惊讶,尤其是在开发环境。停止状态的容器的可写层仍然占用磁盘空间。要清理掉这些,可以使用 docker container prune 命令:
默认情况下,系统会提示是否继续。要绕过提示,请使用 -f 或 --force 标志。
默认情况下,所有停止状态的容器会被删除。可以使用 --filter 标志来限制范围。例如,下面的命令只会删除 24 小时之前创建的停止状态的容器。
修剪卷
卷可以被一个或多个容器使用,并占用 Docker 主机上的空间。卷永远不会被自动删除,因为这么做会破坏数据。
修剪网络
Docker 网络不会占用太多磁盘空间,但是它们会创建 iptables 规则,桥接网络设备和路由表条目。要清理这些东西,可以使用 docker network prune 来清理没有被容器未使用的网络。
修剪一切
docker system prune 命令是修剪镜像、容器和网络的快捷方式。在 Docker 17.06.0 及以前版本中,还好修剪卷。在 Docker 17.06.1 及更高版本中必须为 docker system prune 命令明确指定 --volumes 标志才会修剪卷。
如果使用 Docker 17.06.1 或更高版本,同时也想修剪卷,使用 --volumes 标志。
通常我们定时任务删除即可
比如我这边场景是镜像占用磁盘空间很大,那我定时个删除镜像的任务。
每天凌晨1点,删除72小时之外所有没有被使用的镜像:
docker system info (docker info)
这个命令的缩写docker info相信大家都很熟悉: