非常教程

Docker 17参考手册

引擎: 扩展 | Engine: Extend

托管插件系统(引擎) | Managed plugin system (Engine)

Docker 引擎管理的插件系统

  • 安装和使用插件
  • 开发一个插件
  • 调试插件

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

有关 Docker Engine 1.12及更早版本中提供的传统插件系统的信息,请参阅了解传统 Docker 引擎插件。

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

安装和使用插件

插件以 Docker 镜像的形式发布,可以托管在 Docker Hub 或私有注册表中。

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

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

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

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

注意:本示例仅用于说明目的。创建卷后,在检查卷时,远程主机的SSH密码将作为纯文本公开。您应该在完成示例后立即删除该卷。

  1. 安装sshfs插件。$ docker 插件安装 vieux / sshfs 插件“vieux / sshfs”正在请求以下权限: - network:host - capabilities:CAP_SYS_ADMIN 您是否授予上述权限?y / N y vieux / sshfs 该插件请求2个权限:
- It needs access to the `host` network.
- It needs the `CAP_SYS_ADMIN` capability, which allows the plugin to run the `mount` command.
  1. 检查插件是否在输出中启用docker plugin ls。$ docker plugin ls ID名称标签说明已启用69553ca1d789 vieux / sshfs最新sshfs插件true
  2. 使用插件创建一个卷。本示例将/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
  3. 确认卷已成功创建。$ docker卷ls DRIVER名称vieux / sshfs sshvolume
  4. 启动一个使用该卷的容器sshvolume。$ docker run --rm -v sshvolume:/ data busybox ls / data <机器上的/ remote的内容1.2.3.4>
  5. 删除卷sshvolume docker卷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引擎进行通信。这个插件没有运行时参数。

创建插件

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

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

调试插件

插件的 stdout 被重定向到 dockerd 日志。这些条目有一个plugin=<ID>后缀。以下是docker f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62守护程序日志中 pluginID 及其相应日志条目的几个命令示例。

$ docker plugin install tiborvass/sample-volume-plugins

INFO[0036] Starting...       Found 0 volumes on startup  plugin=f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62
$ docker volume create -d tiborvass/sample-volume-plugins 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 容器运行时可用于调试插件。如果插件日志被重定向到文件,这特别有用。

$ docker-runc list
ID                                                                 PID         STATUS      BUNDLE                                                                                       CREATED
f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62   2679        running     /run/docker/libcontainerd/f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62	2017-02-06T21:53:03.031537592Z
r
$ docker-runc exec f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62 cat /var/log/plugin.log

如果插件具有内置的 shell,那么可以按照如下方式执行插件:

$ docker-runc exec -t f52a3df433b9aceee436eaada0752f5797aab1de47e5485f1690a073b860ff62 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,使用情况,插件,文档,开发人员

Docker 17

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

主页 https://docker.com/
源码 https://github.com/docker/docker
版本 17
发布版本 17.06