Docker 插件 API
Docker 插件是进程外扩展,可为 Docker Engine 添加功能。
本文档描述了 Docker Engine 插件 API。要查看由 Docker Engine 管理的插件信息,请参阅 Docker Engine 插件系统。
此页面面向希望开发自己的 Docker 插件的用户。 如果您只想了解或使用 Docker 插件,请查看 此处。
哪些插件是
插件是一个在 Docker 守护进程所在的主机或不同主机上运行的进程, 它通过在守护进程主机的插件目录中放置文件来注册自身, 这些目录在 插件发现中描述。
插件具有人类可读的名称,这些名称是简短的小写字符串。例如,flocker或weave。
插件可以在容器内部或外部运行。目前推荐在容器外部运行它们。
插件发现
当用户或容器尝试通过名称使用插件时,Docker 会通过检查插件目录来发现这些插件。
插件目录中可以放入三种类型的文件。
.sock个文件是 Unix 域套接字。.spec个文件是包含 URL 的文本文件,例如unix:///other.sock或tcp://localhost:8080。.json个文件是包含插件完整 JSON 规范的文本文件。
使用 Unix 域套接字文件的插件必须在与 Docker 守护进程相同的主机上运行。
如果指定了远程 URL,则具有 .spec 或 .json 文件的插件可以在不同的主机上运行。
Unix domain socket 文件必须位于 /run/docker/plugins 下,而 spec 文件可以位于 /etc/docker/plugins 或 /usr/lib/docker/plugins 下。
文件的名称(不包括扩展名)决定了插件的名称。
例如,flocker 插件可能会在
/run/docker/plugins/flocker.sock 处创建一个 Unix 套接字。
如果您希望将各个插件的定义相互隔离,可以将每个插件定义在单独的子目录中。
例如,您可以在 /run/docker/plugins/flocker/flocker.sock 下创建 flocker 套接字,并仅在 flocker 容器内挂载 /run/docker/plugins/flocker。
Docker 始终首先在 /run/docker/plugins 中搜索 Unix 套接字。如果套接字不存在,它会检查 /etc/docker/plugins 和 /usr/lib/docker/plugins 下的 spec 或 json 文件。目录扫描在找到第一个具有给定名称的插件定义后立即停止。
JSON 规范
这是插件的 JSON 格式:
{
"Name": "plugin-example",
"Addr": "https://example.com/docker/plugin",
"TLSConfig": {
"InsecureSkipVerify": false,
"CAFile": "/usr/shared/docker/certs/example-ca.pem",
"CertFile": "/usr/shared/docker/certs/example-cert.pem",
"KeyFile": "/usr/shared/docker/certs/example-key.pem"
}
}TLSConfig 字段是可选的,仅当存在此配置时才会验证 TLS。
插件生命周期
插件应在 Docker 之前启动,在 Docker 之后停止。例如,当为支持 systemd 的平台打包插件时,您可能会使用
systemd 依赖项 来
管理启动和关闭顺序。
在升级插件时,您应该先停止 Docker 守护程序,升级插件,然后再次启动 Docker。
插件激活
当首次引用插件时——无论是用户通过名称引用(例如 docker run --volume-driver=foo)还是已配置使用插件的容器启动——Docker 都会在插件目录中查找该命名插件并使用握手激活它。请参阅下面的握手 API。
插件在 Docker 守护程序启动时不会自动激活。相反, 只有在需要时才会按需或惰性地激活它们。
Systemd 套接字激活
插件也可以通过 systemd 进行套接字激活。官方
插件助手
原生支持套接字激活。为了让插件能够被套接字激活,它需要一个 service 文件和一个 socket 文件。
service 文件(例如 /lib/systemd/system/your-plugin.service):
[Unit]
Description=Your plugin
Before=docker.service
After=network.target your-plugin.socket
Requires=your-plugin.socket docker.service
[Service]
ExecStart=/usr/lib/docker/your-plugin
[Install]
WantedBy=multi-user.targetsocket 文件(例如 /lib/systemd/system/your-plugin.socket):
[Unit]
Description=Your plugin
[Socket]
ListenStream=/run/docker/plugins/your-plugin.sock
[Install]
WantedBy=sockets.target这将允许插件在 Docker 守护程序连接到它们正在监听的套接字时实际启动(例如守护程序首次使用它们时,或者其中一个插件意外关闭时)。
API 设计
插件 API 是基于 HTTP 的 RPC 风格 JSON,类似于 Webhook。
请求从 Docker 守护进程流向插件。插件需要实现一个 HTTP 服务器,并将其绑定到“插件发现”部分中提到的 Unix 套接字。
所有请求均为 HTTP POST 请求。
API 通过 Accept 标头进行版本控制,目前始终设置为
application/vnd.docker.plugins.v1+json。
Handshake API
插件通过以下“握手”API 调用激活。
/Plugin.Activate
请求:空正文
响应:
{
"Implements": ["VolumeDriver"]
}响应并列出此插件实现的 Docker 子系统。 激活后,插件将接收来自该子系统的事件。
可能的值为:
插件重试
对插件的方法调用会在最多30秒内以指数退避的方式重试。这在将插件打包为容器时可能会有所帮助,因为它为依赖于它们的用户容器提供了插件容器启动的机会,然后再使它们失败。
插件助手
为了简化插件开发,我们为 Docker 当前支持的每种插件类型提供了 sdk,位于
docker/go-plugins-helpers。