docker volume create与docker service create mount选项的区别
文章目录
- docker volume create与docker service create mount选项的区别
- A、docker volume create
- 1 选项
- 2 官方示例(命令行)
- 3 docker-compose.yaml创建卷的示例
- 4 实践
- 5 结论
- B、docker service create --mount
- 1 适用于服务中的绑定挂载和命名卷的选项:
- 1.1 以下选项只能用于命名卷 ( type=volume):
- 1.2 以下选项只能用于Bind挂载 ( type=bind):
- 1.3 以下选项只能用于 tmpfs 挂载 ( type=tmpfs);
- 2 官方示例(命令行):
- 3 结论
- C 其他
- D 最后
结论:
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 选项
名称,简写 | 默认 | 描述 |
|
| 指定卷驱动程序名称 |
| 为卷设置元数据 | |
| 指定卷名 | |
| 设置驱动程序特定选项 |
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 | 挂载类型,可以是
| |
src或source | 对于 |
|
dst或destination或target | 是 | 容器内的挂载路径,例如 |
readonly 或 ro | 挂载bind和volume默认为
|
1.1 以下选项只能用于命名卷 ( type=volume):
以下选项相当于用
docker voleme create
创建卷,volume-driver、volume-opt
可参考A章节
选项 | 描述 |
volume-driver | 用于卷的卷驱动插件的名称。默认为 |
volume-label | 一个或多个自定义元数据(“标签”)在创建时应用于卷。例如 |
volume-nocopy | true或1:如果您不提供值,则为默认值,禁用复制; false或0:启用复制。—我建议启用复制 启用复制的情况下,如果您将空卷附加到容器,并且文件或目录已经存在于容器 ( dst ) 的挂载路径中,则引擎不会会将这些文件和目录复制到卷中,从而允许主机访问它们。设置 |
volume-opt | 特定于给定卷驱动程序的选项,将在创建卷时传递给驱动程序。选项以逗号分隔的键/值对列表的形式提供,例如 |
1.2 以下选项只能用于Bind挂载 ( type=bind):
选项 | 描述 |
bind-propagation | 请参阅绑定传播部分。 |
consistency | mount 一致性要求:
|
bind-nonrecursive |
默认情况下,子挂载也是递归绑定挂载的。但是,当绑定挂载配置为 |
1.3 以下选项只能用于 tmpfs 挂载 ( type=tmpfs);
选项 | 描述 |
tmpfs-size | tmpfs 挂载的大小(以字节为单位)。Linux 中默认无限制。 |
tmpfs-mode | 八进制的 tmpfs 文件模式。(例如 |
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官方文档,或),不管有有没有定义VOLUME
,-v定义的主机路径里面的内容都不会随着容器的删除而删除
D 最后
爱你!