博客和动态域名都是架在 docker 上,因为以前碰到过旧版 docker 不断往磁盘上写入内容导致磁盘满的情况(升级 docker 后就解决了),我心想是不是还是docker的问题,就用 du -h --max-depth=1 命令来查找是哪个文件夹占的空间比较大,最后发现 /var/lib/docker/overlay 文件夹占了很大的空间,但是网上查了半天,貌似这个文件夹里的内容和 docker 的镜像和容器有关,不敢乱删。
没办法,我看了下,最大的那个容器 commit 过两次,也就是说和这个容器关联的镜像有3个。那要不然我先把容器导出,然后再导入生成一个独立的镜像,再把那3个镜像删掉?
嗯,感觉可以试试,但有个问题,空间已经满了,所以没有空间来导出容器了。这就尴尬了,还好我还有绝招,利用 vps 自带的 snapshot 功能,先将这个vps 做个快照,然后再将快照恢复到一个新的大磁盘主机上,这样就有空间导出容器了。但很遗憾,导出得到的文件巨大无比,其大小差不多相当于最后一次 commit 的镜像大小(3G)加上容器本身的大小(5G)。我又试着把这个文件导入生成一个新镜像,嗯,还是这么大。那这样做根本节省不了空间嘛,那我要是再用这个镜像生成新容器会怎样,试了一下,新容器基本不占用什么空间,为什么呢,因为容器是基于镜像生成的,只有在修改了容器内文件内容的时候才会占用新空间。有点类似于增量备份的感觉。
到这里,我明白了,问题的关键出在容器上,要想办法把原来容器占用的空间缩小。删除容器中没用的文件会缩小容器空间吗,试试看,嗯,可以。那看看容器里有什么可删除的。还是用 du -h --max-depth=1 命令查找占用空间大的文件夹,发现 /data/wwwlog(注意这个文件夹是在容器内部) 占用空间比较大,这个里面放的是 apache 为各个网站生成的日志文件,有四种日志: access.log error.log ssl_access.log ssl_error.log。我删除了 access.log 和 error.log,注意删除日志前先把 apache 停掉。
日志删除后,容器占用的空间小了很多。这样就 ok 了,最后把 vps 重启下,over。
之后过了差不多一年又碰到了这个问题,而且连ssh也无法登陆了,我还以为是ip不能用了。又新开了个主机,然后通过新主机对这个主机进行ssh,倒是能连上了,进入一看发现磁盘空间居然已经用完了,查看正在运行的docker容器,发现只剩下个bind容器还在跑。启动其它容器就提示空间不足,想进入bind容器也提示空间不足。这就很尴尬了,因为这样我就没办法删除lamp容器中的日志文件了。最后我只好先禁用swap,然后删除了原先2G的交换文件,然后又重新建了个512M的交换文件(具体方法参见 "在Linux上安装交换文件 - Vultr.com——vps添加swap 页面文件 交换分区.mhtml" 和 "linux 增加swap 分区大小 - 简书——删除页面文件交换文件.mhtml")。然后重启vps,这样总算可以正常运行容器了,一切也都没问题了。之后我进lamp容器删除了apache的日志文件,然后将交换文件恢复成2G(直接停用512M的交换文件提示失败,因为物理内存不足,所以我又新加了一个大一点的临时交换文件,然后再停用并删除这个512M的交换文件,然后再增加一个2G的交换文件,最后停用并删除那个临时交换文件就可以了)。为了避免下次再遇到磁盘满又要去动交换文件这种情况,我在~/temp目录下用命令
dd if=/dev/zero of=/root/temp/for_delete_when_disk_is_full count=512 bs=1M
新建了一个512M的文件,这样当磁盘满的时候就可以直接删除这个文件而不用去减小交换文件了。