Docker数据存储

Docker数据存储

配置方式

1. -v or --volume

使用此参数严格保证参数的有序性,其主要有三个参数,其参数以:分隔, 此种方式的可读性较弱,建议使用--mount的方式指定

主要参数有
  • path of host machine
    指定挂载在主机的文件路径
  • path of container the file
    指定挂载于容器内的文件路径
  • third field optional. such as: co, consistent … etc.
    额外的一些属性配置,以,分隔
配置案例
$ docker run -d -it [容器实例name] -v /var/data/docker/app:/var/data:consistent,ro [实例所属的镜像及版本] 

2. --mount

采用类似于<key>=<value>的结构指定,这个是官方推荐的方式,此种方式不用严格保证配置属性的有序性,其属性之间以,分隔

主要参数有:
  • type
    数据存储的类型,其主要有:bind,volume,tmpfs, 在这里我们主要研究的bind类型,也就所谓的文件挂载
  • source | src
    数据存储的位置,类似于-v方式的第一个参数
  • destination | dst | target
    指定挂载于容器内的文件路径
  • readonly
    设置挂载的目录为只读模式
  • bind-propagation
    文件挂载的传播级别,主要有:rprivate, private,rshard,shard,rslave,slave
  • consistency
    主要用于Mac OS中,主要有值有:consistent,delegated,cached

3. -v 与 --mount有一些不同。

  • -v 指定挂载目录时,如果目录不存在于主机中,他会自行创建一个目录,而–mount不会,但是–mount会有相关错误信息的抛出来。
  • -v 与–mount是不允许同时使用的,如果要切换,必须先在运行完之后,删除相关容器才可以

4. 案例

将Docker机当前部署的位置的target挂载到容器devtest下的/app目录下

  • –mount
$ docker run -d -it --name devtest --mount type=bind,source="$(pwd)"/target,target=/app nginx:latest 
  • -v
$ docker run -d -it --name devtest -v "$(pwd)"/target:/app nginx:latest 
  • 我们可以使用 docker inspect devtest去难配置的正确性,本次我们主要关注的是Mounts的配置
$ docker inspect devtest 

output:

... 
"Mounts": [ 
{ 
"Type": "bind", 
"Source": "/tmp/source/target", 
"Destination": "/app", 
"Mode": "", 
"RW": true, 
"Propagation": "rprivate" 
} 
], 
... 
  • 停止容器运行
$ docker container stop devtest 

$ docker container rm devtest 
5. 我们可以通过绑定空目录或临时目录在主机,来验证容器内部服务有没有运行起来,这种方式我们通常在新发布一个应用时,我们为了验证服务是否运行起来,这通常是一种比较有效的方式
  • –mount
$ docker run -d \ 
-it \ 
--name broken-container \ 
--mount type=bind,source=/tmp,target=/usr \ 
nginx:latest 
  • -v
$ docker run -d \ 
-it \ 
--name broken-container \ 
-v /tmp:/usr \ 
nginx:latest 

output:

docker: Error response from daemon: oci runtime error: container_linux.go:262: 
starting container process caused "exec: \"nginx\": executable file not found in $PATH". 

上面输出说明了容器已经部署成功,但服务却没有运行起来。

  • 停止容器
$ docker container rm broken-container 

6. 使用只读模式

  • –mount
$ docker run -d \ 
-it \ 
--name devtest \ 
--mount type=bind,source="$(pwd)"/target,target=/app,readonly \ 
nginx:latest 
  • -v
$ docker run -d \ 
-it \ 
--name devtest \ 
-v "$(pwd)"/target:/app:ro \ 
nginx:latest 
  • 使用 docker inspect devtest 检查配置
$ docker inspect devtest 

output

"Mounts": [ 
{ 
"Type": "bind", 
"Source": "/tmp/source/target", 
"Destination": "/app", 
"Mode": "ro", 
"RW": false, 
"Propagation": "rprivate" 
} 
], 
  • 停止容器
$ docker container stop devtest 

$ docker container rm devtest 

7.配置bind-propagation

bind-propagation的默认配置为rprivate, 像bind-propagation是属于高级配置,一般情况下,我们不需要去配置的,但是不管怎么样,docker还是为我们提供了其配置的窗口,其主要配置及描述如下:

Propagation的配置值描述
shard主装载点与子装载点双向共享,也就是说,当主装载点有数据变更时,对应于子或复本装载点是可见,反过来,子装载点的数据变更了,其对应的主装载点也可见
slave类似于shard,但是它只一个方向的共享,也就是当主装载点有了变更时,其子装载点是可见的,但是,当子装载点下的数据有变更时,其主装载点却不见
private主装载点与子装载点互不可见,相互独立
rshard与共享相同,但传播也扩展到嵌套在任何原始或复制装载点中的装载点
rslave与slave相同,但传播也扩展到嵌套在任何原始或复制装载点中的装载点
rprivate与private一样,没有装载点在原始或复制装载点
  • –mount
$ docker run -d \ 
-it \ 
--name devtest \ 
--mount type=bind,source="$(pwd)"/target,target=/app \ 
--mount type=bind,source="$(pwd)"/target,target=/app2,readonly,bind-propagation=rslave \ 
nginx:latest 
  • -v
$ docker run -d \ 
-it \ 
--name devtest \ 
-v "$(pwd)"/target:/app \ 
-v "$(pwd)"/target:/app2:ro,rslave \ 
nginx:latest 

现在如果存在/app/foo/,那么将/app2/foo/也是存在的

8. 配置selinux label

配置值描述
z装载点的内容是共享的
Z装载点的内容是私有的

此种方式是不能使用–mount命令设置的。

  • -v
$ docker run -d \ 
-it \ 
--name devtest \ 
-v "$(pwd)"/target:/app:z \ 
nginx:latest 

9. 在Mac OS 中配置consistency

在mac os 中主要是通过osxfs去在主机与容器之间进行文件共享,在默认情况下,其配置是 consistent,那么这样就意味着,当在容器中写数据时,需要同时向mac os 文件系统中写文件,且这个是实时,这里主要有三个配置:consistent, cached, delegated

配置值描述
consistent当在容器中写数据时,需要同时向mac os 文件系统中写文件,且这个是实时
delegated当在容器中写数据时,会延迟性的向mac os 中的文件系统更新数据
cached将mac os的文件以视图的方式挂载到容器中,这样会在主机与容器之间有点数据上的延迟
  • –mount
$ docker run -d \ 
-it \ 
--name devtest \ 
--mount type=bind,source="$(pwd)"/target,destination=/app,consistency=cached \ 
nginx:latest 
  • -v
$ docker run -d \ 
-it \ 
--name devtest \ 
-v "$(pwd)"/target:/app:cached \ 
nginx:latest 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值