Docker Engine 受管插件系统
Docker Engine 的插件系统允许您使用 Docker Engine 安装、启动、停止和移除插件。
有关传统(非受管)插件的信息,请参阅了解传统 Docker Engine 插件。
注意
目前 Windows 守护进程不支持 Docker Engine 受管插件。
安装和使用插件
插件以 Docker 镜像形式分发,可以托管在 Docker Hub 或私有 Registry 上。
要安装插件,请使用 docker plugin install
命令,该命令会从 Docker Hub 或您的私有 Registry 拉取插件,并在必要时提示您授予权限或能力,然后启用插件。
要检查已安装插件的状态,请使用 docker plugin ls
命令。成功启动的插件在输出中会显示为 enabled。
插件安装后,您可以将其用作其他 Docker 操作的选项,例如创建卷。
在以下示例中,您将安装 rclone
插件,验证其是否已启用,并使用它创建一个卷。
注意
此示例仅用于教学目的。
设置前置目录。默认情况下,它们必须存在于主机的以下位置:
/var/lib/docker-plugins/rclone/config
。保留用于rclone.conf
配置文件,即使为空且配置文件不存在,也必须存在。/var/lib/docker-plugins/rclone/cache
。包含插件状态文件以及可选的 VFS 缓存。
安装
rclone
插件。$ docker plugin install rclone/docker-volume-rclone --alias rclone Plugin "rclone/docker-volume-rclone" is requesting the following privileges: - network: [host] - mount: [/var/lib/docker-plugins/rclone/config] - mount: [/var/lib/docker-plugins/rclone/cache] - device: [/dev/fuse] - capabilities: [CAP_SYS_ADMIN] Do you grant the above permissions? [y/N]
该插件请求 5 项权限:
- 它需要访问
host
网络。 - 访问前置目录以挂载存储:
- 您的 Rclone 配置文件
- 临时缓存数据
- 授予对 FUSE(用户空间文件系统)设备的访问权限。这是必需的,因为 Rclone 使用 FUSE 将远程存储挂载为本地文件系统。
- 它需要
CAP_SYS_ADMIN
能力,这允许插件运行mount
命令。
- 它需要访问
检查插件在
docker plugin ls
命令的输出中是否已启用。$ docker plugin ls ID NAME DESCRIPTION ENABLED aede66158353 rclone:latest Rclone volume plugin for Docker true
使用插件创建一个卷。此示例将主机
1.2.3.4
上的/remote
目录挂载到名为rclonevolume
的卷中。现在可以将此卷挂载到容器中。
$ docker volume create \ -d rclone \ --name rclonevolume \ -o type=sftp \ -o path=remote \ -o sftp-host=1.2.3.4 \ -o sftp-user=user \ -o "sftp-password=$(cat file_containing_password_for_remote_host)"
验证卷是否已成功创建。
$ docker volume ls DRIVER NAME rclone rclonevolume
启动一个使用卷
rclonevolume
的容器。$ docker run --rm -v rclonevolume:/data busybox ls /data <content of /remote on machine 1.2.3.4>
移除卷
rclonevolume
$ docker volume rm rclonevolume sshvolume
要禁用插件,请使用 docker plugin disable
命令。要完全移除它,请使用 docker plugin remove
命令。有关其他可用命令和选项,请参阅命令行参考。
开发插件
rootfs 目录
rootfs
目录表示插件的根文件系统。在此示例中,它是从 Dockerfile 创建的:
注意
/run/docker/plugins
目录在插件的文件系统内部是强制性的,以便 Docker 与插件通信。
$ git clone https://github.com/vieux/docker-volume-sshfs
$ cd docker-volume-sshfs
$ docker build -t rootfsimage .
$ id=$(docker create rootfsimage true) # id was cd851ce43a403 when the image was created
$ sudo mkdir -p myplugin/rootfs
$ sudo docker export "$id" | sudo tar -x -C myplugin/rootfs
$ docker rm -vf "$id"
$ docker rmi rootfsimage
config.json 文件
config.json
文件描述了插件。请参阅插件配置参考。
请考虑以下 config.json
文件。
{
"description": "sshFS plugin for Docker",
"documentation": "https://docs.docker.net.cn/engine/extend/plugins/",
"entrypoint": ["/docker-volume-sshfs"],
"network": {
"type": "host"
},
"interface": {
"types": ["docker.volumedriver/1.0"],
"socket": "sshfs.sock"
},
"linux": {
"capabilities": ["CAP_SYS_ADMIN"]
}
}
此插件是卷驱动程序。它需要 host
网络和 CAP_SYS_ADMIN
能力。它依赖于 /docker-volume-sshfs
入口点,并使用 /run/docker/plugins/sshfs.sock
套接字与 Docker Engine 通信。此插件没有运行时参数。
创建插件
可以通过运行 docker plugin create <plugin-name> ./path/to/plugin/data
命令来创建新插件,其中插件数据包含插件配置文件 config.json
和子目录 rootfs
中的根文件系统。
之后,插件 <plugin-name>
将出现在 docker plugin ls
输出中。可以使用 docker plugin push <plugin-name>
将插件推送到远程 Registry。
调试插件
插件的标准输出会重定向到 dockerd 日志。此类条目带有 plugin=<ID>
后缀。以下是 pluginID f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62
的一些命令示例及其在 docker 守护进程日志中的相应日志条目。
$ docker plugin install tiborvass/sample-volume-plugin
INFO[0036] Starting... Found 0 volumes on startup plugin=f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62
$ docker volume create -d tiborvass/sample-volume-plugin samplevol
INFO[0193] Create Called... Ensuring directory /data/samplevol exists on host... plugin=f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62
INFO[0193] open /var/lib/docker/plugin-data/local-persist.json: no such file or directory plugin=f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62
INFO[0193] Created volume samplevol with mountpoint /data/samplevol plugin=f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62
INFO[0193] Path Called... Returned path /data/samplevol plugin=f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62
$ docker run -v samplevol:/tmp busybox sh
INFO[0421] Get Called... Found samplevol plugin=f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62
INFO[0421] Mount Called... Mounted samplevol plugin=f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62
INFO[0421] Path Called... Returned path /data/samplevol plugin=f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62
INFO[0421] Unmount Called... Unmounted samplevol plugin=f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62
使用 runc 获取日志文件并进入插件 shell。
使用 runc
(默认的 docker 容器运行时)通过收集重定向到文件的插件日志来调试插件。
$ sudo runc --root /run/docker/runtime-runc/plugins.moby list
ID PID STATUS BUNDLE CREATED OWNER
93f1e7dbfe11c938782c2993628c895cf28e2274072c4a346a6002446c949b25 15806 running /run/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby-plugins/93f1e7dbfe11c938782c2993628c895cf28e2274072c4a346a6002446c949b25 2018-02-08T21:40:08.621358213Z root
9b4606d84e06b56df84fadf054a21374b247941c94ce405b0a261499d689d9c9 14992 running /run/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby-plugins/9b4606d84e06b56df84fadf054a21374b247941c94ce405b0a261499d689d9c9 2018-02-08T21:35:12.321325872Z root
c5bb4b90941efcaccca999439ed06d6a6affdde7081bb34dc84126b57b3e793d 14984 running /run/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby-plugins/c5bb4b90941efcaccca999439ed06d6a6affdde7081bb34dc84126b57b3e793d 2018-02-08T21:35:12.321288966Z root
$ sudo runc --root /run/docker/runtime-runc/plugins.moby exec 93f1e7dbfe11c938782c2993628c895cf28e2274072c4a346a6002446c949b25 cat /var/log/plugin.log
如果插件有内置 shell,则可以按如下方式进入插件执行命令:
$ sudo runc --root /run/docker/runtime-runc/plugins.moby exec -t 93f1e7dbfe11c938782c2993628c895cf28e2274072c4a346a6002446c949b25 sh
使用 curl 调试插件套接字问题。
要验证 docker 守护进程与之通信的插件 API 套接字是否响应正常,请使用 curl。在此示例中,我们将使用 curl 7.47.0 从 docker 主机向卷和网络插件发出 API 调用,以确保插件正在监听所述套接字。对于运行正常的插件,这些基本请求应该能够工作。请注意,插件套接字位于主机上的 /var/run/docker/plugins/<pluginID>
目录下。
$ curl -H "Content-Type: application/json" -XPOST -d '{}' --unix-socket /var/run/docker/plugins/e8a37ba56fc879c991f7d7921901723c64df6b42b87e6a0b055771ecf8477a6d/plugin.sock http:/VolumeDriver.List
{"Mountpoint":"","Err":"","Volumes":[{"Name":"myvol1","Mountpoint":"/data/myvol1"},{"Name":"myvol2","Mountpoint":"/data/myvol2"}],"Volume":null}
$ curl -H "Content-Type: application/json" -XPOST -d '{}' --unix-socket /var/run/docker/plugins/45e00a7ce6185d6e365904c8bcf62eb724b1fe307e0d4e7ecc9f6c1eb7bcdb70/plugin.sock http:/NetworkDriver.GetCapabilities
{"Scope":"local"}
当使用 curl 7.5 及更高版本时,URL 格式应为 http://hostname/APICall
,其中 hostname
是安装插件的有效主机名,APICall
是对插件 API 的调用。
例如,http://localhost/VolumeDriver.List