如何在Ubuntu上收集Docker日志

介绍

当您将Docker容器转移到生产环境中时,您会发现经常需要将日志保留在容器外的地方。Docker提供了一个本机日志驱动程序,可以很容易地收集这些日志并将它们发送到其他地方,例如ElasticsearchFluentdElasticsearch是是目前全文搜索引擎的首选。它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。这样您就可以分析数据了。Fluentd是一个开源数据收集器,旨在统一您的日志记录基础架构。它将操作工程师,应用工程师和数据工程师结合在一起,使其简单且可扩展,以收集和存储日志。

Fluentd有四个关键功能,使其适合构建简洁、可靠的日志通道:

  • 使用JSON进行统一日志记录: Fluentd会尽可能地将数据结构化为JSON。这使得Fluentd能够统一处理日志数据的各个方面:收集,过滤,缓冲和输出跨多个源和目标的日志。使用JSON可以更轻松地进行下游数据处理,因为它具有足够的结构,可以在不强制使用严格模式的情况下进行访问。
  • 灵活的架构: Fluentd拥有灵活的插件系统,允许社区扩展其功能。超过300个社区贡献的插件将数十个数据源连接到数十个数据输出,根据需要操作数据。通过使用插件,您可以立即更好地使用日志。
  • 所需最低资源:数据收集器应该是轻量级的,以便在繁忙的机器上轻松地运行。Fluentd是用C和Ruby组合编写的,只需要最少的系统资源。vanilla实例运行30-40MB内存,可处理13,000个事件/秒/核心。
  • 内置可靠性:绝不应该发生数据丢失。Fluentd支持基于内存和文件的缓冲,以防止节点间数据丢失。Fluentd还支持强大的故障转移功能,可以设置为高适用性。

在本教程中,您将学习如何安装Fluentd并将其配置为从Docker容器中收集日志。然后,您将数据流式传输到同一Ubuntu 16.04服务器上,运行Elasticsearch的另一个容器,并查询日志。

准备

要完成本教程,您需要以下内容:

第1步 - 安装Fluentd

安装Fluentd最常见的方法是通过td-agent包。Treasure Data是Fluentd的原作者,它将Fluentd打包为一个独立的Ruby运行,因此您无需设置Ruby环境来运行Fluentd。它们还提供了一个脚本来获取td-agent配置存储库并为您安装软件包的最新软件包。

以非root用户身份登录服务器:

ssh sammy@your_server_ip

然后使用Treasure Data提供的脚本td-agent进行安装。首先,下载脚本:

\curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent2.sh -o install-td-agent.sh

如果要审核脚本,请使用文本编辑器打开它:

nano install-td-agent.sh

一旦您觉得脚本内容OK,请运行脚本进行安装td-agent

sh install-td-agent.sh 

安装完成后,开始运行td-agent

sudo systemctl start td-agent

检查日志以确保已成功安装:

tail /var/log/td-agent/td-agent.log

您将看到类似于以下内容的输出:

    port 8888
  </source>
  <source>
    @type debug_agent
    bind 127.0.0.1
    port 24230
  </source>
</ROOT>
2016-12-02 19:45:31 +0000 [info]: listening fluent socket on 0.0.0.0:24224
2016-12-02 19:45:31 +0000 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine"

接下来,使用以下td-agent-gem命令为Fluentd安装Elasticsearch插件:

sudo td-agent-gem install fluent-plugin-elasticsearch

现在,Fluentd已启动并使用默认配置运行。接下来,我们将配置Fluentd,以便我们可以侦听Docker事件并将它们传递给Elasticsearch实例。

第2步 - 配置Fluentd

Fluentd需要知道从何处收集信息以及在何处提供信息。您可以在位于/etc/td-agent/td-agent.conf的Fluentd配置文件中定义这些规则。

在文本编辑器中打开此文件:

sudo nano /etc/td-agent/td-agent.conf 

删除文件的内容。您将在本教程中从头开始编写自己的规则。您可以在source部分中定义信息源。将此配置添加到文件中:

<source>
  @type forward
  port  24224
</source>

这将源定义为forward,即在TCP之上运行的Fluentd协议,Docker在将日志发送到Fluentd时将使用该协议。

