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