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

相关文章

来自专栏三木的博客

QEMU 1: 使用QEMU创建虚拟机

一、QEMU简介# QEMU是一款开源的模拟器及虚拟机监管器(Virtual Machine Monitor, VMM)。QEMU主要提供两种功能给用户使用。一...

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

Docker 入门教程

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

3453
来自专栏云计算教程系列

如何在Ubuntu 14.04上使用Docker和Docker Compose配置持续集成测试环境

持续集成(CI)指的是开发人员尽可能频繁地集成代码,并且在自动化构建将每个提交合并到共享存储库之前和之后都要进行测试的实践。

510
来自专栏编程坑太多

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

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

1484
来自专栏PHP在线

Docker 入门教程

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

3634
来自专栏编程

手把手教你制作漏洞复现环境

在学习的过程中, 是否看到别人搭建的练习平台心痒痒呢? 通过本篇教程的学习, 将手把手教你搭建属于自己的漏洞测试利用环境, 不管是自己学习还有分享给小伙伴都将轻...

32610
来自专栏星流全栈

DaoCloud的Docker Mirror服务更新啦!

1633
来自专栏实战docker

制作mongodb的Docker镜像文件

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

3459
来自专栏我是攻城师

Docker学习笔记一之安装卸载

3045
来自专栏solarest的专栏

基于OSX平台的Docker快速入门(还没有熟悉Docker吗?那就从这开始吧)

仅仅在2013年左右才发布的Docker,却已经遍布了我的Twitter消息和RSS阅读器。在之前我已经运行过“Hello World”的示例,但我自觉没有能真...

2277

扫码关注云+社区