一、容器数据卷是什么?
先来看看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
示例截图如下:
3、容器停止退出后,主机修改后数据是否同步?
答案:完全同步。容器启动后,又会做一次全量数据的同步。
4、命令(带权限)
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
示例:
docker run -it -v /myDataVolume2:/dataVolumeContainer2:ro centos //容器中的/dataVolumeContainer2目录中的文件只允许有读的权限,并没有写的权限等。
可以使用docker inspect 容器ID命令来查看容器内部细节
示例截图:
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 .
示例截图:
关于.符号的解释链接可参考:https://blog.csdn.net/xs20691718/article/details/79502019
⑤、使用wzyl/centos镜像来生成容器
示例截图:
通过上述步骤,容器内的卷目录地址已经知道,对应的主机目录地址哪?
在主机里运行docker inspect 容器ID 来查看容器内部细节即可
示例截图:
备注:
Docker挂载主机目录Docker访问出现cannot open directory . Permission denied.
解决办法:在挂载目录后多加一个--privileged=true参数即可
示例截图:
到此刻应该明白什么是数据卷了吧。。就是一种数据持久化
四、数据卷容器
1、数据卷容器是什么?
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。噗。。这是官方解释。。
一句话解释:说白了,就是活动硬盘上面挂载活动硬盘实现数据的传递依赖
1.1、以上一步新建的镜像wzyl/centos为镜像模板并创建运行容器dc01/dc02
示例:
docker run -it --name dc01 wzyl/centos //这里会自动在容器的/目录下多了dataVolumeContainer1和dataVolumeContainer2两个文件夹,因为上面在构建镜像的时候,Dockerfile文件里面已经指定了这两个目录
示例截图:
对了,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:偷懒了。。就不一 一截图了。。直接用语言来表述好了。。
声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。
精彩评论