前言
本文是我自己最近遇到的两种情况,后续有新发现再补充。
参考文档:https://docs.docker.com/engine/reference/commandline/dockerd/
应用日志过多
默认情况下,每个 Docker 容器都有 10G 的存储空间,当超出该大小时,容器就会出现问题。
可以参考官方文档 dm.basesize 参数的说明来修改默认的容器大小:
指定创建基本设备时要使用的大小,这会限制图像和容器的大小。默认值为10G。请注意,精简设备本质上是“稀疏的”,因此大多数空的10G设备不会在池上使用10 GB的空间。但是,文件系统将为空盒使用更多空间,设备越大。
可以在守护进程重启时增加基本设备大小,这将允许所有未来的图像和容器(基于这些新图像)具有新的基本设备大小。
例子
1
|
$ sudo dockerd --storage-opt dm.basesize=50G
|
这将使基本设备大小增加到50G。如果现有基本设备大小大于50G,Docker守护程序将抛出错误。用户可以使用此选项扩展基本设备大小,但不允许缩小。
此值会影响系统范围的“基本”空文件系统,该文件系统可能已被拉出的图像初始化和继承。通常,更改此值需要执行其他步骤:
1
2
3
4
5
|
$ sudo service docker stop
$ sudo rm -rf /var/lib/docker
$ sudo service docker start
|
我在这里遇到的问题是因为某个模块会在 10 分钟内输出 1G 的日志,修改日志策略后可以解决该问题。
Dockerd 日志过多
有一个 GitLab 的 docker 服务,运行几个月后就会出现无法 push 和 pull 的情况,原因都是因为 /var/lib/docker 磁盘空间已满导致的。而导致磁盘空间占满的原因是因为 dockerd 的日志占用了十几G的空间导致的。
日志文件的路径形如: /var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID-json.log
参考:https://*.com/questions/31829587/docker-container-logs-taking-all-my-disk-space
可以参考如下几种解决方案:
1. 启动容器参数
参考:https://docs.docker.com/engine/reference/commandline/run/
使用 --log-opt Log driver options 配置日志策略。
例如: --log-opt max-size=50m。
2. 全局默认配置
在 daemon.json 中配置,linux 中默认位置为 /etc/docker。
配置示例:
1
2
3
4
5
6
7
8
9
|
{
"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/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
{
"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/
配置示例:
1
2
3
4
5
|
logging:
options:
max-size: '12m'
max- file : '5'
driver: json- file
|
补充
写的比较急,贴的链接中都有非常完整的信息,应该都能解决此类问题。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。
原文链接:https://blog.csdn.net/isea533/article/details/95197468