Docker 插件 API

Docker 插件是进程外扩展,可为 Docker Engine 添加功能。

本文档描述了 Docker Engine 插件 API。有关 Docker Engine 管理的插件的信息,请参阅Docker Engine 插件系统

本页面适用于想要开发自己的 Docker 插件的人。如果您只是想了解或使用 Docker 插件,请查看此处

什么是插件

插件是在与 Docker 守护进程相同或不同的主机上运行的进程,通过在守护进程主机的插件目录之一(如插件发现中所述)中放置文件来注册自身。

插件具有易于理解的名称,它们是简短的小写字符串。例如,flockerweave

插件可以在容器内部或外部运行。目前建议在容器外部运行它们。

插件发现

当用户或容器尝试按名称使用插件时,Docker 会在插件目录中查找以发现插件。

插件目录中可以放置三种类型的文件。

  • .sock 文件是 Unix 域套接字。
  • .spec 文件是包含 URL 的文本文件,例如 unix:///other.socktcp://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

页面选项