自己学Docker:6.Docker的数据持久化之数据卷容器
之前,我了解到了Docker的数据卷.知道了数据卷是被设计用来共享和持久化数据的,而且它的生命周期独立于容器.今天来学习Docker的数据持久化另一种方式–数据卷容器.挂载数据卷容器这一次,来了解Docker的另一种数据共享和持久化的方式–数据卷容器.数据卷容器,顾名思义,就是将一个正常的容器作为数据卷,让其他容器通过挂载这个容器实现数据共享.可是值得注意的是,数据卷容器会降低I/O性能.首
之前,我了解到了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里.上面的操作至少可以说明两点:
- 使用 –volumes-from 参数所挂载数据卷的容器自己并不需要保持在运行状态。
- 已经挂载了数据卷的容器可以级联挂载数据卷。
数据卷容器问题二:同时挂载数据卷容器
下面在讨论一种情况,现在在创建一个容器,挂载目录为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容器数据持久化的一种方式.正是这个特性,可以让用户方便的在容器之间升级和移动数据卷。
学的越多,越觉得之前说懂得的可笑,可是什么都要一步一步来,不积跬步无以至千里,今天就到这里了.
更多推荐
所有评论(0)