文档中心 > 容器服务

主机上docker目录磁盘占用问题

更新时间:2019/10/30 访问次数:5459

问题

df -h查看主机磁盘,docker占用很多的硬盘空间
image

原因分析

原因一 tae-log-agent占用

docker ps -as查看容器占用,如果tae-log-agent容器占用比较多的空间,如下图所示
image
tae-log-agent是EWS官方容器,进行数据采集,可以放心删除。在主机上执行如下脚本进行清除,运行一次就行

#! /bin/bash
AGENT_CONF_DIR=/acs/system/agent/conf

echo "AGENT_CONF_DIR=${AGENT_CONF_DIR}"

# 1. add disable monitor config to acsagent.feat
echo "===1. add disable monitor config to acsagent.feat==="
echo -n "logagentDisable," > ${AGENT_CONF_DIR}/acsagent.feat

# 2. restart acsagent
# kill acsagent, acswatch will restart it later
echo "===2. restart acsagent==="
logagentPid=$(ps aux | grep -v grep | grep "/acs/system/agent" | grep acsagent | awk '{print $2}')
echo "logagent pid: ${logagentPid}"
kill -9 ${logagentPid}


# 3. remove container:tae-log-agent
echo "===3. remove container:tae-log-agent==="
docker rm -f tae-log-agent

echo "===disable monitor success==="
exit 0

执行截图如下
image

原因二 docker文件系统占用

随着docker的运行,关闭的容器、无用的数据卷和网络,以及不再使用的镜像,也会占用一定空间,且越来越大。
使用docker system prune指令可以将这些数据放心删除,释放相应空间
image

原因三 应用容器占用

docker ps -as查看容器占用,找到占用比较大的容器
image

容器占用空间大,一般是应用日志占用空间,比如业务日志,access_log等,按照如下步骤解决:

1、找到占用空间的应用日志,删除,注意如果使用rm删除,需要重启一下容器才会真正释放。如果还不能解决,看下面步骤2

2、重新拉容器重启,这样容器占用的空间就会全部释放了
image
要注意的是,这里会清空原来容器内运行的数据,请提前做好备份

3、如果步骤2也执行不了,报磁盘空间不足
先解决文档上面tae-log-agent占用和docker文件系统占用,再执行步骤2;
依然不行的话,就需要删除docker相关的数据重新创建容器了:
1)删除ECS主机上的docker存储目录
systemctl stop docker
rm -rf /var/lib/docker/
systemctl restart docker
2)EWS页面中,删除原来的容器,重新添加容器到主机上

如何预防

为了保证之后不会再出现docker容器占用磁盘特别高甚至沾满磁盘的情况,请做好如下的预防工作
1、利用免费的阿里云云监控,在机器上安装云监控插件,设置磁盘告警
2、解决tae-log-agent的占用问题,参考前面文档
3、容器内应用日志最佳实践,将日志打印到/acs/log,设置日志轮转。

容器内应用日志最佳实践

1.代码或者logback等配置中设置日志目录为/acs/log
如下面的例子,tomcat的access log设置的目录为log,会存储在tomcat下(容器中),对应到宿主机ECS,docker占用的空间是翻倍的
image
image
简单来说就是,往容器中写数据会导致docker文件系统空间损耗更多,所以,最好将日志打印到挂载目录。
参考:https://open.taobao.com/doc.htm?docId=117793&docType=1

2.设置日志轮转,避免日志文件占用太大空间

FAQ

关于此文档暂时还没有FAQ
返回
顶部