当前位置: 首页 > 面试题库 >

如何使用Docker运送微服务架构中的日志?

潘国源
2023-03-14
问题内容

Heroku在其十二要素应用清单中将日志描述为简单的事件流:

日志是从所有正在运行的进程和支持服务的输出流中收集的按时间排序的聚合事件流。原始格式的日志通常是一种文本格式,每行一个事件(尽管来自异常的回溯可能跨越多行)。日志没有固定的开头或结尾,但是只要应用程序正在运行,日志就会连续不断地流动。

此外,应用程序应只将日志写入stdout,而将任务留在“环境”中。

十二要素应用程序永远不会将自己的输出流路由或存储。它不应尝试写入或管理日志文件。而是,每个正在运行的进程将其未缓冲的事件流写入stdout。在本地开发期间,开发人员将在其终端的前台查看此流,以观察应用程序的行为。

在登台或生产部署中,每个流程的流都将由执行环境捕获,并与应用程序中的所有其他流一起整理,并路由到一个或多个最终目标以进行查看和长期存档。这些存档目标对应用程序不可见或不可配置,而是由执行环境完全管理。开源日志路由器(例如Logplex和Fluent)可用于此目的。

那么,就可靠性,效率和易用性而言,在docker环境中实现此目标的最佳方法是什么?我认为以下问题浮现在脑海:

  • 依靠Docker自己的日志工具(docker logs)安全吗?
  • 在不分离的情况下运行docker并将其输出视为日志流是否安全?
  • 可以stdout直接重定向到文件(磁盘空间)吗?
  • 如果使用文件,它应该在docker映像中还是在绑定的卷(docker run --volume=[])中?
  • 是否需要对数旋转?
  • 将stdout直接重定向到logshipper(和哪个logshipper)是否安全?
  • 是否可以选择命名管道(又名FIFO)?
  • (还有其他问题吗?)

问题答案:

Docker 1.6 引入了日志驱动程序的概念,以提供对日志输出的更多控制。的--log- driver标志提供配置,其中stdoutstderr从在容器中运行的进程应被定向。另请参阅配置日志记录驱动程序。

有几个驱动程序可用。请注意,除了json-file禁用以外,所有这些都禁止使用docker logs收集容器日志。

  • 无-禁用容器日志。
  • json-file-行为与以前相同,其中json格式的stdout可在 /var/lib/docker/containers/<containerid>/<containerid>-json.log
  • syslog-将消息写入syslog。还接受--log-opt通过TCP,UDP或Unix域套接字将日志消息定向到指定的syslog。也禁用docker logs
  • 日志-写入系统日志。
    • gelf-Graylog扩展日志格式(GELF)。将日志消息写入GELF端点,例如Graylog或Logstash
    • fluentd-将容器日志发送到fluentd。接受一些选项以定制流利的地址并发送带有日志消息的标签。
  • ** awslogs-将日志消息写入AWS CloudWatch Logs

  • Docker 1.8的新功能

** Docker 1.9的新功能

例如:

docker run --log-driver=syslog --log-opt syslog-address=tcp://10.0.0.10:1514 ...

这是Docker推荐的软件解决方案,可将其日志消息写入stdoutstderr。但是,某些软件不会将日志消息写入stdout/stderr。例如,它们改为写入日志文件或syslog。在这种情况下,下面原始答案中的某些细节仍然适用。回顾一下:

