docker日志存储位置,设置docker容器日志大小

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容器日志查看与清理

你可能感兴趣的:(docker日志存储位置,设置docker容器日志大小)