docker应用使用久了遇到了docker空间overlay空间不足问题,经过一番梳理大致思路如下:
1.确认容量占用情况
首先要查找overlay中大容量文件都是什么类型文件,其实一般都是日志文件,这个时候就要做好限制docker日志文件大小的操作
这里还有一种可能就是docker images和容器历史存档过多,这个时候确认,未运行的都可以删除时,可以运行以下命令清理
docker system prune -a
如果比较谨慎,可以只清理image镜像,这个命令可以清理没有任何容器关联的镜像文件
docker image prune -a
如果排除是日志和历史存档问题,确实为overlay空间不够,那就要到第二阶段:扩容
2.扩容
扩容里面又分三种情况
(1)虚拟主机磁盘分配不合理
比如,docker overlay在/home下,磁盘空间很小,但是 / 根目录下有很多闲置空间,这个时候就要做docker 目录迁移,把docker目录从/home迁到/ 根目录下
(2)虚拟机磁盘分配合理,但是容量不够
这种情况,可以在虚拟机管理软件里给该虚拟机扩容,新建分区,格式化分区,然后在系统里通过 lvextend 命令来合并扩容后的空间
(3)物理机磁盘分配合理,但是容量不够
这种情况,就要重新添置硬盘,新建分区,格式化分区,然后在系统里通过 lvextend 命令来合并扩容后的空间
下面为实际操作步骤
注意:这里所有操作均在测试环境进行,所有步骤验证完成,才可在生产环境应用!
一、首先查找docker目录下的文件占用情况
#查找docker目录下大于100M的文件
find /home/docker/ -type f -size +100M -print0 | xargs -0 du -h | sort -nr
发现大文件确实都为log文件,这里也有可能是很多的images或者容器,处理方法上面有说过,这里为清理后的文件,所以看不出来很大
所以这时候就要开始第一步,清空log文件,限制docker日志文件大小
#首先清空docker log文件
> /home/docker/docker/containers/0941c3f255bc9f634b121b23667d5f95063633855f266beeb3b1079a468d2072/0941c3f255bc9f634b121b23667d5f95063633855f266beeb3b1079a468d2072-json.log
其次限制docker log文件大小,经过查找资料,发现可以通过docker daemon.json参数控制
daemon.json参数可以参考官网:https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file
从中可以看出daemon.json和日志有关的参数如下
"log-driver": "json-file", "log-level": "", "log-opts": { "cache-disabled": "false", "cache-max-file": "5", "cache-max-size": "20m", "cache-compress": "true", "env": "os,customer", "labels": "somelabel", "max-file": "5", "max-size": "10m" },
label和env可以去掉,其他可以保留,稍加修改后,在daemon.json文件中加入如下
vi /etc/docker/daemon.json
#以下为daemon.json内容
{
"graph":"/home/docker/docker",
"log-driver": "json-file",
"log-opts": {
"cache-disabled": "false",
"cache-max-file": "5",
"cache-max-size": "20m",
"cache-compress": "true",
"max-file": "1",
"max-size": "200m"
},
"registry-mirrors": [
"xxx"
],
"insecure-registries":[
"xxx"
]
}
首先备份daemon.json文件
cp daemon.json daemon.json_bak
daemon.json文件编辑完后,重载和重启docker服务
systemctl daemon-reload && systemctl restart docker
这里有个小插曲:重启报错:start request repeated too quickly for docker.service
一直很疑惑,直到从官网copy那个参数重新写到daemon.json里,启动便成功,所以这个报错大部分原因为daemon.json里的参数格式写的有问题
遇到这种问题,找不到原因,可以参考另一篇文章
https://www.cnblogs.com/allay/p/17465751.html
重启docker之后确认修改是否生效
docker ps #查看容器元数据 docker inspect 容器id
发现参数并未修改
"LogConfig": { "Type": "json-file", "Config": {} },
经过一番查找得知,daemon.json里的参数只对之后新建的容器有效,已存在的不会修改
所以这里问题又变成了,如何修改已存在容器的元数据,因为删除容器,新建容器会有一些风险,直接修改元数据比较稳妥
经过一番查找,有的说要docker save 修改完再docker load,对我来说太繁琐,自己查找docker目录发现了hostconfig.json,恰好有log相关的参数
于是开始查找hostconfig.json相关的资料,确定可行之后开始操作
(1)首先新建一个hello-world容器,查看hostconfig.json参数
docker run hello-world 进入 hello-world目录,查看hello-world文件
#从元数据获取hello路径
docker ps -a
docker inspect hello容器id
得到路径为
"LogPath": "/var/lib/docker/containers/98201b8821a70c03e3885fbd4af599548e6dcd3d56ed7958c55257bd228246b0/98201b8821a70c03e3885fbd4af599548e6dcd3d56ed7958c55257bd228246b0-json.log",
#查看hostconfig.json参数
cd /var/lib/docker/containers/98201b8821a70c03e3885fbd4af599548e6dcd3d56ed7958c55257bd228246b0/
vi hostconfig.json
#得到日志参数关键字段
"LogConfig":{"Type":"json-file","Config":{"cache-compress":"true","cache-disabled":"false","cache-max-file":"5","cache-max-size":"20m","max-file":"1","max-size":"200m"}},
(2)停止docker
systemctl stop docker
(3)备份需要修改的容器的hostconfig.json文件,把hello-world里的日志相关参数,copy到需要修改的容器hostconfig.json内替换原来的参数
参照第一步
(4)启动docker,查看修改后的容器元数据
systemctl start docker
#查看已修改容器的元数据,发现日志参数已生效
docker inspect 容器id
注意:之前由于图省事,先修改hostconfig.json参数,再直接重启docker,发现元数据并未更改,所以只能按部就班,先关停docker,再修改hostconfig.json参数,最后再启动docker,发现元数据已同步修改,docker log大小限制成功!
二、查看docker 空间规划是否合理,不合理修改docker路径
#查看磁盘空间 df -h
发现 /home下1T空间闲置,而docker用到目录只有50g,开始迁移docker路径
(1)停止docker
systemctl stop docker
(2)新建docker 新目录,迁移docker文件
mkdir -p /大磁盘目录/docker #这部可以省略,否则会多一层docker目录
复制目录
cp -r /var/lib/docker /大磁盘目录/
(3)备份daemon.json文件,修改daemon.json参数,重定向docker目录到新目录
cp /etc/docker/daemon.json /etc/docker/daemon.json_bak
vi /etc/docker/daemon.json
#以下为daemon.json内容
{
"graph":"/home/docker/docker", #该项为指定docker目录
"log-driver": "json-file",
"log-opts": {
"cache-disabled": "false",
"cache-max-file": "5",
"cache-max-size": "20m",
"cache-compress": "true",
"max-file": "1",
"max-size": "200m"
},
"registry-mirrors": [
"xxx"
],
"insecure-registries":[
"xxx"
]
}
(3)启动docker服务
systemctl start docker
(4)确认是否生效
docker info
#查看docker目录
三、服务器扩容
涉及这个问题可以参考我的另一篇文章:https://www.cnblogs.com/allay/p/17921713.html
参考文档:
https://blog.csdn.net/Ming_Ton/article/details/122332028
https://blog.csdn.net/weixin_41945228/article/details/104331479?utm_medium=distribute.pc_feed_404.none-task-blog-2~default~BlogCommendFromBaidu~Rate-2-104331479-blog-null.pc_404_mixedpudn&depth_1-utm_source=distribute.pc_feed_404.none-task-blog-2~default~BlogCommendFromBaidu~Rate-2-104331479-blog-null.pc_404_mixedpud
https://blog.csdn.net/yhk19970220/article/details/113504458?utm_medium=distribute.pc_feed_404.none-task-blog-2~default~BlogCommendFromBaidu~activity-4-113504458-blog-null.pc_404_mixedpudn&depth_1-utm_source=distribute.pc_feed_404.none-task-blog-2~default~BlogCommendFromBaidu~activity-4-113504458-blog-null.pc_404_mixedpud
https://www.php.cn/docker/494203.html
https://www.bilibili.com/read/cv15670482/
https://blog.csdn.net/qq_28165595/article/details/127467858
https://blog.csdn.net/Yuan_xii/article/details/127911713