最近,我们开始对一些应用程序进行docker化,不得不说,我简直爱上了Docker!这是一个非常棒的工程,在AWS EC2的软件运用的基础上,它让我们的生活变得更加轻松。但是,我们在使用Docker时碰到的一个问题是它的疯狂的占用磁盘的情况。我们在Amazon Linux上运行Docker,并且我们有一个构建服务器来构建Docker镜像作为构建管道的一部分。一旦建立,图像会通过一个Ansible的手册推送到我们的服务器。从这点来看,它确实值得更多的关注。
其实我们注意到,随着时间的推移,docker似乎吞噬了主机的磁盘空间。快速的df -h显示/ var / lib / docker正在增长到几乎覆盖整个磁盘的地步。所以我们四处寻找解决方案,并提出来以供大家了解。
当Docker容器存在时,容器不会自动删除。您可以使用“docker ps -a”命令键查看所有容器,清理退出的容器,使用的命令如下。
docker rm - v $(docker ps - a - q - f status = exited)
这将删除退出的容器。-v标志表示所有不需要的容器都会被删除。假如没有这样的容器,你会看到如下的错误信息。
docker:“rm”至少需要1个参数。请参阅“docker rm -help”。
这意味着没有什么东西可以删除,你可以顺利通过。
Docker会保留您在磁盘中使用的所有映像,即使这些映像没有正在运行。这样做就可以保证在本地“缓存”中具有我们需要的映像。这简直太棒了,因为当你想拉取一个依赖于这些映像的图像,或者当你正在构建一个图像时,所有这些资源都是本地可用的。坏消息是,这会大大的消耗磁盘空间!
删除这些不需要的图像的命令是:
docker rmi $(docker images - f “dangling = true” - q)
同样,如果你没有任何这样的映像,你可能会得到一个错误消息,说明rmi命令需要一个参数。
如果您的docker目录仍占用空间,那可能意味着您的磁盘中有不需要的容量体积。我们传递给rm命令的-v标志通常会顾及到这一点。但是有时候,如果关闭容器的方法不能自动删除容器,那么vfs目录会变得非常快。我们可以通过删除不需要的磁盘容积来回收这个空间。要做到这一点,有一个码头的图像,你可以使用!
以下是如何运行它。
码头 运行 - v / var / run / docker。sock:/ var / run / docker。袜子 - v / 无功/ lib中/ 泊坞窗:/ 无功/ lib中/ 泊坞窗 - RM 马丁/ 泊坞窗- 清理- 卷
如果你想要安全运行,看看它将要删除什么,只需要传递-dry-run作为参数。
当这个程序运行时,它会做删除所有不需要容积量的准备,然后释放你的磁盘空间。
那么接下来的问题当所有程序运行正常的情况下,只要我们的服务器被填满,我们就不得不手动运行它。所以我们决定对其进行自动化。这于crontabs是一件轻而易举的事情。把所有上面的命令放到/etc/cron.daily/目录下的文件中。我们在该目录中创建了一个名为docker-clean的文件,并具有执行权限。该文件包含以下内容。
docker rm - v $(docker ps - a - q - f status = exited)
docker rmi $(docker images - f “dangling = true” - q)
码头 运行 - v / var / run / docker。sock:/ var / run / docker。袜子 - v / 无功/ lib中/ 泊坞窗:/ 无功/ lib中/ 泊坞窗 - RM 马丁/ 泊坞窗- 清理- 卷
Linux将每天自动运行这个工作,并在Docker化后进行清理工作。我个人认为这应该作为一个管家功能加入到docker守护进程中。不管怎么说吧,码农们也很自豪可以建造一个这样的工具。