Docker Engine 管理的插件系统
Docker Engine 的插件系统允许您使用 Docker Engine 安装、启动、停止和删除插件。
有关旧版(非托管)插件的信息,请参阅 了解旧版 Docker 引擎插件。
笔记
Windows 守护进程当前不支持 Docker 引擎管理的插件。
安装和使用插件
插件作为 Docker 镜像分发,可以托管在 Docker Hub 或私有注册表上。
要安装插件,请使用该docker plugin install
命令,该命令会从 Docker Hub 或您的私有注册表中提取插件,提示您授予权限或功能(如果需要),然后启用该插件。
要检查已安装插件的状态,请使用以下docker plugin ls
命令。成功启动的插件在输出中列为已启用。
安装插件后,您可以将其用作其他 Docker 操作的选项,例如创建卷。
在以下示例中,您安装该sshfs
插件,验证它是否已启用,并使用它创建卷。
笔记
该示例仅用于指导目的。创建卷后,在检查该卷时,远程主机的 SSH 密码将以明文形式公开。完成示例后立即删除该卷。
安装
sshfs
插件。$ docker plugin install vieux/sshfs Plugin "vieux/sshfs" is requesting the following privileges: - network: [host] - capabilities: [CAP_SYS_ADMIN] Do you grant the above permissions? [y/N] y vieux/sshfs
该插件请求 2 个权限:
- 它需要访问
host
网络。 - 它需要
CAP_SYS_ADMIN
允许插件运行mount
命令的功能。
- 它需要访问
检查 的输出中是否启用了该插件
docker plugin ls
。$ docker plugin ls ID NAME TAG DESCRIPTION ENABLED 69553ca1d789 vieux/sshfs latest the `sshfs` plugin true
使用插件创建一个卷。此示例将
/remote
主机上的目录安装1.2.3.4
到名为 的卷中sshvolume
。现在可以将该卷安装到容器中。
$ docker volume create \ -d vieux/sshfs \ --name sshvolume \ -o sshcmd=user@1.2.3.4:/remote \ -o password=$(cat file_containing_password_for_remote_host) sshvolume
验证卷是否已成功创建。
$ docker volume ls DRIVER NAME vieux/sshfs sshvolume
启动一个使用该卷的容器
sshvolume
。$ docker run --rm -v sshvolume:/data busybox ls /data <content of /remote on machine 1.2.3.4>
删除音量
sshvolume
$ docker volume rm sshvolume sshvolume
要禁用插件,请使用该docker plugin disable
命令。要完全删除它,请使用该docker plugin remove
命令。有关其他可用命令和选项,请参阅
命令行参考。
开发插件
根文件系统目录
该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://docker.github.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 引擎进行通信。该插件没有运行时参数。
创建插件
docker plugin create <plugin-name> ./path/to/plugin/data
可以通过运行插件数据包含插件配置文件config.json
和子目录中的根文件系统的位置来创建新插件
rootfs
。
之后插件<plugin-name>
将显示在docker plugin ls
.可以使用 .push 将插件推送到远程注册表
docker plugin push <plugin-name>
。
调试插件
插件的标准输出被重定向到 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