Docker Engine 管理的插件系统
Docker Engine 的插件系统允许您使用 Docker Engine 安装、启动、停止和移除插件。
有关传统(非托管)插件的信息,请参阅 了解传统 Docker 引擎插件。
注意
Docker Engine 管理的插件目前在 Windows 守护程序上不受支持。
安装和使用插件
插件以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个权限:
- It needs access to the
hostnetwork. - It needs the
CAP_SYS_ADMINcapability, which allows the plugin to run themountcommand.
- It needs access to the
检查插件是否在
docker plugin ls的输出中启用。$ docker plugin ls ID NAME TAG DESCRIPTION ENABLED 69553ca1d789 vieux/sshfs latest the `sshfs` plugin true使用插件创建一个卷。 此示例将主机
1.2.3.4上的/remote目录挂载到名为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://docs.docker.com/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 来创建一个新的插件,其中插件
数据包含一个插件配置文件 config.json 和一个位于子目录 rootfs 中的根文件系统。
之后,插件 将会出现在 docker plugin ls 中。
插件可以通过 docker plugin push 推送到远程注册表。
调试插件
插件的标准输出被重定向到dockerd日志中。这些条目有一个plugin=后缀。以下是一些针对插件ID 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/下。
$ 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