Docker Engine管理的插件系统

Docker Engine的插件系统允许您使用Docker Engine安装,启动,停止和删除插件。

有关旧版(非托管)插件的信息,请参阅 了解旧版Docker Engine插件

笔记

Windows守护程序当前不支持Docker Engine管理的插件。

安装和使用插件

插件以Docker映像的形式分发,可以托管在Docker Hub或私有注册表上。

要安装插件,请使用docker plugin install命令,该命令将从Docker Hub或您的私有注册表中拉出插件,并在必要时提示您授予权限或功能,并启用该插件。

要检查已安装插件的状态,请使用docker plugin ls命令。成功启动的插件在输出中列出为已启用。

安装插件后,您可以将其用作另一个Docker操作的选项,例如创建卷。

在以下示例中,您将安装sshfs插件,确认已启用该插件,然后使用它来创建卷。

笔记

本示例仅用于指导目的。一旦创建了该卷,在检查该卷时,您到远程主机的SSH密码将以纯文本形式公开。完成示例后,应立即删除该卷。

  1. 安装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命令。
  2. 检查是否在的输出中启用了插件docker plugin ls

    $ docker plugin ls
    
    ID                    NAME                  TAG                 DESCRIPTION                   ENABLED
    69553ca1d789          vieux/sshfs           latest              the `sshfs` plugin            true
    
  3. 使用插件创建一个卷。本示例将/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
    
  4. 验证该卷已成功创建。

    $ docker volume ls
    
    DRIVER              NAME
    vieux/sshfs         sshvolume
    
  5. 启动一个使用该卷的容器sshvolume

    $ docker run --rm -v sshvolume:/data busybox ls /data
    
    <content of /remote on machine 1.2.3.4>
    
  6. 移除音量 sshvolume

    docker volume rm sshvolume
    
    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.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 Engine通信。该插件没有运行时参数。

创建插件

可以通过运行docker plugin create <plugin-name> ./path/to/plugin/data插件数据来创建新插件 ,该插件数据config.json在子目录中包含插件配置文件和根文件系统rootfs

之后,该插件<plugin-name>将显示在中docker plugin ls。可以使用将插件推送到远程注册表 docker plugin push <plugin-name>

调试插件

插件的标准输出重定向到dockerd日志。此类条目具有 plugin=<ID>后缀。这是docker f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62daemon日志中用于pluginID及其相应日志条目的命令的一些示例 。

$ 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

使用docker-runc获取日志文件和shell到插件中。

docker-runc,默认Docker容器运行时可用于调试插件。如果将插件日志重定向到文件,这对于收集插件日志特别有用。

$ sudo docker-runc --root /var/run/docker/plugins/runtime-root/moby-plugins 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 docker-runc --root /var/run/docker/plugins/runtime-root/moby-plugins exec 93f1e7dbfe11c938782c2993628c895cf28e2274072c4a346a6002446c949b25 cat /var/log/plugin.log

如果插件具有内置的外壳,则可以按以下步骤执行对插件的执行:

$ sudo docker-runc --root /var/run/docker/plugins/runtime-root/moby-plugins 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

API用法插件文档开发人员