前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker – 清理磁盘占用

Docker – 清理磁盘占用

作者头像
张张张我是张
发布2018-01-08 13:46:58
3.9K0
发布2018-01-08 13:46:58

最近,我们开始对一些应用进行 docker 化,不得不说,我已经爱上 Docker 了!这是一个非常棒的工程,在 AWS EC2 上,它让我们的生活变得更加轻松。但是,我们在使用 Docker 过程中遇到一个问题,那就是它的磁盘占用情况。我们在Amazon Linux 上运行 Docker,而且我们有一个专门的构建服务器来构建 Docker 镜像。当构建完成后,镜像会根据Ansible 的配置推送到我们的服务器上。以后有机会我好好讲一讲这个过程。

随着时间的推移我们注意到,docker 似乎占用了大量的磁盘空间。使用 df -h 命令查看发现 /var/lib/docker 目录几乎占用了整个磁盘。所以我们采取了以下解决方案。

1. 确保已经退出的容器被删除。

当 Docker 容器运行时,它不会自动删除。您可以使用 docker ps -a 命令查看所有容器。要清理退出的容器,可使用以下命令。

代码语言:bash
复制
docker rm -v $(docker ps -a -q -f status=exited)

这将删除已经退出的容器。-v 标志表示将删除任何不再需要的容器。如果没有这样的容器,你会看到如下的错误信息。

代码语言:bash
复制
docker: "rm" requires a minimum of 1 argument. See 'docker rm –help'.

这就是说没有什么可以删除的东西,不用担心它。

2. 删除不需要的 “dangling” 状态的镜像。

Docker 会在磁盘中保留所有使用过的镜像,即使这些镜像没有正在运行。这样做是为了在本地“缓存”中保留必要的镜像。这本身是没问题的,因为当你想拉取某个依赖于这些镜像的镜像,或者当你想要构建一个镜像时,本地的这些镜像可以直接使用。但同时,这也占用了大量的磁盘空间!

以下命令可以删除这些不需要的镜像:

代码语言:bash
复制
docker rmi $(docker images -f "dangling=true" -q)

同样,如果你没有这样的镜像,命令会提示错误信息,意思是 rmi 命令需要一个参数。

3. 还没有足够的空间?这个 “vfs” 目录是什么?

如果您的 docker 目录仍占用大量空间,那可能意味着你的磁盘中有不需要的卷。我们使用 rm 命令时带的 -v 标志已经考虑到了这一点。但是有时候,如果关闭容器的时候没能自动删除容器,那么vfs目录会增长得非常快。我们可以通过删除不需要的卷来回收这个空间。你可以使用一个 docker 镜像来完成这些工作!

以下是如何运行它。

代码语言:bash
复制
docker run -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker:/var/lib/docker --rm martin/docker-cleanup-volumes

如果你想要知道它都会删除哪些,只需在命令后加上 -dry-run 参数。

这个程序它会做删除所有不需要的卷,这样就能回收磁盘空间了。

4. 这很好。但是我必须每次都这么做吗?

那么接下来的问题就是,以上的方法确实不错,但是每次我们的服务器磁盘满了,我们就不得不手动去执行上述命令。因此我们决定让它自动化。使用 crontab定时任务可以轻松实现这个功能。只需把上述所有命令保存到 /etc/cron.daily/ 目录下的文件中,例如我们在该目录中创建了一个名为 docker-clean 的文件,并赋予执行权限。该文件包含以下内容。

代码语言:bash
复制
docker rm -v $(docker ps -a -q -f status=exited)
docker rmi $(docker images -f "dangling=true" -q)
docker run -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker:/var/lib/docker --rm martin/docker-cleanup-volumes

这样一来,Linux 系统将每天自动执行这个任务来清理 Docker。我个人认为这应该作为一个功能加入到到 Docker 守护进程中。虽然有些遗憾,但是 docker 团队也应该为他们创造了这样一个伟大的工具而感到荣幸。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 确保已经退出的容器被删除。
  • 2. 删除不需要的 “dangling” 状态的镜像。
  • 3. 还没有足够的空间?这个 “vfs” 目录是什么?
  • 4. 这很好。但是我必须每次都这么做吗?
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档