什么是数据卷容器
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
简单来说,就是通过挂载其他容器来获得其他容器所拥有的数据卷。
数据卷容器有什么作用
在Docker容器的实际使用中,经常会遇到容器的数据持久化,容器之间的数据共享等问题,通常我们有两种解决方案:
- 数据卷(Data Volumes):就是将容器内数据直接映射到本地主机环境的指定文件目录之中,可以理解为容器挂载一个虚拟数据卷然后映射到一个主机目录中
- 数据卷容器(Data Volume Containers):用专门的容器来挂载数据卷,其他容器通过挂载这个父容器来实现数据共享,这个专门挂载数据卷的容器就是数据卷容器
简单的总结就是有一个容器来专门管理数据的持久化和容器之间数据共享。前者常用于单一容器数据持久化,后者常用于多容器之间的数据共享和数据持久化。
容器之间数据卷的配置信息会相互传递,其生命周期一直持续到没有容器使用为止。举个例子,b挂载了a,c挂载了b。那么b就拥有了a的数据卷,这种拥有是永久的,c会拥有a、b、c这三个容器的所拥有的数据卷配置。并且删除某个容器并不会对继承他的子容器存在影响。例如如果删除了b,a、c所拥有的数据卷配置不会变化。
之所以不会发生变化,我们可以查看容器继承前后的容器细节信息;
容器A和容器B由不同的镜像生成。A继承了B。可以看到,A是直接继承了B的容器卷。
如何创建和使用数据卷容器
1、镜像准备
- 使用dockerfile创建一个
my-centos-vim
镜像,该镜像是没有数据卷的
FROM centos:7
MAINTAINER yyyL<yyyL@163.com>
ENV MYPATH /tmp/yyyL
WORKDIR $MYPATH
RUN yum -y install vim
RUN mkdir -p $MYPATH
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
- 使用dockerfile创建一个
my-centos-volume
镜像,该镜像的容器作为数据卷容器,包含两个数据卷["/dataVolumeContainer1","/dataVolumeContainer2"]
,该镜像是有数据卷的
FROM centos:7
MAINTAINER yyyL<yyyL@163.com>
ENV MYPATH /tmp/yyyL
WORKDIR $MYPATH
RUN yum -y install vim
RUN mkdir -p $MYPATH
VOLUME ["/tmp/dataVolumeContainer1","/tmp/dataVolumeContainer2"]
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
2、创建容器
-
先使用
my-centos-volume
j镜像创建数据卷容器。命令:
docker run -it --name="my-centos-volume" my-centos-volume:latest
-
再使用没有数据卷的镜像以第一步创建的数据卷容器作为父容器,创建两个容器 vim-1、vim-2。
挂载方式:在使用run命令启动容器时,通过--volumes-from 容器名称
来挂载其他容器命令:
docker run -it --name="vim-1 or vim-2" --volumes-from my-centos-volume my-centos-vim:latest
挂载结果:vim-1、vim-2都以my-centos-volume作为父容器分别和my-centos-volume做挂载。
通过docker inspect 容器id
命令查看vim-1、vim-2的Mounts节点数据,发现是和my-centos-volume容器的Mounts节点数据是一样的。并且vim-1、vim-2的容器内部也存在["/tmp/dataVolumeContainer1","/tmp/dataVolumeContainer2"]
目录。
3、测试
1、显然,在my-centos-volume容器绑定的宿主机目录下进行操作,在my-centos-volume容器里是可以看到的,那在vim-1、vim-2中是否也可以看得到呢?
通过tail -F data.txt
命令在容器的实时打印/tmp/dataVolumeContainer1/data.txt
的内容:
再在宿主机的绑定目录上创建data.txt文件,并写入内容,可以看到。3个容器均有打印。
2、停止my-centos-volume容器,查看vim-1、vim-2中的data.txt是否存在?再修改宿主机里的内容,vim-1、vim-2中的data.txt是否会同步修改呢?
当我们停掉了my-centos-volume后,再在宿主机中修改data.txt。vim-1、vim-2中的data.txt还是会同步修改。
3、如果my-centos-volume中有一个数据卷A,vim-1有一个数据卷B、vim-2中有一个数据卷C。还是依照上面的父子容器的关系,即vim-1和vim-2都将my-centos-volume作为父容器,那么这3个容器的最终的数据卷是什么样子?
my-centos-volume-a、b、c 这3个镜像分别有各有一个dataVolumeContainer-A、B、C的数据卷,my-centos-volume-b、c都将my-centos-volume-a作为父容器。
FROM centos:7
RUN yum -y install vim
VOLUME ["/tmp/dataVolumeContainer-A"]
CMD /bin/bash