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
补充
写的比较急,贴的链接中都有非常完整的信息,应该都能解决此类问题。