非常教程

Docker 17参考手册

引擎: 扩展 | Engine: Extend

Docker日志驱动程序插件 | Docker log driver plugins

日志驱动程序插件

本文档介绍了Docker的日志驱动程序插件。

记录驱动程序使用户能够将容器日志转发到其他服务进行处理。Docker包含几个日志驱动程序作为内置函数,但不能希望通过内置驱动程序支持所有的使用情况。插件允许Docker支持广泛的日志记录服务,而无需在主要Docker代码库中为这些服务嵌入客户端库。有关更多信息,请参阅插件文档。

创建日志插件

日志插件的主界面使用与其他插件类型使用的相同的JSON + HTTP RPC协议。请参阅示例插件以获取日志插件的参考实现。这个例子包装了内置的jsonfilelog日志驱动程序。

LogDriver协议

记录插件必须在插件激活期间注册为LogDriver。一旦激活的用户可以指定插件作为日志驱动程序。

有两个日志插件必须实现的HTTP端点:

/LogDriver.StartLogging

向插件发信号通知容器正在启动,插件应该开始接收日志。

日志将通过请求中定义的文件进行流式传输。在Linux上,这个文件是一个FIFO。Windows上目前不支持日志记录插件。

请求*

{
		"File": "/path/to/file/stream",
		"Info": {
			"ContainerID": "123456"
		}
}

File是需要使用的日志流的路径。每次调用都StartLogging应该提供不同的文件路径,即使它是插件已经收到日志的容器。该文件由docker用随机生成的名称创建。

Info是有关正在记录的容器的详细信息。这是相当自由的形式,但是由以下结构定义来定义:

type Info struct {
	Config              map[string]string
	ContainerID         string
	ContainerName       string
	ContainerEntrypoint string
	ContainerArgs       []string
	ContainerImageID    string
	ContainerImageName  string
	ContainerCreated    time.Time
	ContainerEnv        []string
	ContainerLabels     map[string]string
	LogPath             string
	DaemonName          string
}

ContainerID 将始终提供此结构,但其他字段可能为空或缺失。

响应

{
	"Err": ""
}

如果在此请求期间发生错误,请将错误消息添加到Err响应中的字段。如果没有错误,那么你可以发送一个空的响应({})或一个空的值的Err字段。

此时驱动程序应该使用传入文件中的日志消息。如果消息未被使用,它可能会导致容器在尝试写入其stdio流时被阻塞。

日志流消息被编码为协议缓冲区。protobuf定义在docker仓库中。

由于协议缓冲区不是自分隔的,所以必须使用以下流格式从流中解码它们:

[size][message]

在哪里size是一个4字节的大端二进制编码uint32。size在这种情况下定义下一个消息的大小。message是实际的日志条目。

流编码器/解码器的参考golang实现可以在这里找到

/LogDriver.StopLogging

指示插件停止从定义的文件中收集日志。一旦收到响应,该文件将被Docker删除。在回应此请求之前,您必须确保收集流上的所有日志,否则可能会丢失日志数据。

此端点上的请求并不意味着该容器仅在已停止的情况下被移除。

请求:

{
		"File": "/path/to/file/stream"
}

响应:

{
	"Err": ""
}

如果在此请求期间发生错误,请将错误消息添加到Err响应中的字段。如果没有错误,那么你可以发送一个空的响应({})或一个空的值的Err字段。

可选端点

日志记录插件可以实现两个额外的日志记录端点:

/LogDriver.Capabilities

定义日志驱动程序的功能。您必须为Docker实现此端点才能利用任何已定义的功能。

请求:

{}

响应

{
	"ReadLogs": true
}

支助能力:

  • ReadLogs - 这告诉Docker该插件能够将日志读回客户端。报告他们支持的插件ReadLogs必须实现/LogDriver.ReadLogs端点/LogDriver.ReadLogs将日志读回客户端。这在docker logs <container>被调用时使用。为了让Docker使用这个端点,插件必须在/LogDriver.Capabilities被调用时指定多少。

请求

"ReadConfig": {}, "Info": { "ContainerID": "123456" } }

ReadConfig是阅读选项列表,它定义了一个具有以下golang结构:类型ReadConfig结构{由于尾了time.time int跟随bool}

  • Since定义应该发送的最旧日志。
  • Tail定义要读取的行数(例如,像命令tail -n 10
  • Follow 表示客户希望保持连接状态,以便在读取现有日志后收到新的日志消息。

Info是在中定义的相同类型/LogDriver.StartLogging。它应该用于确定要读取的日志集合。

响应:

响应应该是编码的日志消息,使用与插件从Docker消耗的消息相同的格式。

示例,用法,插件,docker,文档,用户指南,日志记录

Docker 17

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

主页 https://docker.com/
源码 https://github.com/docker/docker
版本 17
发布版本 17.06