Docker – 清理磁盘占用

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

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

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

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

docker rm -v $(docker ps -a -q -f status=exited)

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

docker: "rm" requires a minimum of 1 argument. See 'docker rm –help'.

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

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

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

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

docker rmi $(docker images -f "dangling=true" -q)

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

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

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

以下是如何运行它。

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 的文件,并赋予执行权限。该文件包含以下内容。

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 条评论
登录 后参与评论

相关文章

来自专栏holer

外网访问内网Docker容器

局域网里的主机上安装了Docker容器,只能在内网访问,怎样从外网也能访问内网的Docker容器?

2981
来自专栏实战docker

制作mongodb的Docker镜像文件

在上一章《Docker下,极速体验mongodb》中,我们快速搭建了mongodb并在控制台做了基本的体验,当时用的镜像是官方发布在hub.docker.com...

3799

Docker / OSX快速入门

Docker(容器技术)始于2013年,自那时起我便经常可以看到有关docker的消息。之前我已经尝试过docker的入门例子,但我觉得自己没有真正理解dock...

25110
来自专栏PHP在线

Docker 入门教程

2013年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业。 但是,许多人并不清楚 Docker 到底是什么,要解决什么问题,好处又在哪里?本文...

3754
来自专栏北京马哥教育

Docker容器构建过程的安全性分析

DevOps概念的流行跟近些年微服务架构的兴起有很大关系,DevOps是Dev(Development)和Ops(Operations)的结合,Dev负责开发,...

880
来自专栏应用案例

docker搭建私有仓库

序言 黄金指,一不小心就弄出一个故障。。。好可怕好可怕,我的小心脏。。。我的小心眼。。。 我这么信任你,你居然欺骗我。。。。****,这么大的坑,填不满啊。。。...

4627
来自专栏编程坑太多

『中级篇』Docker Compose到底是什么(38)

PS:上节通过image 和container的方式创建wordpress,一般麻烦吧还不算特别麻烦,但是相比今天的docker-compose.yml来说,还...

1173
来自专栏清晨我上码

docker运行容器远程挂载卷

5222
来自专栏星流全栈

DaoCloud的Docker Mirror服务更新啦!

1813
来自专栏阮一峰的网络日志

Docker 入门教程

2013年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业。 但是,许多人并不清楚 Docker 到底是什么,要解决什么问题,好处又在哪里?本文...

3573

扫码关注云+社区

领取腾讯云代金券