当日志记录输入时,他们将有一些额外的相关领域,包括time,tag,message,container_id。您可以使用tag字段中的信息来确定Fluentd应该将数据发送到何处。这称为数据路由。要配置它,请定义match与tag字段内容匹配的部分并对其进行适当的路由。将此配置添加到文件中:

<match docker.**>
  @type elasticsearch
  logstash_format true
  host 127.0.0.1
  port 9200
  flush_interval 5s
</match>

此规则表示每个带有前缀标记的docker.记录都将发送到在9200端口上运行127.0.0.1的Elasticsearch 。flush_interval会告诉Fluentd应该多久记录Elasticsearch。有关缓冲和刷新的更多详细信息,请参阅缓冲区插件概述文档部分。

保存新配置文件后,重新启动td-agent服务以应用更改:

sudo systemctl restart td-agent

正确配置了Fluentd,让我们安装Elasticsearch来从Fluentd捕获我们的日志。

第3步 - 启动Elasticsearch容器

我们将使用Docker来运行我们的Elasticsearch实例,我们将使用Elasticsearch Docker镜像来创建容器。要使用此映像,按如下方式增加Docker主机的值:

sudo sysctl -w vm.max_map_count=262144

然后执行此命令以下载Elasticsearch映像并启动容器:

docker run -d -p 9200:9200 -p 9300:9300 elasticsearch

镜像将下载,Elasticsearch容器将启动。通过检查Docker进程并查找容器,确保容器正常运行:

docker ps

您应该看到如下输出:

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                            NAMES
76e96943491f        elasticsearch       "/docker-entrypoint.s"   About a minute ago   Up 51 seconds       0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   gigantic_hawking

如果未列出容器,请在没有-d标识的情况下再次启动它,以便容器在前台运行。运行docker run -p 9200:9200 -p 9300:9300 elasticsearch命令并查找任何特定的错误消息。您很可能遇到的错误是系统内存不足或主机上max_map_countDocker的值太低的问题。检查本教程中的所有步骤,确保您没有遗漏任何内容,然后重试。

现在Elasticsearch正在容器中运行,让我们生成一些日志并将它们摄取到Fluentd中。

第4步 - 从Docker容器生成日志

使用Docker,您可以通过标准output(STDOUT)和error(STDERR)接口将日志视为数据流。当您启动Docker应用程序时,只需指示Docker使用本机Fluentd日志记录驱动程序刷新日志。然后,Fluentd服务将接收日志并将其发送给Elasticsearch。

通过在Docker容器中启动Bash命令来测试,如下所示:

docker run --log-driver=fluentd ubuntu /bin/echo 'Hello world'

这会将消息Hello world打印输出,它也会被Docker Fluentd驱动程序捕获并传送到您之前配置的Fluentd服务。大约五秒钟后,记录将被刷新到Elasticsearch。您在配置文件matchFluentd的部分中配置此间隔。

日志已经传送到Elasticsearch,但您可能需要查看官方文档以获取有关可以使用Docker管理Fluentd驱动程序的选项的更多详细信息。最后,我们确认Elasticsearch正在接收事件。用于curl向Elasticsearch发送查询:

curl -XGET 'http://localhost:9200/_all/_search?q=*'

输出将包含如下所示的事件:

{"took":2,"timed_out":false,"_shards":{"total":1,"successful":1,"failed":0},"hits":{"total":1,"max_score":1.0,"hits":[{"_index":"logstash-2016.12.02","_type":"fluentd","_id":"AVQwUi-UHBhoWtOFQKVx","_score":1.0,"_source":{"container_id":"d16af3ad3f0d361a1764e9a63c6de92d8d083dcc502cd904155e217f0297e525","container_name":"/nostalgic_torvalds","source":"stdout","log":"Hello world","@timestamp":"2016-12-02T14:59:26-06:00"}}]}}

