Docker Engine 托管插件系统

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

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

注意

Windows 守护程序目前不支持 Docker Engine 托管插件。

安装和使用插件

插件作为 Docker 镜像分发,可以托管在 Docker Hub 或 私有注册表。

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

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

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

在以下示例中,您将安装插件,验证它是否为 enabled,并使用它来创建卷。sshfs

注意

此示例仅用于说明目的。一旦卷为 created,则远程主机的 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_ADMINmount
  2. 检查插件是否在 的输出中已启用。docker plugin ls

    $ docker plugin ls
    
    ID                    NAME                  TAG                 DESCRIPTION                   ENABLED
    69553ca1d789          vieux/sshfs           latest              the `sshfs` plugin            true
    
  3. 使用插件创建卷。 此示例将主机上的目录挂载到 名为 的卷。/remote1.2.3.4sshvolume

    此卷现在可以挂载到容器中。

    $ 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. 启动使用 volume .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 disabledocker plugin remove

开发插件

rootfs 目录

该目录表示插件的根文件系统。在这个 example,它是从 Dockerfile 创建的:rootfs

注意

该目录在 plugin 的文件系统,以便 Docker 与插件通信。/run/docker/plugins

$ 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 文件

该文件描述了插件。请参阅 plugins 配置参考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"]
  }
}

此插件是一个卷驱动程序。它需要一个网络和能力。它依赖于入口点并使用套接字进行通信 与 Docker Engine 一起使用。此插件没有运行时参数。hostCAP_SYS_ADMIN/docker-volume-sshfs/run/docker/plugins/sshfs.sock

创建插件

可以通过在插件 data 包含一个插件配置文件和一个根文件系统 in 子目录 。docker plugin create <plugin-name> ./path/to/plugin/dataconfig.jsonrootfs

之后,插件将显示在 中。 可以使用 .<plugin-name>docker plugin lsdocker plugin push <plugin-name>

调试插件

插件的 stdout 被重定向到 dockerd 日志。此类条目具有后缀。以下是 pluginID 及其 docker 守护程序日志中的相应日志条目。plugin=<ID>f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62

$ 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 放入插件中。

使用 ,默认的 docker 容器运行时,用于调试插件 收集重定向到文件的插件日志。runc

$ 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,那么 exec into 插件可以像 遵循:

$ sudo runc --root /run/docker/runtime-runc/plugins.moby exec -t 93f1e7dbfe11c938782c2993628c895cf28e2274072c4a346a6002446c949b25 sh

使用 curl 调试插件套接字问题。

验证 docker 守护程序与之通信的插件 API 套接字 是响应式的,请使用 curl。在此示例中,我们将从 docker host 添加到卷和网络插件中,以确保 插件正在侦听所述套接字。对于运行良好的插件, 这些基本请求应该有效。请注意,插件套接字位于主机上的/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 应采用以下格式,其中 是有效的主机名,其中 plugin 已安装,并且是对插件 API 的调用。http://hostname/APICallhostnameAPICall

例如http://localhost/VolumeDriver.List