docker系列(四)容器数据卷篇

一、容器数据卷是什么?

先来看看Docker的理念:


将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的。

容器之间希望有可能共享数据。


Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。


为了能保存数据在docker中我们使用卷。


一句话:有点类似我们Redis里面的rdb和aof文件

二、能干嘛?

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。


特点:

  • 数据卷可在容器之间共享或重用数据

  • 卷中的更改可以直接生效

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

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


总结:

容器的持久化

容器间继承+共享数据

三、数据卷

1、方式一:直接以命令来添加

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


示例:

docker run -it -v /myDataVolume:/dataVolumeContainer centos  //让宿主机的/myDataVolume目录和docker里面的这个centos容器里面的/dataVolumeContainer目录建立链接,相当于,一个U盘插到电脑上,开始容器和主机之间数据的共享。

比如在/dataVolumeContainer目录新建一个wzyl.log文件,那么在主机的/myDataVolume目录中也会产生一个wzyl.log文件,并且文件内容和/dataVolumeContainer目录中的wzyl.log文件内容是一模一样的。反之亦然。


2、查看数据卷是否挂载成功
docker inspect 容器ID


示例截图如下:

12.png


3、容器停止退出后,主机修改后数据是否同步?

答案:完全同步。容器启动后,又会做一次全量数据的同步。


4、命令(带权限)

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


示例:

docker run -it -v /myDataVolume2:/dataVolumeContainer2:ro centos  //容器中的/dataVolumeContainer2目录中的文件只允许有读的权限,并没有写的权限等。


可以使用docker inspect 容器ID命令来查看容器内部细节

示例截图:

13.png


5、方式二:DockerFile添加


①、在宿主机根目录下新建mydocker文件夹并进入

mkdir /mydocker

cd /mydocker


②、在Dockerfile文件中使用VOLUME指令来给镜像添加一个或多个数据卷

VOLUME指令示例:VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]


说明:出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录


③、Dockerfile文件的构建(编写一个可执行的shell脚本)


vim Dockerfile


Dockerfile文件内容如下:

# volume test,注意你自己本地主机有centos镜像

FROM centos

VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]

CMD echo "finished,--------success1"

CMD /bin/bash


④、build构建后生成镜像,获得一个新镜像wzyl/centos

build示例:docker build -f /mydocker/Dockerfile -t wzyl/centos .


示例截图:

22.png

关于.符号的解释链接可参考:https://blog.csdn.net/xs20691718/article/details/79502019


⑤、使用wzyl/centos镜像来生成容器


示例截图:

25.png


通过上述步骤,容器内的卷目录地址已经知道,对应的主机目录地址哪?


在主机里运行docker inspect 容器ID 来查看容器内部细节即可


示例截图:

26.png


备注:

Docker挂载主机目录Docker访问出现cannot open directory . Permission denied. 

解决办法:在挂载目录后多加一个--privileged=true参数即可


示例截图:

27.png

到此刻应该明白什么是数据卷了吧。。就是一种数据持久化


四、数据卷容器

1、数据卷容器是什么?

命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。噗。。这是官方解释。。


一句话解释:说白了,就是活动硬盘上面挂载活动硬盘实现数据的传递依赖


1.1、以上一步新建的镜像wzyl/centos为镜像模板并创建运行容器dc01/dc02


示例:

docker run -it --name dc01 wzyl/centos //这里会自动在容器的/目录下多了dataVolumeContainer1和dataVolumeContainer2两个文件夹,因为上面在构建镜像的时候,Dockerfile文件里面已经指定了这两个目录


示例截图:

21.png

对了,dc01_add.txt文件是在dataVolumeContainer2目录中创建的


1.2 还是以这个wzyl/centos镜像创建一个dc02容器


示例:

docker run -it --name dc02 --volumes-from dc01 wzyl/centos  //注意,这里--volumes-from dc01表示dc02这个容器继承dc01容器,相当于编程语言中的extends


进入到dc02这个容器中的dataVolumeContainer2目录会发现在dc01容器中的dataVolumeContainer2目录创建的dc01_add.txt文件也在dc02容器中的dataVolumeContainer2目录下,反之 在dc02创建文件,在dc01的同级目录也会存在,这就是容器之间的数据共享


假如说你删除了dc01的容器,那dc02容器中的dc01_add.txt文件还在不在?

答案:是存在的


结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止


PS:偷懒了。。就不一 一截图了。。直接用语言来表述好了。。



声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复12人评论7,777人参与