Docker 日志的5个最佳实践

过去的几年中,容器已经成为IT业界的一大热门话题,尤其是在DevOps方面。简单来说,容器提供了简单可扩展的可靠方案,来解决在不同环境中运行软件的问题。

容器将整个运行时环境打包,其中包括应用程序、依赖、代码库、二进制文件以及配置文件。

微服务与容器密切相关,它提供了更为灵活的应用开发方式。微服务构架下,一个应用程序被分为许多个松散的耦合服务,这些服务通过功能性的API相连接,而这些API分别处理不同的业务功能。没有庞大的代码库,微服务提供了一个“分而治之”的开发思路。

容器化应用软件部署平台Docker,是容器基础设施业界的领头羊。容器的真正价值在于,团队可以在进行任务的同时开启一个运行时环境。在将微服务向企业的推广中,Docker或许是当今最有影响力的平台。

通过向终端用户提供一个操作系统的多个实例,虚拟机简化了软件开发和测试。相似的,容器在应用和主机操作系统之间添加了一个虚拟层。两者之间的差别在于,容器仅运行一个操作系统实例,不需要系统管理程序。总之,容器所需要的内存和运行时间就大大减少了。

对所有的应用开发过程来说,日志记录都是一个核心部分,尤其是出错的时候特别有用。但容器化应用与传统应用的日志记录是不同的。对Docker来说,好的日志不仅要记录下应用和主机操作系统,还要记录Docker服务。目前,有很多种针对Docker化应用的日志技术和方法,以下是其中最佳的5个实践。

基于应用的日志记录

此种日志记录方式中,容器内的应用程序采用日志记录框架来处理日志记录过程。例如,一个Java应用程序可能采用Log4j2格式,将日志文件发送到远程服务器上,而绕开了Docker环境和操作系统。

尽管基于应用的日志记录方式将记录事件的最大控制权交给了开发者,但也对应用带来许多开销。这种方式对传统的应用环境来说更为适用,应为它允许开发者继续使用日志记录框架(比如Log4j2),无需再向主机添加日志功能。

使用数据卷

容器在属性上说,是短暂的,即容器中的所有文件都会随着容器的关闭而丢失。而在日志记录的问题上,容器要么将事件记录在一个集中的日志服务(比如Loggly),要么将时间记录到数据卷中。数据卷的定义是“容器内的标记目录,用于保存持久数据或共享数据”。

使用数据卷的优点在于,由于它跟主机目录关联,日志数据是持久的,且可以与其他容器共享。在容器发生故障或者关闭的时候,这种日志记录方式降低了丢失数据的可能性。点击这里(http://t.cn/RbDRTeP)可以查看在Ubuntu设置Docker数据卷的说明。

Docker日志驱动

第三种方式就是使用Docker平台的日志驱动,将日志事件记录在主机的系统日志实例上。Docker日志驱动直接从容器的标准输出和标准错误输出中读取日志事件;这种方式避免了对日志文件的读写,进而转化为性能增益。

但是,使用Docker日志驱动有以下几个缺点:

  • 不允许对日志进行解析,只能转发。
  • Docker日志命令只对日志驱动JSON文件有效。

  • 链接不到TCP服务器时,容器终止。

日志专用容器

这种方式最大的优点在于,允许日志事件完全在Docker环境中管理。日志专用容器可以收集其他容器的日志事件,将它们聚在一起,进行存储或转发到第三方服务。这种做法降低了对主机的依赖。

日志专用容器还有以下优点:

  • 自动采集、监控和分析日志事件。
  • 无需配置,自动对日志事件进行评分。

  • 可以通过日志事件、数据和Docker API数据等多方面数据进行日志检索。

Sidecar方法

Sidecar是目前较为流行的管理微服务架构的方法。它的概念来自挎斗摩托车的挎斗。 “Sidecar和服务并行,通过REST这种API连接到HTTP提供‘平台基础设施功能’”(http://t.cn/Rp80Mj8)。

从日志记录的角度看,sidecar方法的优点在于每个容器都与自己的日志记录容器相连接(应用容器保存了日志事件,日志记录容器对其进行分类并转发到像Loggly这种日志记录管理系统中)。

sidecar方法尤其适用于较大规模的部署,记录信息更加专业化,允许自定义分类。不过sidecar的设置也相当复杂。

标签:Docker 发布于:2019-11-08 08:17:31