# docker volume create与docker service create mount选项的区别

docker volume create与docker service create mount选项的区别

结论:

docker volume create相当于docker service create --mount的src子选项

建议:

如果不是那种随着容器的消亡而消亡的卷或tmpfs卷或bind卷,先用docker voleme create创建卷,然后用docker ... --mount挂载他,避免--mount项嵌套包含太多子参数,容易搞错

A、docker volume create

用于创建卷

官网doc:https://docs.docker.com/engine/reference/commandline/volume_create/

 docker volume create [OPTIONS] [VOLUME]

1 选项

名称,简写默认描述
--driver , -dlocal指定卷驱动程序名称
--label为卷设置元数据
--name指定卷名
--opt,-o设置驱动程序特定选项

2 官方示例(命令行)

  • 一般
docker volume create  foo
# 这个创建的卷最终是没有type参数的
  • 内存型
 docker volume create --driver local \
    --opt type=tmpfs \
    --opt device=tmpfs \
    --opt o=size=100m,uid=1000 \
    foo
  • 分区型
 docker volume create --driver local \
    --opt type=btrfs \
    --opt device=/dev/sda2 \
    foo
  • nfs型
 docker volume create --driver local \
    --opt type=nfs \
    --opt o=addr=192.168.1.1,rw \
    --opt device=:/path/to/dir \
    foo
# 或二合一可以吗?:--opt device=192.168.1.1:/path/to/dir --opt o=rw  \

3 docker-compose.yaml创建卷的示例

这里包含oss示例

# dir (driver=local; type=bind)
volumes:
  my-mount:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/path/to/dir"
      # type改为bind吧,o去掉
      
# nfs (driver=local; type=nfs)
volumes:
  nextcloud-data:
    driver: "local"
    driver_opts:
      type: "nfs"
      o: "addr=192.168.11.201,rw"
      device: ":/zjlh/d2/nextcloud"
      # 防火墙要开好多端口啊

# oss (driver=alicloud/oss; ),需要安装驱动
volumes:
  nextcloud-data:
    driver: "alicloud/oss"
    driver_opts:
      accesskeyid: "xxxxxxxxx"
      accesskeysecret: "yyyyyyyyyyyy"
      region: "oss-cn-hongkong"
      internal: "no"
      bucket: "gc-backup"
      rootdirectory: "test"
      otherOpts: "-o max_stat_cache_size=0 -o allow_other"
      #endpoint: [bucket].[region].aliyuncs.com or [bucket].[region]-internal.aliyuncs.com
      # 要安装驱动

4 实践

docker volume create  vol-xxx
docker volume create --driver local  --opt type=none  --opt o=bind,ro  --opt device=/dev/run   vol-run
docker volume create --driver local  --opt type=bind  --opt o=ro  --opt device=/dev/run   vol-run
docker volume create --driver local  --opt type=bbbbbbbb  --opt device=/dev/run   vol-runxxx
#--- 以上都不会出错,所以type=none、tmpfs、btrfs、nfs、可以是任意值,也可以没有,感觉没啥用, o=“xxx=aaa,yyy=bbb,zzz”这个是这种类型需要的参数,普通一般是shell mount的命令参数吧

5 结论

# 1  `docker volume create`创建的最终卷的类型等于`docker ... --mount`下的`type=volume`,而`docker volume create`命令选项`--opt`中的`type`属于`docker ... --mount`下的子类型

# 2  如果`driver`不是`local`,你可能需要安装相关驱动,比如上文的`alicloud/oss`

# 3  这里应该是分指定`device`和不指定`device`,如果不指定,则无需type参数;如果指定,则需要type参数。type参数值并不会验证,感觉只是分类而已,如果卷需要一些参数的话,则需要用 --opt xxx=yyy,zzz 类似的方法添加,请参考 mount 选项;

B、docker service create --mount

用于添加Bind绑定挂载、volume卷或tmpfs内存文件系统

官网doc:https://docs.docker.com/engine/reference/commandline/service_create/

 docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]

1 适用于服务中的绑定挂载和命名卷的选项:

选项必需的描述
type挂载类型,可以是volumebindtmpfsnpipe。如果未指定类型,则默认为volume
volume:将托管卷安装 到容器中。
bind:将主机中的目录或文件绑定挂载到容器中。
tmpfs : 在容器中挂载一个 tmpfs
npipe:将命名管道从主机挂载到容器中(仅限 Windows 容器)。
srcsource对于type=bindtype=npipetype=volumesrc是指定卷名称的可选方式(例如,src=my-volume)。如果命名卷不存在,则会自动创建它。如果未指定src,则为卷分配一个随机名称。随机命名的卷与其容器具有相同的生命周期,并在容器被销毁时(在servcie update时,或者在scalingre-balancing服务时)— 我发现不能直接挂载主机上的目录,除非你先用docker volume 先建好卷,也许你可能需要使用type=bind的方式
type=bindsrc是必需的,并指定要绑定挂载的文件或目录的绝对路径(例如src=/path/on/host/)。如果文件或目录不存在,则会产生错误。
type=tmpfs :不支持 src 。
dstdestinationtarget容器内的挂载路径,例如/some/path/in/container/。如果容器的文件系统中不存在该路径,引擎会在挂载卷或绑定挂载之前在指定位置创建一个目录。
readonlyro挂载bind和volume默认为读写,除非在挂载绑定或卷时给出readonly选项。请注意,为绑定挂载设置readonly不会使其子挂载在当前 Linux 实现上为只读。另请参见绑定非递归
true1或无值:以只读方式安装绑定或卷。
false0:挂载绑定或卷读写。
1.1 以下选项只能用于命名卷 ( type=volume):

