Docker容器日志管理介绍

Docker容器日志分为2类:

  1. Docker引擎日志(Docker本身运行的日志)。
  2. 容器日志,各个容器内产生的日志。

针对这类容器有专门的方案应对。

  1. 完全是STDOUT/STDERR输出类型的容器,可选择json-file、syslog、local等Docker支持的日志驱动。
  2. 当有文本文件日志类型容器,有如下方案处理:
    方案1 挂载目录bind
    创建一个目录,将目录挂载到容器中产生日志的目录。
    docker  run -d  --name  tomcat-bind  -P  --mount  type=bind,src=/opt/logs/,dst=/usr/local/tomcat/logs/   tomcat

    方案2 使用数据卷volume
    创建数据卷,创建容器时绑定数据卷

    docker  run -d  --name  tomcat-volume  -P  --mount  type=volume,src=volume_name,dst=/usr/local/tomcat/logs/   tomcat

    方案3 计算容器rootfs挂载点
    使用挂载宿主机目录方式采集日志对应用会有一定的侵入性,因它要求容器启动时包含挂载命令。如果采集过程中能对用户透明那就太棒了,事实上,可通过计算容器rootfs挂载带你来达到这种目的。
    容器rootfs挂载点密不可分的一个概念是storage driver。实际使用过程,用户往往会根据Linux版本、文件系统类型、容器读写情况因素选择合适的storage driver。不同storage driver下,容器rootfs挂载带你遵循一定的规律,因此我们可根据storage driver的类型推断出容器的rootfs挂载点,进而采集容器内部log,下表展示部分storage driver的rootfs挂载点及其计算方法。

    查看sms微服务容器挂载位置:

    [[email protected] ~]# docker ps | grep sms
    b0c936eca8ce        9e1a0e0ee678                                                          "/.r/r /bin/sh -c ..."   18 months ago       Up 8 months                                            r-ms-test-sms-1-561a64f3
    [[email protected] ~]# docker inspect -f ‘{{.GraphDriver.Data.MergedDir}}‘ b0c936eca8ce     # 查看sms容器的挂载点位置
    /mnt/docker/overlay/ee687989905069e3450318a0750a0d88909190191441cccbd47d83cc042f23ab/merged
    [[email protected] ~]# ll /mnt/docker/overlay/ee687989905069e3450318a0750a0d88909190191441cccbd47d83cc042f23ab/merged    #查看挂载点的目录结构
    总用量 84
    -rw-r--r-- 118 root root    23 Feb 17 2017 10.42.1.1
    -rw-r--r-- 126 root root 15712 Dec 14 2016 anaconda-post.log
    lrwxrwxrwx   1 root root     7 Dec 14 2016 bin -> usr/bin
    drwxr-xr-x   1 root root  4096 Jan 24 2018 data
    drwxr-xr-x   4 root root  4096 Jan 24 2018 dev
    drwxr-xr-x   1 root root  4096 Jan 24 2018 etc
    drwxr-xr-x   2 root root  4096 Nov  5 2016 home
    lrwxrwxrwx   1 root root     7 Dec 14 2016 lib -> usr/lib
    lrwxrwxrwx   1 root root     9 Dec 14 2016 lib64 -> usr/lib64
    drwx------   2 root root  4096 Dec 14 2016 lost+found
    drwxr-xr-x   2 root root  4096 Nov  5 2016 media
    drwxr-xr-x   2 root root  4096 Nov  5 2016 mnt
    drwxr-xr-x   2 root root  4096 Nov  5 2016 opt
    drwxr-xr-x   2 root root  4096 Jan 24 2018 proc
    dr-xr-x---   1 root root  4096 Aug  2 18:33 root
    drwxr-xr-x   1 root root  4096 Dec 22 2017 run
    lrwxrwxrwx   1 root root     8 Dec 14 2016 sbin -> usr/sbin
    drwxr-xr-x   2 root root  4096 Nov  5 2016 srv
    drwxr-xr-x   2 root root  4096 Jan 24 2018 sys
    drwxrwxrwt   1 root root  4096 Nov 30 2018 tmp
    drwxr-xr-x  13 root root  4096 Dec 22 2017 usr
    drwxr-xr-x   1 root root  4096 Dec 22 2017 var
    [[email protected] ~]# ll /mnt/docker/overlay/ee687989905069e3450318a0750a0d88909190191441cccbd47d83cc042f23ab/merged/usr/local/
    总用量 44
    drwxr-xr-x 2 root root 4096 Nov  5 2016 bin
    drwxr-xr-x 2 root root 4096 Nov  5 2016 etc
    drwxr-xr-x 2 root root 4096 Nov  5 2016 games
    drwxr-xr-x 2 root root 4096 Nov  5 2016 include
    drwxr-xr-x 8 root root 4096 Dec 22 2017 jdk1.8
    drwxr-xr-x 2 root root 4096 Nov  5 2016 lib
    drwxr-xr-x 2 root root 4096 Nov  5 2016 lib64
    drwxr-xr-x 2 root root 4096 Nov  5 2016 libexec
    drwxr-xr-x 2 root root 4096 Nov  5 2016 sbin
    drwxr-xr-x 5 root root 4096 Dec 22 2017 share
    drwxr-xr-x 2 root root 4096 Nov  5 2016 src

    方案4 在代码中实现直接将日志写到redisDocker => Redis => Logstash => Elasticsearch