一、什么是Docker容器数据卷?
先来看看Docker的理念:
1)将运行的代码与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
2)容器之间希望可能共享数据
Docker容器产生的数据,如果不通过docker commit提交产生新的镜像,使数据成为镜像的一部分保存下来,那么之前运行产生在容器的数据,在我们进行删除操作之后,就会不复存在,数据自然就没有了。
为了能保存数据在docker中我们使用“卷”;
卷就是目录或文件,存在于一个或多个容器中,由Docker挂载到容器,但不属于联合文件系统,因此能绕过UnioFS提供一些用于持续存储或共享数据的特性;
类似于我们在Redis中的rdb和aof文件。在机器断电之后,数据还能恢复。
二、Docker容器数据卷能干嘛?
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷;
第一:容器的持久化;
第二:容器间继承+共享数据。
特点:
1、数据卷可在容器之间共享或重用数据;
2、卷中的更改可以直接生效;
3、数据卷中的更改不会包含在镜像的更新中;
4、数据卷的生命周期一直持续到没有容器使用它为止。
三、数据卷
容器内添加的两种方法:
1)直接命令添加
docker run -it -v /宿主机所在的绝对路径:/容器内目录 镜像名
比如说 最开始我在宿主机的根目录下,就只有这些文件夹
我们的容器中,也只有这些下面这些文件夹
但当我们执行命令后
docker run -it -v /hostDockerDataVolume:/ContainerDataVolume centos
以centos为镜像,生成了一个尾数为ffefe的容器在docker上运行,而且在宿主机上生成了 hostDockerDataVolume文件夹,在容器中生成了ContainerDataVolume文件夹,现在,这两个文件夹,就成为了容器与宿主机之间的数据共享文件夹;
可以看到容器内根目录已经出现了冒号后的文件夹(ContainerDataVolume);
宿主机上面也出现了文件夹(hostDockerDataVolume);
如何确认查看是否挂载成功?
docker inspect 容器ID(以JSON串的形式来描述这个容器的信息)

如何验证数据共享
最开始,宿主机的文件夹下没有任何文件,容器内的文件夹下也没有任何文件

当我们在宿主机力的文件夹下创建一个test.txt之后
再到容器中的文件夹下查看
容器停止推出后, 主机修改test.txt文件后,文件数据是否同步?

1)停止前的状态
2)停止后编辑再启动再查看
第二次启动是不需要再次制定宿主机和容器之间的绑定目录地址的,
当我在宿主机上执行了 echo “000” >> test.txt 之后,启动容器
这时候容器也能看到000
命令(带权限):
docker run -it -v /hostDockerDataVolume:/ContainerDataVolume:ro centos
ro表示 read only 只读(容器只能读,不能写)
创建文件失败,其他写入操作也失败,再看看容器详情,可以看到RW为false
2)DockerFile添加(简单演示DockerFile添加,不作深入研究)
DockerFile———-image的“描述文件”
我们在DockerHub上搜索tomcat,点进去
然后在随便点开一个DockerFile的Github地址
可以看到tomcat的DockerFile的全部内容
类似于Linux系统内的Shell编程,只不过这个是Docker编程
下面来介绍用DockerFile创建数据卷
1、 在根目录下新建一个myDocker目录并进入
2、可在DockerFile中使用VOLUME指令来给镜像添加一个或多个数据卷
VOLUME[“/dataVolumeContainer”,”/dataVolumeContainer2”,”/dataVolumeContainer3”]
说明: 出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。
3、File构建(编写一个DockerFile)
vi /mydocker/DockerFile
#docker file volume testFROM centosVOLUME ["/containerDockerDataVolume1","/containerDockerDataVolume2"]CMD echo "finished!---------------------------------success!"CMD /bin/bash
4、build生成镜像:获得一个新的镜像 alan/centosdockerfile
5、运行新镜像
Docker run -it 镜像ID
在容器根目录下,已经生成了两个目录,但是我们并没有制定宿主机上面的目录,那么到底生成没有呢?
这个时候需要验证,所以我们需要使用docker inspect 容器ID来查看容器详情,
可以看到我们的数据卷分别生成在:
/var/lib/docker/volumes/41f0c2903e117223c4d92db2bdfee18bba98573f1503d233b06dd45c37230da5/_data
和
/var/lib/docker/volumes/dfd280601167bf24aa18e4391065508cb2eeb8233d4ee3640879f03fe704d682/_data
如果我们在Docker挂载主机目录Docker访问出现 cannot open directory .: Permission denie的情况
在挂载目录后多加一个 -privileged=true 参数即可‘
**
四、数据卷容器
什么是数据卷容器?
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
演示:
1、之前我们用dockerfile创建过一个名为alan/centosdockerfile的镜像,现在我们以他为镜像模板来运行一个容器,取名为 docker01——》docker02——-》docker03;
2、我启动docker01之后,在volume2文件夹下创建了docker01add.txt
3、然后我CTRL+P+Q暂时退出docker01
4、使用docker run -it —name docker02 —volume-from docker01 alan/centosdockerfile 命令,以docker01为模板,创建生成了docker02,在volume2文件夹下创建了docker02add.txt
5、使用docker run -it —name docker03 —volume-from docker01 alan/centosdockerfile 命令,以docker01为模板,创建生成了docker03,在volume2文件夹下创建了docker03add.txt
6、然后我在其他终端窗口分别登陆进docker02和docker01,这个时候发现,他们俩也能发现其他人创建的txt文件。

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