目录
一、Docker数据存储简介
我们知道Docker的数据可以存在容器的可写层。但是当容器当容器不再运行时,数据不能持久存储,我们无法从容器外部获得这些数据;并且,Docker的可写层与宿主机(Host)在容器运行时紧密耦合,我们不能轻易地把数据移动到别的地方。
Docker提供了三种方式,把数据从Host挂载到Docker容器中,并实现持久化存储。这三种方式分别是Bind mounts, Volumes,Tmpfs.
- Bind mounts:可以实现将Host中的任意路径挂载到容器中,可以存储在任意位置,非Docker的进程或者容器可能随时对其进行修改,存在一定的风险。
- Volumes:实现将Docker中的某一个volume挂载到容器中,存储在Docker Host文件系统的某一个路径下,默认是/var/lib/docker/volumes,由Docker进行管理,非Docker的进程不能修改该路径下的文件,比较安全。
- Tmpfs:存储在Host系统的内存中,没有在磁盘上进行存储,不能实现持久化。
二、Bind mounts
1.简介
Bind mounts可以将Host上的任意路径进行挂载,包括重要的文件系统路径,因此就存在一个缺点,我们可以通过容器更改Host的文件系统,进行文件的增删改等操作,若我们将文件系统的路径进行挂载时,这会严重影响到系统的安全性,包括那些非Docker进程。
2.如何使用
在单容器情况下,使用Bind mount可以用 -v 或者 --volume,在swarm集群中,我们使用 --mount,在Docker17.06之后,可以统一使用 --mount,这也是非常推荐使用的。
-v 或者 --volume语法
它有三部分组成,使用 :
进行分割,这些字段必须以正确的顺序排列,并且每个字段的含义不明显。
- 第一个字段是 Docker Host 上的一个文件或者目录。
- 第二个字段是将要挂载到容器上的一个文件或者目录。
- 第三个字段是可选的,用来增加一些附加选项,比如 ro,consistent,delegated,cached,z,and Z。
--mount语法
它由一组键值对组成,由,
进行分割
Key | Value |
---|---|
type | bind、volume、tmpfs,如不指定,默认是 volume |
source或者src | Docker Host 上的一个文件或者目录 |
destination或者dst或者target | 被挂载容器上的一个文件或者目录 |
readonly | 默认可读可写,加上readonly表示是只读的文件系统 |
bind-propagation | rprivate、private、rshared、shared、rslave、slave |
两者的区别
使用-v
的时候,如果在 Docker Host 不存在要挂载的文件或者目录,Docker 将会自动进行创建,通常是一个目录。
使用--mount
的时候,如果在 Docker Host 不存在要挂载的文件或者目录,Docker 不会自动创建目录&#