Docker容器磁盘占满的一些情况汇总
前言
本文是我自己最近遇到的两种情况,后续有新发现再补充。
参考文档:https://docs.docker.com/engine/reference/commandline/dockerd/
应用日志过多
默认情况下,每个Docker容器都有10G的存储空间,当超出该大小时,容器就会出现问题。
可以参考官方文档dm.basesize参数的说明来修改默认的容器大小:
指定创建基本设备时要使用的大小,这会限制图像和容器的大小。默认值为10G。请注意,精简设备本质上是“稀疏的”,因此大多数空的10G设备不会在池上使用10GB的空间。但是,文件系统将为空盒使用更多空间,设备越大。
可以在守护进程重启时增加基本设备大小,这将允许所有未来的图像和容器(基于这些新图像)具有新的基本设备大小。
例子
$sudodockerd--storage-optdm.basesize=50G
这将使基本设备大小增加到50G。如果现有基本设备大小大于50G,Docker守护程序将抛出错误。用户可以使用此选项扩展基本设备大小,但不允许缩小。
此值会影响系统范围的“基本”空文件系统,该文件系统可能已被拉出的图像初始化和继承。通常,更改此值需要执行其他步骤:
$sudoservicedockerstop $sudorm-rf/var/lib/docker $sudoservicedockerstart
我在这里遇到的问题是因为某个模块会在10分钟内输出1G的日志,修改日志策略后可以解决该问题。
Dockerd日志过多
有一个GitLab的docker服务,运行几个月后就会出现无法push和pull的情况,原因都是因为/var/lib/docker磁盘空间已满导致的。而导致磁盘空间占满的原因是因为dockerd的日志占用了十几G的空间导致的。
日志文件的路径形如:/var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID-json.log
参考:https://stackoverflow.com/questions/31829587/docker-container-logs-taking-all-my-disk-space
可以参考如下几种解决方案:
1.启动容器参数
参考:https://docs.docker.com/engine/reference/commandline/run/
使用--log-optLogdriveroptions配置日志策略。
例如:--log-optmax-size=50m。
2.全局默认配置
在daemon.json中配置,linux中默认位置为/etc/docker。
配置示例:
{
"log-driver":"json-file",
"log-opts":{
"max-size":"10m",
"max-file":"3",
"labels":"production_status",
"env":"os,customer"
}
}
日志配置参考:https://docs.docker.com/config/containers/logging/configure/
完整daemon.json示例参考:https://docs.docker.com/engine/reference/commandline/dockerd/
{
"authorization-plugins":[],
"data-root":"",
"dns":[],
"dns-opts":[],
"dns-search":[],
"exec-opts":[],
"exec-root":"",
"experimental":false,
"features":{},
"storage-driver":"",
"storage-opts":[],
"labels":[],
"live-restore":true,
"log-driver":"json-file",
"log-opts":{
"max-size":"10m",
"max-file":"5",
"labels":"somelabel",
"env":"os,customer"
},
"mtu":0,
"pidfile":"",
"cluster-store":"",
"cluster-store-opts":{},
"cluster-advertise":"",
"max-concurrent-downloads":3,
"max-concurrent-uploads":5,
"default-shm-size":"64M",
"shutdown-timeout":15,
"debug":true,
"hosts":[],
"log-level":"",
"tls":true,
"tlsverify":true,
"tlscacert":"",
"tlscert":"",
"tlskey":"",
"swarm-default-advertise-addr":"",
"api-cors-header":"",
"selinux-enabled":false,
"userns-remap":"",
"group":"",
"cgroup-parent":"",
"default-ulimits":{
"nofile":{
"Name":"nofile",
"Hard":64000,
"Soft":64000
}
},
"init":false,
"init-path":"/usr/libexec/docker-init",
"ipv6":false,
"iptables":false,
"ip-forward":false,
"ip-masq":false,
"userland-proxy":false,
"userland-proxy-path":"/usr/libexec/docker-proxy",
"ip":"0.0.0.0",
"bridge":"",
"bip":"",
"fixed-cidr":"",
"fixed-cidr-v6":"",
"default-gateway":"",
"default-gateway-v6":"",
"icc":false,
"raw-logs":false,
"allow-nondistributable-artifacts":[],
"registry-mirrors":[],
"seccomp-profile":"",
"insecure-registries":[],
"no-new-privileges":false,
"default-runtime":"runc",
"oom-score-adjust":-500,
"node-generic-resources":["NVIDIA-GPU=UUID1","NVIDIA-GPU=UUID2"],
"runtimes":{
"cc-runtime":{
"path":"/usr/bin/cc-runtime"
},
"custom":{
"path":"/usr/local/bin/my-runc-replacement",
"runtimeArgs":[
"--debug"
]
}
},
"default-address-pools":[{"base":"172.80.0.0/16","size":24},
{"base":"172.90.0.0/16","size":24}]
}
配置参数后需要重启docker服务。
docker-compose配置
参考:https://docs.docker.com/compose/compose-file/compose-file-v2/
配置示例:
logging: options: max-size:'12m' max-file:'5' driver:json-file
补充
写的比较急,贴的链接中都有非常完整的信息,应该都能解决此类问题。