Docker 卷插件
Docker Engine 卷插件使 Engine 部署能够与外部存储系统(例如 Amazon EBS)集成,并使数据卷的存续时间能够超越单个 Docker 主机的生命周期。有关更多信息,请参阅插件文档。
更新日志
1.13.0
- 如果作为 v2 插件架构的一部分,插件返回路径中包含的挂载点必须挂载在插件配置中指定的目录下
PropagatedMount(
1.12.0
1.10.0
1.8.0
- 对存储卷驱动程序的初步支持 ( #14659)
命令行更改
要让容器访问卷,请在 docker container run 命令上使用 --volume 和 --volume-driver 标志。--volume(或 -v)标志接受主机上的卷名称和路径,而 --volume-driver 标志接受驱动程序类型。
$ docker volume create --driver=flocker volumename
$ docker container run -it --volume volumename:/data busybox sh
--volume
--volume(或 -v)标志接受一个值为 <volume_name>:<mountpoint> 格式的数值。该值的两个部分由冒号(:)字符分隔。
- 卷名是卷的可读名称,不能以
/字符开头。在本主题的其余部分中,它被称为volume_name。 Mountpoint是卷在主机上(v1)或插件中(v2)可用的路径。
volumedriver
指定 volumedriver 结合 volumename 使您可以
使用诸如
Flocker 之类的插件来管理
单个主机之外的卷,例如 EBS 上的卷。
创建一个 VolumeDriver
容器创建端点(/containers/create)接受一个类型为 string 的 VolumeDriver 字段,用于指定驱动程序的名称。如果未指定,则默认为 "local"(本地卷的默认驱动程序)。
卷插件协议
如果插件在激活时将自己注册为 VolumeDriver,则它必须向 Docker Daemon 提供主机文件系统中的可写路径。Docker 守护进程将这些路径提供给容器使用。Docker 守护进程通过 bind-mount(绑定挂载)将提供的路径挂载到容器中,使卷可用。
注意
卷插件不应将数据写入
/var/lib/docker/目录, 包括/var/lib/docker/volumes。/var/lib/docker/目录 保留给 Docker 使用。
/VolumeDriver.Create
请求:
{
"Name": "volume_name",
"Opts": {}
}指示插件用户希望创建一个卷,并提供用户指定的卷名称。插件此时还无需在文件系统中实际创建该卷(直到调用 Mount)。
Opts 是一个包含从用户请求传递过来的驱动程序特定选项的映射。
响应:
{
"Err": ""
}如果发生错误,请返回一个字符串错误。
/VolumeDriver.Remove
请求:
{
"Name": "volume_name"
}从磁盘删除指定的卷。当用户调用 docker rm -v 以移除与容器关联的卷时,将发出此请求。
响应:
{
"Err": ""
}如果发生错误,请返回一个字符串错误。
/VolumeDriver.Mount
请求:
{
"Name": "volume_name",
"ID": "b87d7442095999a92b65b3d9691e697b61713829cc0ffd1bb72e4ccd51aa4d6c"
}Docker 需要插件根据用户指定的卷名称来提供存储卷。Mount 方法会在每次容器启动时被调用一次。如果同一个 volume_name 被多次请求,插件可能需要跟踪每个新的挂载请求,并在首次挂载请求时进行资源预置,在最后一次对应的卸载请求时释放资源。
ID 是请求挂载的调用者的唯一 ID。
响应:
v1
{ "Mountpoint": "/path/to/directory/on/host", "Err": "" }v2
{ "Mountpoint": "/path/under/PropagatedMount", "Err": "" }
Mountpoint 是卷在主机(v1)或插件(v2)中可供使用的路径。
Err 要么为空,要么包含错误字符串。
/VolumeDriver.Path
请求:
{
"Name": "volume_name"
}请求给定 volume_name 的卷路径。
响应:
v1
{ "Mountpoint": "/path/to/directory/on/host", "Err": "" }v2
{ "Mountpoint": "/path/under/PropagatedMount", "Err": "" }
返回卷在主机 (v1) 或插件内部 (v2) 上可用的路径,以及(或)如果发生错误则返回一个字符串形式的错误信息。
Mountpoint 是可选的。但是,如果未提供该值,插件稍后可能会被再次查询。
/VolumeDriver.Unmount
请求:
{
"Name": "volume_name",
"ID": "b87d7442095999a92b65b3d9691e697b61713829cc0ffd1bb72e4ccd51aa4d6c"
}Docker 不再使用命名卷。在每次停止容器时调用一次 Unmount。插件可能会推断出此时安全地释放该卷是安全的。
ID 是请求挂载的调用者的唯一 ID。
响应:
{
"Err": ""
}如果发生错误,请返回一个字符串错误。
/VolumeDriver.Get
请求:
{
"Name": "volume_name"
}获取关于 volume_name 的信息。
响应:
v1
{ "Volume": { "Name": "volume_name", "Mountpoint": "/path/to/directory/on/host", "Status": {} }, "Err": "" }v2
{ "Volume": { "Name": "volume_name", "Mountpoint": "/path/under/PropagatedMount", "Status": {} }, "Err": "" }
如果发生错误,则返回一个字符串形式的错误信息。Mountpoint 和 Status 是
可选的。
/VolumeDriver.List
请求:
{}获取已注册到插件的卷列表。
响应:
v1
{ "Volumes": [ { "Name": "volume_name", "Mountpoint": "/path/to/directory/on/host" } ], "Err": "" }v2
{ "Volumes": [ { "Name": "volume_name", "Mountpoint": "/path/under/PropagatedMount" } ], "Err": "" }
如果发生错误,则返回一个字符串错误。Mountpoint是可选的。
/VolumeDriver.Capabilities
请求:
{}获取驱动程序支持的功能列表。
驱动程序无需实现 Capabilities。如果未实现,则使用默认值。
响应:
{
"Capabilities": {
"Scope": "global"
}
}支持的 scope 值为 global 和 local。任何其他值在 Scope 中将被忽略,而 local 会被使用。Scope 允许集群管理器以不同的方式处理卷。例如,scope 为 global 时,会向集群管理器发出信号,表明只需创建一次卷,而不是在每个 Docker 主机上创建。未来可能会添加更多功能。