根据您的设置,您可能会记录相当多的事件。单个事件{"took":应以时间戳开头并以时间戳结束。它还包含一些与源容器相关的额外信息。如此输出所示,Elasticsearch正在从Docker容器接收数据。

结论

从Docker容器收集日志只是使用Fluentd的一种方法。许多用户来到Fluentd构建一个既可以进行实时日志搜索又可以进行长期存储的日志通道。该架构利用了Fluentd复制数据流并将其输出到多个存储系统的能力。例如,您可以使用Elasticsearch进行实时搜索,但也可以使用MongoDB或Hadoop进行批量分析和长期存储。

Web应用程序生成大量日志,它们通常被任意格式化并存储在本地文件系统中。这可能会出现两个问题。首先,日志很难以编程方式解析,需要大量正则表达式,对于需要分析日志内容的人来说,这非常不容易。其次,日志无法实时访问,因为文本日志是批量加载到存储系统中的。更糟糕的是,如果服务器的磁盘在批量加载之间损坏,则日志会丢失或损坏。

Fluentd通过使用一致的API为各种编程语言提供记录器库,从而解决了这两个问题。每个记录器向Fluentd发送包含时间戳,标记和JSON格式事件的记录,就像您在本教程中看到的那样。有Ruby,Node.js,Go,Python,Perl,PHP,Java和C++的记录器库。记录器将数据异步发送到Fluentd,然后在将日志传送到后端系统之前缓冲日志。如果您觉得搭建起来过于繁琐,您也可以使用腾讯云容器服务,他提供了比较完整的日志分析系统。腾讯云容器服务基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务。腾讯云容器服务完全兼容原生 kubernetes API ,扩展了腾讯云的 CBS、CLB 等 kubernetes 插件,为容器化的应用提供高效部署、资源调度、服务发现和动态伸缩等一系列完整功能,解决用户开发、测试及运维过程的环境一致性问题,提高了大规模容器集群管理的便捷性,帮助用户降低成本,提高效率。容器服务提供免费使用,涉及的其他云产品另外单独计费。 更多Linux教程请前往腾讯云+社区学习更多知识。


参考文献:《How To Centralize Your Docker Logs with Fluentd and ElasticSearch on Ubuntu 16.04 》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏晨星先生的自留地

如何快速的搭建漏洞环境到复现到PoC

6721
来自专栏小狼的世界

CoreDNS介绍

开始之前先吐槽一下busybox中的nslookup命令。这个命令应该是实现的不是很完全,导致我在测试DNS的成功,得到了错误的信息。先来看一下

1.5K1

使用Docker配置Alluxio群集

在以往的文章中,我们已向你介绍了Docker(容器)的世界。这篇文章将引导你配置一个Alluxio集群。

2759
来自专栏云计算

Kubernetes服务网格(第8部分):Linkerd作为入口控制器

Linkerd旨在使应用程序内部服务间的通信安全,快速和可靠。但是,这些目标同样适用于网络的接入层(应用程序对外的服务)。在这篇文章中,我们将展示Linkerd...

5298
来自专栏A周立SpringCloud

Docker系列教程16-network命令

本文是一篇翻译,原文 https://docs.docker.com/engine/userguide/networking/work-with-network...

2.7K8
来自专栏电光石火

Apache IIS Tomcat共存,配置全能服务器

通过本文您可以架设一个支持asp、asp.net、php、jsp的全能主机。我们利用tomcat来运行JSP,用IIS和Apache来运行asp、asp.net...

3118
来自专栏电光石火

Apache IIS Tomcat共存,配置全能服务器

通过本文您可以架设一个支持asp、asp.net、php、jsp的全能主机。我们利用tomcat来运行JSP,用IIS和Apache来运行asp、asp.n...

3307
来自专栏机器之心

专栏 | 新手入门?一步一步教你如何安装PaddlePaddle

机器之心发布 来源:百度PaddlePaddle 不久之前,机器之心联合百度推出 PaddlePaddle 专栏,为想要学习这一平台的技术人员推荐相关教程与资源...

5307
来自专栏散尽浮华

Docker网络解决方案-Calico部署记录

Calico简单简介 Calico是一个纯三层的协议,为OpenStack虚机和Docker容器提供多主机间通信。Calico不使用重叠网络比如flannel和...

97210
来自专栏云计算教程系列

如何在Ubuntu 16.04上安装Ghost CMS

Ghost 1.0.0是Ghost内容管理系统(CMS)的第一个主要稳定版本。Ghost 1.0.0有一个全新的Markdown编辑器,刷新的用户界面,新的默认...

1976

扫码关注云+社区

领取腾讯云代金券