以下选项相当于用docker voleme create创建卷,volume-driver、volume-opt可参考A章节

选项描述
volume-driver用于卷的卷驱动插件的名称。默认为 "local"
volume-label一个或多个自定义元数据(“标签”)在创建时应用于卷。例如 volume-label=mylabel=hello-world,my-other-label=hello-mars ,多个标签用逗号分隔
volume-nocopytrue或1:如果您不提供值,则为默认值,禁用复制;
false或0:启用复制。—我建议启用复制
启用复制的情况下,如果您将空卷附加到容器,并且文件或目录已经存在于容器 ( dst ) 的挂载路径中,则引擎不会会将这些文件和目录复制到卷中,从而允许主机访问它们。设置volume-nocopy为true可以禁用将文件从容器的文件系统复制到卷,并挂载空卷。
volume-opt特定于给定卷驱动程序的选项,将在创建卷时传递给驱动程序。选项以逗号分隔的键/值对列表的形式提供,例如 volume-opt=some-option=some-value,volume-opt=some-other-option=some-other-value。有关给定驱动程序的可用选项,请参阅该驱动程序的文档。—懂了吗?
1.2 以下选项只能用于Bind挂载 ( type=bind):
选项描述
bind-propagation请参阅绑定传播部分
consistencymount 一致性要求:
default:等价于consistent
consistent:完全一致。容器运行时和主机始终保持相同的挂载视图。
cached:主机对挂载的看法是权威的。在主机上进行的更新在容器中可见之前可能会有延迟。
delegated:容器运行时的挂载视图是权威的。在容器中所做的更新在主机上可见之前可能会有延迟。
bind-nonrecursivetrue1:禁用递归绑定挂载。
false0:如果您不提供值,则为默认值。启用递归绑定挂载。
默认情况下,子挂载也是递归绑定挂载的。但是,当绑定挂载配置为只读选项时,此行为可能会令人困惑,因为子挂载不是以只读方式挂载的。设置bind-nonrecursive以禁用递归绑定挂载。
1.3 以下选项只能用于 tmpfs 挂载 ( type=tmpfs);
选项描述
tmpfs-sizetmpfs 挂载的大小(以字节为单位)。Linux 中默认无限制。
tmpfs-mode八进制的 tmpfs 文件模式。(例如"700""0700" 。)在 Linux 中默认为"1777" 。

2 官方示例(命令行):

#--- 匿名卷,这种无名的会随容器的消亡而消亡
  --mount type=volume,destination=/path/in/container

#--- 命名卷,不会随容器消亡
  --mount type=volume,source=my-volume,destination=/path/in/container,volume-label="color=red",volume-label="shape=round"

#--- 绑定挂载
  --mount type=bind,source=/path/on/host,destination=/path/in/container

#--- 类型为`volume`的卷的子类型为`nfs`(太复杂,建议先yoga`docker volume create`创建卷,然后直接引用)
  --mount type=volume,src=<VOLUME-NAME>,dst=/path/in/container,volume-driver=local,volume-opt=type=nfs,volume-opt=device=<nfs-server>:<nfs-path>,"volume-opt=o=addr=<nfs-address>,vers=4,soft,timeout=180,bg,tcp,rw"

3 结论

# 不管是`docker run`,还是`docker service create`,在使用`--mount`选项时,如果`type=volume`,则`src`只能是卷的名称,不能是路径(可以用docker volume create创建),如果想使用路径,可以改为`type=bind`

# type=volume 选项全览:
--mount type=volume
  ,source=<VOLUME-NAME>
  ,destination=/path/in/container
  ,readonly=false
  ,volume-driver=local
  ,volume-label="color=red",volume-label="shape=round"
  ,volume-nocopy=true
  ,volume-opt=type=nfs,volume-opt=device=<nfs-server>:<nfs-path>,volume-opt="o=addr=<nfs-address>,vers=4,soft,timeout=180,bg,tcp,rw"

# type=bind 选项全览:
--mount type=bind
  ,source=/path/on/host
  ,destination=/path/in/container
  ,bind-propagation=请参阅文档绝少用
  ,consistency=default
  ,bind-nonrecursive=false

# type=tmpfs 选项全览:
--mount type=tmpfs
  ,destination=/path/in/container
  ,readonly=false
  ,tmpfs-size=100m
  ,tmpfs-mode=1777

C 其他

  • 在Dockerfile中有定义时:
    Dockerfile中定义了VOLUME,则容器启动后(docker run),VOLUME定义的卷不会随着docker容器的删除而删除(不管你在运行时有没有加-v类参数)

  • 运行时指定了-v参数时:
    docker容器在运行时(docker run),指定了卷参数-v,则永远是宿主机定义路径中的内容有效,默认不会出现从容器拷贝到主机的情况,除非开启volume-nocopy=false(请参考docker volume官方文档,或https://blog.csdn.net/zhf_sy/article/details/125957951),不管有有没有定义VOLUME,-v定义的主机路径里面的内容都不会随着容器的删除而删除

D 最后

爱你!

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值