docker日志存储位置
在Linux系统中docker启动后日志存储在/var/lib/docker/containers/容器ID/
目录中,启动一个容器后,容器ID目录中会生成如下文件:
-rw-r----- 1 root root 10325 Nov 16 14:09 12f7f218aa3ba42cf58e3a77ab7ff615c3b06cb04c8d2f22561592c2ea2d3126-json.log
drwx------ 2 root root 4096 Nov 16 14:07 checkpoints
-rw------- 1 root root 3664 Nov 16 14:07 config.v2.json
-rw-r--r-- 1 root root 1514 Nov 16 14:07 hostconfig.json
-rw-r--r-- 1 root root 13 Nov 16 14:07 hostname
-rw-r--r-- 1 root root 174 Nov 16 14:07 hosts
drwx------ 2 root root 4096 Nov 16 14:07 mounts
-rw-r--r-- 1 root root 108 Nov 16 14:07 resolv.conf
-rw-r--r-- 1 root root 71 Nov 16 14:07 resolv.conf.hash
每个容器的日志默认都会以 json-file 的格式存储于/var/lib/docker/containers/<容器id>/<容器id>-json.log
下,不过并不建议去这里直接读取内容,因为容器的日志则可以通过 docker logs
命令来访问,而且可以像 tail -f
一样,使用 docker logs -f
来实时查看。如果使用 Docker Compose,则可以通过 docker-compose logs <服务名>
来查看。
docker容器日志导致磁盘空间爆满
从上面可以知道docker容器日志存储在文件中,容器销毁后/var/lib/docker/containers/<容器id>/
目录会被自动删除,所以容器日志也被一并删除。如果容器一直运行并且一直产生日志,容器日志会导致磁盘空间爆满,如何解决这个问题?
设置docker容器日志大小(全局设置)
新建/etc/docker/daemon.json
,若有就不用新建了。添加log-dirver和log-opts参数,如下:
# vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://f613ce8f.m.daocloud.io"],
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"}
}
-
max-size=500m
,意味着一个容器日志大小上限是500M -
max-file=3
,意味着一个容器最多有三个日志,分别是:容器id-json.log、容器id-json.log.1、容器id-json.log.2
, 当日志文件的大小达到500m时,自动划分文件保存,最多划分3个文件 - 这两个参数设置之后说明,一个容器最多保存1500m(3 * 500)日志,超过范围的日志不会被保存,文件中保存的是最新的日志,文件会自动滚动更新。
# 重启docker守护进程
systemctl daemon-reload
# 重启docker
systemctl restart docker
注意:设置的日志大小,只对新建的容器有效。
设置完成之后,需要删除容器,并重新启动容器,我们可以看到/var/lib/docker/containers/<容器id>/hostconfig.json
文件的变化如下:
设置log-opts
之前:
cat hostconfig.json
# 其中的LogConfig如下
"LogConfig": {
"Type": "json-file",
"Config": {}
}
设置log-opts
之后:
cat hostconfig.json
# 其中的LogConfig如下
"LogConfig": {
"Type": "json-file",
"Config": {
"max-file": "3",
"max-size": "500m"
}
}
k8s中的容器日志
在k8s集群中docker容器日志/var/lib/docker/containers/容器ID/
目录的文件如下:
-rw-r----- 1 root root 27K Oct 30 19:45 830b17595b2c5cac86e9294b00e90d90e867d7d67489b4e4ee47f847d4726efb-json.log
drwx------ 2 root root 4.0K Oct 30 19:44 checkpoints
-rw------- 1 root root 24K Oct 30 19:44 config.v2.json
-rw-r--r-- 1 root root 2.1K Oct 30 19:44 hostconfig.json
drwx------ 2 root root 4.0K Oct 30 19:44 mounts
与docker容器目录相比少了一些文件:hostname、hosts、resolv.conf、resolv.conf.hash
k8s通过sandbox(pause容器,关于pause容器的介绍可以查阅资料)
关联了这些文件,通过查看cat config.v2.json
可以发现如下配置:
"HostnamePath": "/var/lib/docker/containers/27c9b0c0d1d7c8c7db515f96d5ae8c50ef7aeea02ecddcaa6546ea233dc5445c/hostname",
"HostsPath": "/var/lib/kubelet/pods/88f3a665-fdd1-4ad5-b0e0-0b613f762b4c/etc-hosts",
"ShmPath": "/var/lib/docker/containers/27c9b0c0d1d7c8c7db515f96d5ae8c50ef7aeea02ecddcaa6546ea233dc5445c/mounts/shm",
"ResolvConfPath": "/var/lib/docker/containers/27c9b0c0d1d7c8c7db515f96d5ae8c50ef7aeea02ecddcaa6546ea233dc5445c/resolv.conf",
使用命令cat /var/lib/docker/containers/<容器id>/hostconfig.json
查看hostconfig.json
的内容,发现有如下设置:
{
"Binds": [
"/var/lib/kubelet/pods/e268cba1-95c6-4c16-904c-6be0b70344ea/volumes/kubernetes.io~secret/default-token-7vpxg:/var/run/secrets/kubernetes.io/serviceaccount:ro",
"/var/lib/kubelet/pods/e268cba1-95c6-4c16-904c-6be0b70344ea/etc-hosts:/etc/hosts",
"/var/lib/kubelet/pods/e268cba1-95c6-4c16-904c-6be0b70344ea/containers/demo/eee5300c:/dev/termination-log"
],
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {
"max-file": "10",
"max-size": "100m"
}
},
"NetworkMode": cd "container:ab24db5934f3a0153d9deb3c2de054c87148c3919f1bc2b1d2c11c4c8a2c8c57",
"PortBindings": null,
//其他参数没有列出来
......
......
}
说明一个容器中日志文件的大小最大为100m,最多10个文件,一个容器的日志最多保存1000m日志数据
查看/etc/docker/daemon.json
发现有如下配置:
cat /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "10"
}
}
下面列出了一个容器的日志文件达到设置值的情况:
total 927M
drwx------ 2 root root 4.0K Sep 9 14:51 checkpoints
-rw------- 1 root root 24K Sep 9 14:51 config.v2.json
-rw-r----- 1 root root 69M Nov 16 14:21 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log
-rw-r----- 1 root root 96M Nov 16 07:24 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.1
-rw-r----- 1 root root 96M Nov 15 21:49 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.2
-rw-r----- 1 root root 96M Nov 15 12:04 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.3
-rw-r----- 1 root root 96M Nov 15 02:21 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.4
-rw-r----- 1 root root 96M Nov 14 16:47 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.5
-rw-r----- 1 root root 96M Nov 14 07:11 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.6
-rw-r----- 1 root root 96M Nov 13 21:35 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.7
-rw-r----- 1 root root 96M Nov 13 11:57 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.8
-rw-r----- 1 root root 96M Nov 13 02:21 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.9
-rw-r--r-- 1 root root 2.2K Sep 9 14:51 hostconfig.json
drwx------ 2 root root 4.0K Sep 9 14:51 mounts
参考文档:
Docker 日志都在哪里?怎么收集?
Docker容器日志查看与清理