文章目录
- 一、背景
- 二、方案总结
- 三、方案实施
- 3.0 转移数据修改docker默认存储位置
- 3.1 手动清理
- 3.2 定时容器日志清理
- 3.3 限制 Docker 容器日志大小
大家好,我是脚丫先生 (o^^o)
大数据基础平台的搭建,我采用的是全容器化Apache的大数据组件。
之前还很美滋滋的肝着。
某一天,我部署新服务的时候,突然提示我**「无法安装新的容器,提示磁盘占满 !」**
一、背景
Centos7的云服务器,内存16G,硬盘140G
实施大数据平台基础环境容器化部署。
因为大数据组件容器化的日志信息,没有定时清理,所以很快占满磁盘。
在这个云服务器资源寸土寸金的地方,没钱只能瞪眼的享受妥妥的无力感。
终不屈服的我,采用了不同的方案,以此分享给小伙伴们!!!
卡得我云服务器,真想给它一拳头。。。
-
第一列 Filesystem 代表文件系统的名称。
-
第二列 Size 表示文件系统的大小。
-
第三列 Used 表示已占用多大的磁盘空间。
-
第四列 Avail 表示可用磁盘空间的大小。
-
第五列 Use% 表示磁盘使用率多大,100% 表示磁盘占满了。
-
第六列 Mounted On 表示挂载在哪个目录。
二、方案总结
-
方案零:转移数据修改docker默认存储位置,治标不治本,无法提供无限量磁盘。
-
方案一:手动清理日志文件,可解燃眉之急,治标不治本。
-
方案二:脚本定期清理日志文件,缺点是日志文件全丢了,无法追溯。
-
方案三:限制所有容器的日志文件大小,治本,缺点是需要重新创建容器和启动 docker 镜像。
三、方案实施
3.0 转移数据修改docker默认存储位置
修改docker的默认存储位置
虽然有多种方式修改docker默认存储位置,但最好还是在docker安装完后,第一时间修改docker默认存储位置为其他大目录或者磁盘中。
规避迁移数据过程中造成的风险。
(1) 转移
- 停止docker服务
systemctl stop docker
- 创建新的docker目录
执行命令df -h,找一个大的磁盘,新建自己用于存储容器日志的目录
例如我在/home目录下面建了/home/modules/docker/lib目录
mkdir -p /home/modules/docker/lib
- 迁移目录
把/var/lib/docker目录下面的文件到/home/modules/docker/lib目录里
迁移后的完成docker路径:/home/modules/docker/lib/docker
rsync -avz /var/lib/docker/ /home/modules/docker/lib/
- 进行docker配置文件修改
配置文件网上很多,篇幅有限,不在此展开。
vim /etc/systemd/system/docker.service
添加如下:
ExecStart=/usr/bin/dockerd --graph=/home/modules/docker/lib/docker
- 重启docker
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
3.1 手动清理
cat /dev/null > /var/lib/docker/containers/容器id/容器id-json.log
注意: 这里没有使用 rm 方式来删除文件。
使用 rm -rf 方式删除日志后,通过 df -h 会发现磁盘空间并没有释放。原因是在Linux或者Unix系统中,通过 rm -rf 或者文件管理器删除文件,将会从文件系统的目录结构上解除链接(unlink)。
如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。
正确姿势是cat /dev/null > *-json.log,当然你也可以通过rm -rf删除后重启docker。
3.2 定时容器日志清理
- 编写清理docker日志文件脚本
在自己想在的目录下,编写清理脚本cleardockerlog.sh
#!/bin/sh
echo "======== start clean docker containers logs ========"
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
echo "clean logs : $log"
cat /dev/null > $log
done
echo "======== end clean docker containers logs ========"
- 加入定时任务,并设置立即生效
crontab -e
0 2 */1 * * sh /root/clean_docker_log.sh
3.3 限制 Docker 容器日志大小
新建 /etc/docker/daemon.json,若有就不用新建了。
vim /etc/docker/daemon.json
配置内容如下:
{
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"}
}
max-size=500m,表示容器的日志文件大小上限是 500M, max-file=3,表示容器有三个日志,第一个满了 500M之后就写第二个,第二个满了 500M就写第三个,如果第三个满了,就清空第一个日志文件,重新写第一个日志文件。如下图所示:
写了 3 个日志文件,最大不超过 500M
改完之后需要重启 docker 守护进程
systemctl daemon-reload
systemctl restart docker
注意:
「这种方式只对新建的容器有效的,之前的容器不生效。」
验证容器是否已应用日志设置(以 root 身份):
/var/lib/docker/containers//hostconfig.json