如果应用程序写入本地日志文件,请从主机挂载卷(或使用仅数据容器到该容器,然后将日志消息写入该位置。

如果应用程序写入syslog,则有以下几种选择:

  • 通过使用将主机的syslog套接字(/dev/log)安装到容器,将其发送到主机的syslog -v /dev/log:/dev/log
  • 如果应用程序在其配置中接受syslog终结点,请配置主机的syslog守护程序以侦听Docker桥网络上的TCP和/或UDP,然后使用该终结点。或者只是发送到远程系统日志主机。
  • 在容器中运行syslog守护程序,并使用Docker链接从其他正在运行的容器中访问它。
  • 使用logspout通过UDP自动将容器日志路由到远程系统日志

不要忘记,容器中的所有日志都应该像在主机OS上一样进行轮换。

依靠Docker自己的日志工具(docker日志)是否安全?

docker logs每次都打印整个流,而不仅仅是新的日志,因此不合适。docker logs --follow将提供tail -f类似的功能,但随后您将始终运行一个Docker CLI命令。因此,尽管可以 安全 运行docker logs,但不是最佳选择。

在不分离的情况下运行docker并将其输出视为日志流是否安全?

您可以使用systemd而不是守护进程来启动容器,从而将所有stdout捕获到systemd日志中,然后可由主机根据需要进行管理。

可以将stdout直接重定向到文件(磁盘空间)吗?

docker run ... > logfile当然可以做到这一点,但是自动化和管理起来感觉很脆弱并且更加困难。

如果使用文件,它应该在docker映像内还是绑定的卷内(docker run –volume = [])?

如果您在容器中写入内容,则需要运行logrotate或容器中的某些内容来管理日志文件。最好从主机挂载卷并使用主机的日志轮换守护程序对其进行控制。

是否需要对数旋转?

当然,如果该应用编写日志,则需要像在本机OS环境中一样旋转日志。但是,如果您在容器内部进行写操作会比较困难,因为日志文件的位置不太可预测。如果在主机上旋转,则日志文件将位于以下位置,例如,以devicemapper作为存储驱动程序/var/lib/docker/devicemapper/mnt/<containerid>/rootfs/...。要使logrotate在该路径下查找日志,将需要一些难看的包装器。

将stdout直接重定向到logshipper(和哪个logshipper)是否安全?

最好使用syslog,并让日志收集器处理syslog。

是否可以选择命名管道(又名FIFO)?

命名管道不是理想的,因为如果管道的读取端死了,则编写器(容器)将遇到断线的情况。即使该事件由应用处理,也将被阻止,直到再次有读者为止。加上它规避docker logs

另请参阅流利使用docker的这篇文章。

请参阅Jeff
Lindsay的工具logspout,该工具从正在运行的容器中收集日志并根据需要路由它们。

最后,请注意,容器中的stdout将记录到主机中的文件中/var/lib/docker/containers/<containerid>/<containerid>-json.log



 类似资料:
  • 本文向大家介绍微服务架构是如何运作的?相关面试题,主要包含被问及微服务架构是如何运作的?时的应答技巧和注意事项,需要的朋友参考一下 微服务架构具有以下组件: Clients – 来自不同设备的不同用户发送请求。 Identity Providers – 对用户或客户端身份进行身份验证,并颁发安全令牌。 API Gateway – 处理客户端请求。 Static Content – 容纳系统的所有内

  • 我正在构建一个基于Spring启动中的微服务架构的项目。该项目分为多个模块,我使用了 maven 依赖项管理。 现在我想在另一个模块中使用一个模块的服务。我有很多Spring申请。例如,我有两个名为A和B的应用程序。我想在B中使用A中的类,在A中使用B中的类。在这种情况下,我使用了maven依赖项,但这并不完全是在另一个应用程序中使用服务的方式,因为我面临循环依赖。 该如何解决这个问题?

  • 我读了一些文章,看了一些视频,但在为这些微服务提供服务方面,没有找到具体的建议。我的理解是,他们应该使用自己的应用程序服务器。 我的问题是它们应该部署在不同的服务器上,还是没关系。 当它们在同一台服务器(计算机)上提供服务时,不会有端口冲突吗?

  • Kubernetes 设计之初就是按照 Cloud Native 的理念设计的,Cloud Native 中有个重要概念就是微服务的架构设计,当将单体应用拆分微服务后, 随着服务数量的增多,如何微服务进行管理以保证服务的 SLA 呢?为了从架构层面上解决这个问题,解放程序员的创造性,避免繁琐的服务发现、监控、分布式追踪等事务,Service mesh 应运而生。 微服务 下图是Bilgin Ibr

  • 准备工作 安装软件 版本 功能 必要程度 Docker 1.12.1 Docker 是 CentOS7.0或其他系统 7.0 Docker的宿主机,本章的讲解都是在CentOS 7.0下进行的。Docker现已支持Windows系统,但考虑到绝大多数Docker容器还是跑在Linux环境下的,故而只讲解Linux环境下的使用。Windows下的安装使用大致类似,请读者自行研究。 是 Maven 3

  • 前文提到的Dockerfile 可以让用户管理一个单独的容器,那幺如果我要管理多个容器呢,例如:我需要管理一个Web应用的同时还要加上其后端的数据库服务容器呢?Compose就是这样的一个工具。让我们看下官网对Compose的定义: Compose 是一个用于定义和运行多容器的Docker应用的工具。使用Compose,你可以在一个配置文件(yaml格式)中配置你应用的服务,然后使用一个命令,即可