Docker插件是进程外扩展,可为Docker Engine添加功能。
什么是插件
插件是在与docker守护程序相同或不同的主机上运行的进程,该进程通过将文件放置在Plugin Discovery中描述的插件目录之一中的相同docker主机上进行注册。
插件具有易于理解的名称,它们是简短的小写字符串。例如, flocker
或weave
。
插件可以在容器内部或外部运行。目前建议在容器外运行它们。
插件发现
每当用户或容器尝试按名称使用插件时,Docker都会通过在插件目录中查找插件来发现插件。
可以将三种类型的文件放在插件目录中。
.sock
文件是UNIX域套接字。.spec
文件是包含URL的文本文件,例如unix:///other.sock
或tcp://localhost:8080
。.json
文件是包含插件完整json规范的文本文件。
具有UNIX域套接字文件的插件必须在同一docker主机上运行,而具有spec或json文件的插件可以在不同的主机上运行(如果指定了远程URL)。
UNIX域套接字文件必须位于/run/docker/plugins
,而spec文件可以位于/etc/docker/plugins
或/usr/lib/docker/plugins
。
文件名(不包括扩展名)确定插件名称。
例如, flocker
插件可能会产生在UNIX插座/run/docker/plugins/flocker.sock
。
如果要彼此隔离定义,可以将每个插件定义到一个单独的子目录中。例如,您可以创建flocker
下socket /run/docker/plugins/flocker/flocker.sock
只有安装/run/docker/plugins/flocker
里面flocker
容器。
Docker始终总是首先在/run/docker/plugins
搜索Unix套接字。如果套接字不存在,它将检查/etc/docker/plugins
和/usr/lib/docker/plugins
下的spec或json文件。一旦找到具有给定名称的第一个插件定义,目录扫描就会停止。
这是插件的JSON格式:
TLSConfig
字段是可选的,并且只有存在此配置时,才会验证TLS。
插件生命周期
升级插件时,您应该首先停止Docker守护进程,升级插件,然后再次启动Docker。
插件激活
当首次提到插件时-由用户按名称引用它(例如docker run --volume-driver=foo
)或已经配置为使用正在启动的插件的容器docker run --volume-driver=foo
在其中查找命名的插件插件目录,并通过握手将其激活。请参阅下面的握手API。
在Docker守护程序启动时不会自动激活插件。而是仅在需要时才懒惰地或按需激活它们。
系统套接字激活
service
文件(例如/lib/systemd/system/your-plugin.service
):
socket
文件(例如/lib/systemd/system/your-plugin.socket
):
这将允许在Docker守护程序连接到正在监听的套接字时实际启动插件(例如,守护程序首次使用它们,或者其中一个插件意外关闭)。
API设计
插件API是基于HTTP的RPC样式的JSON,非常类似于webhooks。
请求从 Docker守护程序到插件的流。因此,插件需要实现HTTP服务器,并将其绑定到“插件发现”部分中提到的UNIX套接字。
所有请求都是HTTP POST
请求。
该API通过Accept标头进行版本控制,当前始终将其设置为application/vnd.docker.plugins.v1+json
。
握手API
通过以下“握手” API调用激活插件。
要求:空体
响应:
响应此插件实现的Docker子系统列表。激活后,将向插件发送来自该子系统的事件。
可能的值为:
插件重试
尝试在插件上调用方法的尝试将以指数补偿的方式重试长达30秒。当将插件打包为容器时,这可能会有所帮助,因为它使插件容器有机会在依赖于它们的任何用户容器失败之前启动。
插件助手
原文链接:https://docs.docker.com.zh.xy2401.com/engine/extend/plugin_api/