之前,我了解到了Docker的数据卷.知道了数据卷是被设计用来共享和持久化数据的,而且它的生命周期独立于容器.今天来学习Docker的数据持久化另一种方式–数据卷容器.

挂载数据卷容器

这一次,来了解Docker的另一种数据共享和持久化的方式–数据卷容器.
数据卷容器,顾名思义,就是将一个正常的容器作为数据卷,让其他容器通过挂载这个容器实现数据共享.可是值得注意的是,数据卷容器会降低I/O性能.
首先,我们先创建一个名为data的容器,作为数据卷容器.

sudo docker run -i -t -v /data --name data c9fc7f8eec37

这里写图片描述这里写图片描述
这里的”c9fc7f8eec37”是镜像的id,通过

sudo docker images

可以查到.
就这样,我们创建了一个名为data的容器.并指定了一个数据卷/data.下面进入到data目录下,创建一个名为data.txt的文件.
这里写图片描述
现在,创建了在data下创建了一个data.txt文件,并写入内容”data”.

然后,在其他容器中使用–volumes-from 来挂载 dbdata 容器中的数据卷.

sudo docker run -i -t --volumes-from data --name data1 c9fc7f8eec37
sudo docker run -i -t --volumes-from data --name data2 c9fc7f8eec37

这里写图片描述
通过上面的操作可以看到,在分别创建的data1和data2容器中,都有data目录,同时,在data1和data2容器的data目录下的data.txt文件内容都是一样的.如果你用ll命令查看文件的详细信息,会发现文件其实就是同一个,创建时间等都是一致的.
这里写图片描述
这时的上面创建的三容器都是启动的状态.
这里写图片描述

数据卷容器问题一:启动状态和级联

那么如果容器未启动,是否可以被当做容器数据卷?
现在,先停掉data1容器.然后在用data1做数据卷容器来挂载.

sudo docker run -i -t --volumes-from data1 --name data3 c9fc7f8eec37

这里写图片描述
可以看出,data也被成功挂载到了data3里.上面的操作至少可以说明两点:

  1. 使用 –volumes-from 参数所挂载数据卷的容器自己并不需要保持在运行状态。
  2. 已经挂载了数据卷的容器可以级联挂载数据卷。

数据卷容器问题二:同时挂载数据卷容器

下面在讨论一种情况,现在在创建一个容器,挂载目录为data4.

sudo docker run -i -t -v /data4 --name data4 c9fc7f8eec37

如果我用两个–volumes-from来分别指定data和data4作为数据卷容器.

sudo docker run -i -t --volumes-from data --volumes-from data4 --name data5 c9fc7f8eec37

这里写图片描述
可以看出,新创建的data5中存在data和data4中挂载的目录.
这说明:可以使用超过一个的 –volumes-from 参数来指定从多个容器挂载不同的数据卷。

数据卷容器问题三:被挂载的数据卷容器同名问题

可是,如果我们这样创建容器,

sudo docker run -i -t --volumes-from data --volumes-from data1 --name data6 c9fc7f8eec37

可以发现,
这里写图片描述
只有一个data目录,这说明虽然指定了不同的容器卷,可是最终指向的是同一个.如果进入data1中,创建一个data1.txt的文件.在data2容器中也是可以看到的.
这里写图片描述
因为data1之前我们已经停止,所以进入需要先启动.

sudo docker start data1
sudo docker attach data1

上面的情况是通过多个–volumes-from来挂载有级联关系的容器,最终新建的容器只有一个目录.
如果挂载没有级联关系的两个容器,可是被挂载的两个容器的挂载目录重名,会是什么情况?
先新建一个名为data7挂载目录为data的容器,

sudo docker run -i -t -v /data --name data7 c9fc7f8eec37

然后在data下新建一个data7.txt.
这里写图片描述
这是,容器data和data7是分别挂载了data目录的不同两个容器.现在再新建一个容器data8,并把data和data7作为它的数据卷容器

sudo docker run -i -t --volumes-from data --volumes-from data7 --name data8 c9fc7f8eec37

可是发现只有一个data目录,并且里面只有data7.txt一个文件.
这里写图片描述
然后,我驶入如下命令创建容器data9.

sudo docker run -i -t --volumes-from data7 --volumes-from data --name data9 c9fc7f8eec37

这里写图片描述
发现也是只有一个data目录,可是内容确实容器data的内容,在里面新建一个data9.txt在容器data里也是可以看到的.
这里写图片描述
由此可以得知,如果使用–volumes-from挂载多个数据卷容器时,如果对应的容器挂载的目录是相同的,那么只有最后一个–volumes-from制定的数据卷容器会挂载成功.

数据卷容器的删除

容器使用完成后,为了节约资源难免会被删除,那么数据卷容器删除后,所创建的文件是否还在?
上面我在data9中创建了一个文件data9.txt,同时data9又挂载容器data和data7.现在删除容器data9.

sudo docker rm data9

这里写图片描述
在容器data中可以发现,在容器data9中创建的文件data9.txt仍然是存在的.
说明数据卷容器也是Docker容器数据持久化的一种方式.正是这个特性,可以让用户方便的在容器之间升级和移动数据卷。
学的越多,越觉得之前说懂得的可笑,可是什么都要一步一步来,不积跬步无以至千里,今天就到这里了.

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