暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

docker 入门(五)

writeline 2021-04-19
733

 本文开始前,先来回顾下上一篇docker 入门,主要讲解了如何限制容器使用的资源。本篇将来聊下如何查看容器内产生的日志。


前言


一般地,日志这个鬼有时还挺烦的,平时都不怎么关注,但是需要用时却没有那就很烦了。而docker日志可分为两类:

  • docker 日志

  • docker 内应用日志

下面将一起来探讨一下如何用最佳的姿势来管理这两类日志。


01

docker 日志


docker提供了logs指令,在docker 入门(二)里有讲到这个指令,它是用来查看对应容器所产生的日志的。它的内容主要来自于STDOUT(标准输出)、STDERR(标准错误输出)。而在生产环境中,应用产生的日志都是记录到特定的文本文件里,那我们使用此命令是看不到啥有用信息的。我们可以先看下容器产生的日志在哪里,通过下面的命令可查到:

    docker inspect --format='{{.LogPath}}' 容器id
    /var/lib/docker/containers/容器id/容器id-json.log

    json-file是默认的docker logging driver。每个docker容器启动后都会在/var/lib/docker/containers目录产生相关的日志文件,可以使用诸如filebeat、logstash等工具来抓取。但是要进行索引区分的话,还是比较难的。除非加上一些解析,但这种是很繁琐的。


    02


    docker 服务日志


    比如我们有一个.net core应用,使用log4net来记录应用产生的日志,而日志会记录到特定的文件目录中去。而由于容器销毁后,应用产生的日志也会同时被销毁。那我们该怎么采集这类日志呢?

    • 可以使用卷,将日志目录挂载到宿主机,宿主机通过filebeat、logstash等做采集。

    • 在容器内部运行一个数据采集器,例如:filebeat、logstash,做实时采集。但要对其做一些资源限制,以防和应用本身争抢资源。

    • 使用开源的log-pilot解决方案,它能通过声明式配置来实现强大的容器事件管理,可获取到容器的标准输出和内部文件日志。

    这三种都能实现对应用的日志采集,最佳实践肯定是第三种了,它仅仅只是简单的运行一个容器,通过简单的标签声明便能抓取到应用的日志,可以说是简单到极致了。但往往简单的东西内部都还蛮复杂的。为什么不推荐第一二种呢?第一种无法采集到容器内部信息,与是否部署在容器上似乎一点联系也没有。第二种主要是还要部署额外服务,造成运维负担,造成架构复杂。


    03


    log-pilot 把玩


    这个玩意的运行依赖于docker、docker-compose,需要先行安装这两个工具。先执行如下命令,clone下这个库

      git clone https://github.com/AliyunContainerService/log-pilot.git

      目录结构大致如下:

      为了快速看下效果,我们先执行如下命令:

        cd quickstart/filebeat

        设置run为可执行程序

          chmod 777 run
          编辑下es.yml,将pilot的镜像名称和tag修改为如下:
             pilot:
            image: registry.cn-hangzhou.aliyuncs.com/acs-sample/log-pilot:0.9.5-filebeat

            最后执行如下命令:

              ./run


              正如提示所输出的,到kibana上去创建对应的index-pattern就可以看到抓取到的日志了。简直不要太好了。效果看到了,不禁好奇它怎么做到的呢?看如下代码:

                docker-compose -p quickstart -f es.yml up -d

                这是容器启动脚本。-f 后接一个参数,表示服务配置文件,默认为docker-compose.yml,而这里指定了es.yml。在来看es.yml的内容:

                  version: '2'
                  services:
                  elasticsearch:
                  ports:
                  - 9200:9200
                  image: elasticsearch:5.5.1


                  kibana:
                  image: kibana:5.5.1
                  ports:
                  - 5601:5601
                  environment:
                  ELASTICSEARCH_URL: http://elasticsearch:9200/
                  links:
                  - elasticsearch


                  pilot:
                  image: registry.cn-hangzhou.aliyuncs.com/acs-sample/log-pilot:0.9.5-filebeat
                  volumes:
                  - /etc/localtime:/etc/localtime
                  - /var/run/docker.sock:/var/run/docker.sock
                  - /var/lib/filebeat:/var/lib/filebeat
                  - /var/log/filebeat:/var/log/filebeat
                  - /:/host:ro
                  cap_add:
                  - SYS_ADMIN
                  environment:
                  LOGGING_OUTPUT: elasticsearch
                  PILOT_LOG_PREFIX: "aliyun,custom"
                  ELASTICSEARCH_HOSTS: elasticsearch:9200
                  links:
                        - elasticsearch

                  从内容可以看到这里定义了三个services节点。主要关注下pilot节点配置。可以看到pilot配置节有个environment设置项,重点关注下PILOT_LOG_PREFIX,值被设置为“aliyun,custom”,默认是“aliyun”,也就是poilt会采集带有这类标签名的容器日志。另外两项则是使用elasticsearch的相关设置。接着在来看下busybox.yml文件:

                    busybox:
                    image: busybox
                    restart: always
                    labels:
                    aliyun.logs.busybox: stdout
                    aliyun.logs.busybox.tags: app=busybox,stage=test
                    command: >
                    sh -c 'while true; do date "+%Y-%m-%d %H:%M:%S" && sleep 1; done'
                    log_opt:
                    max-size: '1k'
                    max-file: '2'

                    这个可以认定为是某个具体的应用。可以看出,他与我们其他常规的应用配置并没有什么区别,唯一多出来的便是这个labels标签。他们的规则可分为两种:aliyun.logs.$name:$path

                    $name是elasticsearch生成的索引名称,$path可为stdout或具体的文件日志目录

                    aliyun.log.$name.tags:$value

                    $value可以指定多个值,用逗号分隔,最终将会作为日志的一个字段体现在kibana上

                    在来看一个tomcat.yml文件

                      tomcat:
                      image: tomcat
                      ports:
                      - "8080:8080"
                      restart: always
                      volumes:
                      - usr/local/tomcat/logs
                      labels:
                      aliyun.logs.catalina: stdout
                      aliyun.logs.catalina.tags: app=tomcat,stage=test
                      aliyun.logs.access: usr/local/tomcat/logs/catalina.*.log
                          aliyun.logs.access.tags: app=tomcat,stage=test

                      按照配置应该会生成catalina、access两个索引,同时有对应的tags设置。

                      就是这么的简单!


                      写在最后


                      本文主要讨论了容器下日志抓取的几种方案,从中可以看出,使用开源的log-pilot方案无疑是最佳的,应用接入的成本最低,最便捷。下一篇将会介绍下如何对容器做监控。



                      如有收获,点个在看,诚挚感

                      文章转载自writeline,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论