Docker容器日誌管理介紹

Docker容器日誌分爲2類:java

  1. Docker引擎日誌(Docker自己運行的日誌)。
  2. 容器日誌,各個容器內產生的日誌。
  • Docker引擎日誌
    Centos系統下Docker引擎log通常給systemd管理,可經過 journalctl -u docker.service 命令查看。nginx

  • 容器日誌
    1、查看日誌命令
    docker logs 容器ID 顯示當前運行容器的log,輸出Linux下的STDOUT(標準輸出)、STDERR(標準錯誤輸出),docker logs 顯示的內容包含STDOUT和STDERR。生產環境中,若是應用輸出到咱們本身的日誌文件裏,使用docker logs通常收集不到太多重要信息,大多有用log在容器內部。
    docker logs 容器ID 或 -f 參數 實施查看log,相似Linux的tail -f。如:
    [root@docker-qa logs]# docker ps |grep part
    ed9e7d9df4b1        b2b-partner-img/b2b-partner-test                                      "/bin/sh -c 'java ..."   45 minutes ago      Up 45 minutes           0.0.0.0:8081->8081/tcp             b2b-partner-test-container
    [root@docker-qa logs]# 
    [root@docker-qa logs]# docker logs -f ed9e7d9df4b1

    2、Docker日誌驅動
    Docker CE版本,docker logs命令僅適用於以下的驅動程序:
    Docker容器日誌管理介紹
    經常使用的日誌驅動主要有:json-file(默認)、local、syslog、journald、fluentd。
    1). Docker日誌驅動命令:
    查看系統設置的日誌驅動redis

    [root@docker-qa logs]# docker  info |grep  "Logging Driver"  | docker info --format '{{.LoggingDriver}}'
    json-file

    查看單個容器設置的日誌驅動命令,docker inspect -f '{{.HostConfig.LogConfig.Type}}' 容器IDdocker

    [root@docker-qa ~]# docker inspect  -f '{{.HostConfig.LogConfig.Type}}' b0c936eca8ce
    json-file

    2). Docker日誌驅動全局配置文件,/etc/docker/daemon.json,JSON格式。
    當前日誌驅動:json

    cat /etc/docker/daemon.json 
    {
    "registry-mirrors": ["https://tnxo20jc.mirror.aliyuncs.com"]
    }

    上面是對全部容器更改,也能夠針對單一容器設置日誌驅動 --log-driver。如上顯示的是阿里雲的鏡像加速地址。
    3). 日誌驅動-local
    local日誌驅動記錄從容器的STDOUT/STDERR輸出,並寫到主機硬盤。默認狀況,local日誌驅動爲每一個容器保留100M的日誌信息,並啓用壓縮來保存。
    local日誌驅動存儲位置 /var/lib/docker/containers/容器ID/local-logs/,以container.log命名。支持的驅動選項有:
    Docker容器日誌管理介紹
    全局設置日誌驅動爲-local,需在配置文件 /etc/docker/daemon.json:tomcat

    {
    "log-driver": "local",
    "log-opts": {
    "max-size": "10m"
    }
    }

    重啓docker服務生效。
    單個容器日誌驅動設置爲-local,加 --log-driver local 參數。服務器

    #  運行一個容器 ,並設定日誌驅動爲 local ,並運行命令 ping www.baidu.com
    [root@localhost docker]# docker run  -itd  --log-driver  local  alpine  ping www.baidu.com 
    3795b6483534961c1d5223359ad1106433ce2bf25e18b981a47a2d79ad7a3156
    #  查看運行的容器的 日誌驅動是不是 local
    [root@localhost docker]# docker inspect  -f '{{.HostConfig.LogConfig.Type}}'   3795b6483534961c
    local

    4). 日誌驅動-JSON,Docker默認日誌驅動。
    json-file日誌驅動記錄從容器的STDOUT/STDERR輸出,並用JSON格式寫到文件中。
    json-file日誌路徑,/var/lib/docker/containers/容器ID/容器ID-json.log:tcp

    [root@docker-qa ~]# ll /var/lib/docker/containers/09c7bec493c86f0116c4ee91bc54a9262ef1b73fbf27bb0b7a89778a0a28c125/
    總用量 320
    -rw-r----- 1 root root 290515 Aug  6 17:57 09c7bec493c86f0116c4ee91bc54a9262ef1b73fbf27bb0b7a89778a0a28c125-json.log
    drwx------ 2 root root   4096 Aug  6 17:14 checkpoints
    -rw-r--r-- 1 root root   4367 Aug  6 17:56 config.v2.json
    -rw-r--r-- 1 root root   1380 Aug  6 17:56 hostconfig.json
    -rw-r--r-- 1 root root     13 Aug  6 17:56 hostname
    -rw-r--r-- 1 root root    177 Aug  6 17:56 hosts
    -rw-r--r-- 1 root root    175 Aug  6 17:56 resolv.conf
    -rw-r--r-- 1 root root     71 Aug  6 17:56 resolv.conf.hash
    drwxrwxrwt 2 root root     40 Aug  6 17:56 shm

    json-file日誌驅動支持的驅動選項有:
    Docker容器日誌管理介紹
    5). 日誌驅動-syslog
    syslog日誌驅動將日誌路由到syslog服務器,syslog以原始的字符串做爲日誌消息元數據,接收方能夠提取如下的消息:
    level日誌等級,debug、warning、error、info
    timestamp時間戳
    hostname事件發生的主機
    facility系統模塊
    進程名稱和進程ID
    修改全局日誌驅動爲syslog:ide

    cat /etc/docker/daemon.json
    {
    "log-driver": "syslog",
    "log-opts": {
    "syslog-address": "udp://1.2.3.4:1111"
    }
    }

    3、生產環境存儲Docker容器中的日誌
    上面介紹的是Docker官方提供的日誌驅動,但都是針對容器的STDOUT/STDERR輸出的日誌驅動。
    容器中的日誌可分爲2大類:微服務

  • 標準輸出STDOUT/STDERR日誌
    也就是STDOUT/STDERR,這類日誌可經過Docker官方的日誌驅動進行收集。如:
    NGINX日誌有access.log 和 error.log,在Docker Hub上可看到Nginx的Dockerfile對於這兩個日誌的處理是:
    RUN ln -sf /dev/stdout /var/log/nginx/access.log \
    && ln -sf /dev/stderr /var/log/nginx/error.log

    都是軟連接到 /dev/stdout 和 /dev/stderr,因此這類容器是可使用Docker官方的日誌驅動。

  • 文本日誌
    都存儲於容器內部,並無重定向到容器的STDOUT/STDERR。如Tomcat日誌有Catalina、localhost、manager、host-manager,咱們可在Docker Hub上看到Tomcat的dockerfile只有Catalina進行處理,其餘日誌都存儲於容器內部裏,只有進入容器纔可看到其餘的日誌。
    CMD ["catalina.sh", "run"]

針對這類容器有專門的方案應對。

  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掛載點及其計算方法。
    Docker容器日誌管理介紹
    查看sms微服務容器掛載位置:

    [root@docker-qa ~]# docker ps | grep sms
    b0c936eca8ce        9e1a0e0ee678                                                          "/.r/r /bin/sh -c ..."   18 months ago       Up 8 months                                            r-ms-test-sms-1-561a64f3
    [root@docker-qa ~]# docker inspect -f '{{.GraphDriver.Data.MergedDir}}' b0c936eca8ce     # 查看sms容器的掛載點位置
    /mnt/docker/overlay/ee687989905069e3450318a0750a0d88909190191441cccbd47d83cc042f23ab/merged
    [root@docker-qa ~]# 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
    [root@docker-qa ~]# 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

相關文章
相關標籤/搜索