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 守护进程在同一主机上运行。带有 .spec
或 .json
文件的插件如果您指定远程 URL,则可以在不同的主机上运行。
Unix 域套接字文件必须位于 /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
进行套接字激活。官方的 Plugins helpers 原生支持套接字激活。为了使插件能够进行套接字激活,它需要一个 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.target
socket
文件(例如 /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 是 RPC 风格的 JSON over HTTP,非常类似于 webhooks。
请求从 Docker 守护进程流向插件。插件需要实现一个 HTTP 服务器,并将其绑定到“插件发现”部分中提到的 Unix 套接字。
所有请求都是 HTTP POST
请求。
API 通过 Accept 头进行版本控制,目前该头始终设置为 application/vnd.docker.plugins.v1+json
。
握手 API
插件通过以下“握手” API 调用激活。
/Plugin.Activate
请求:空主体
响应
{
"Implements": ["VolumeDriver"]
}
响应包含此插件实现的 Docker 子系统列表。激活后,插件将接收来自此子系统的事件。
可能的值为
插件重试
调用插件方法的尝试会以指数退避方式重试,最长可达 30 秒。这在将插件打包为容器时可能会有所帮助,因为它让插件容器有机会启动,然后再导致依赖它们的任何用户容器失败。
插件帮助工具
为了简化插件开发,我们在 docker/go-plugins-helpers 提供了适用于 Docker 当前支持的每种插件的 sdk
。