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

 

posted on 2023-04-10 10:11  06  阅读(9423)  评论(0编辑  收藏  举报