docker容器数据卷是什么?

当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的的,而且容器之间我们希望能够实现数据共享。

通俗地来说,docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。

特点:

1:数据卷可以在容器之间共享或重用数据

2:数据卷中的更改可以直接生效

3:数据卷中的更改不会包含在镜像的更新中

4:数据卷的生命周期一直持续到没有容器使用它为止

添加数据卷的方式有两种,第一种是直接通过命令行挂载,第二种是通过dockerFile添加

首先来说第一种通过命令行挂载的方式,命令如下:

docker run -it -v  /宿主机绝对路径目录:  /容器内目录  镜像名

这个命令会在宿主机和容器内分别建立两个目录,两个目录是对接的,里面的数据可以共享。如果我们不知道数据卷是否挂载成功时,我们可以通过以下方式来检查数据卷的挂载结果。

docker inspect  容器id

上面的命令可以查看容器的详细情况,命令返回的是JSON格式的字符串,运行命令之后我们在返回的JSON字符串中找到Volumes属性,假如挂载成功的话,Volumes里面显示的绑定结果应该是你在挂载时输入的命令参数 (/宿主机绝对路径目录:  /容器内目录 ),如果与你们之前输入的一致的话,证明挂载成功。PS: Volumes里面显示的绑定结果可能有多个,但是只要找到目标结果就可以。挂载之后,当容器停止运行的时候,宿主机上对数据卷做的内容修改是会同步到容器内的。

我们再挂载的时候还可以给数据卷加上权限,假如我们要宿主机只能读取容器的数据卷内容不能修改,我们可以添加只读权限

docker run -it -v /宿主机绝对路径目录 : /容器内目录  :ro 镜像名

至于只写的话我们一般不会用到,要么就是读写,要么就是只读,而且我们可以通过docker inspect 来查看容器的volumesRW来查看容器内数据卷的读写权限。

 第二种就是利用dockerFile的形式添加

dockerFile对于docker镜像而言就如同java中某个类的.class文件对应上该类的.java文件。

首先在linux服务器根目录上新建docker文件夹并建立DockerFile文件,使用volume命令(出于可移植可分享的的考虑,用以上 -v /宿主机绝对路径目录 : /容器内目录 的这种方式不能够直接在dockerFile中直接实现,因为宿主机目录是依赖于特定的宿主机的,并不能保证所有的宿主机都存在这样特定的目录)

编写的dockerFile文件如下

FROM  镜像名

VOLUME ["/生成的目录路径"]  -- privileged=true

CMD echo "success build"

CMD /bin/bash

相当于命令行: docker run -it -v /宿主机目录路径 :  /生成的目录路径

然后我们通过命令行docker build执行我们写好的dockerFile文件(docker build和docker commit两个命令都可以建立docker镜像,docker commit 需要在容器内进行,docker build 不需要)

docker build -f  /docker/DockerFile -t  命名空间/镜像名

执行后输入docker images就可以发现自己通过DockerFile所build的镜像,里面有挂载数据卷,那么问题来了宿主机所对应的目录是什么呢?同上,我们可以通过docker inspect来查看当前容器的Volumes,里面会有宿主机的数据卷目录。

 

什么是docker数据卷容器?

上面介绍了docker容器数据卷,它的作用相当于生活中的活动硬盘,那么数据卷容器就相当于把多个活动硬盘再挂载到一个活动硬盘上,实现数据的传递依赖。

官网解析:命名的容器挂载数据卷,其他的容器通过挂载这个父容器实现数据共享,挂载数据卷的容器,我们称为数据卷容器。

首先,我们建立父容器

docker run -it - -name parentContainer  镜像名(可以填上面通过dockerFile建立的镜像,里面有挂载容器卷)

然后建立两个子容器继承父容器

docker run -it - -name sonContainer1 --volumes -from parentContainer 镜像名

docker run -it - -name sonContainer2 --volumes -from parentContainer 镜像名

假设我们DockerFile里面定义的容器卷目录为dockerVolume,父容器里面有dockerVolume目录,子容器继承了父容器的dockerVolume,在字容器中的dockerVolume目录作出的修改会同步到父容器的dockerVolume目录上,达到了继承和数据共享的目的。

官网上有一句话描述的是,容器之间配置信息的传递,数据卷的生命周期会一致持续到没有容器使用它为止,换言之,只要有一个容器仍在使用该数据卷,该数据卷一直都可以进行数据共享,通俗地来说,如果此时我们把父容器关闭掉,两个字容器之间依旧可以进行数据共享,而且通过继承子容器生成的新容器,一样可以与子容器进行数据共享。这就是docker容器间的数据传递共享。