[volume][bind mount]标识符-v和--mount解析

参考:

Use volumes

Use bind mounts

docker run命令的标识符-v--mount均可用于卷操作和绑定挂载操作

最开始-v仅作用于独立容器(standalone container),而--mount作用于swarm服务。从Docker 17.06开始,--mount也可作用于独立容器

语法

两者语法最大的不同在于-v将所有选项组合成一个字段,而--mount通过不同字段来配置不同选项

卷操作

  • -v --volumes:由3个字段组成,用冒号(:)隔开,字段的顺序必须正确
    • 对于命名卷而言,第一个字段是卷名,必须是在给定主机上是唯一的;对于匿名卷而言,第一个字段为空
    • 第二个字段是文件或目录在容器中挂载的路径
    • 第三个字段是可选的,是以逗号分隔的选项列表
  • --mount:由多个键值对组成,用逗号分隔,每个键值对<key>=<value>由一个元组组成。顺序可以不唯一
    • type:指定了挂载类型,当前使用卷,所以是type=volume,还可以是bindtmpfs
    • source:还可以指定为src。对于命名卷,这是卷的名称;对于匿名卷,将忽略此字段
    • desination:还可以指定为dsttarget。指定容器中挂载的文件或目录路径
    • readonly:是否以只读方式挂载到容器
    • volume-opt:可以多次指定,由选项名及其值组成键值对

如果卷驱动程序接受逗号分隔的列表作为选项,则必须从外部csv解析器转义该值。要转义volume opt,请用双引号("")将其括起来,并用单引号('')将整个挂载参数括起来。比如

$ docker service create \
     --mount 'type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=local,volume-opt=type=nfs,volume-opt=device=<nfs-server>:<nfs-path>,"volume-opt=o=addr=<nfs-address>,vers=4,soft,timeo=180,bg,tcp,rw"'
    --name myservice \
    <IMAGE>

绑定挂载操作

  • -v --volumes:由3个字段组成,用冒号(:)隔开,字段的顺序必须正确
    • 对于绑定挂载而言,第一个字段指定主机上的文件或目录的路径
    • 第二个字段是文件或目录在容器中挂载的路径
    • 第三个字段是可选的,是以逗号分隔的选项列表,比如ro/consistent/delegated/cached/z/Z
  • --mount:由多个键值对组成,用逗号分隔。顺序可以不唯一
    • type:指定了挂载类型,对于绑定挂载而言是type=bind,还可以是volumetmpfs
    • source:还可以指定为src。指定了主机文件或目录的路径
    • desination:还可以指定为dsttarget。指定容器中挂载的文件或目录路径
    • readonly:是否以只读方式挂载到容器
    • bind-propagation:指定绑定传播方式,可选值为rprivate/private/rshared/shared/rslave/slave,参考bind propagation
    • --mount标识符不支持用于修改selinux标志的zZ选项

异同

虽然-v--mount均可用于存储操作,但两者之间存在些许差异

卷操作

  • 所有的卷操作选项均适用于-v--mount标识符
  • 当使用卷作用于服务时,仅有--mount支持

绑定挂载操作

当作用于主机上不存在的文件或目录时

  • -v会创建一个端点(endpoint)。它总是作为目录创建的
  • --mount不会自动创建,而是生成一个错误