关于数据卷的使用

数据卷的概念和作用

先来看看Docker的理念:
将应用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
容器之间希望有可能共享数据.
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,
那么当容器删除后,数据自然也就没有了。
为了能保存数据在docker中我们使用卷。
那么数据卷可以干什么呢?
容器的持久化存储;容器间继承 + 数据共享;
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
特点:
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接生效
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止

数据卷的使用(1)直接命令添加

命令 docker run -it -v 宿主机路径:容器内的路径
其中宿主机路径没有存在的话, 就会自动吃Aug你家, 容器内的路径也是
命令 docker run -it -v /export/datavol:/datavol -v /export/datavol2:/datavol2 centos
如果数据卷要多个, 就写多个 -v 宿主机路径:容器内的路径, 只有一个就写一个

数据卷的使用(2) 使用dockerfile 添加

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

1
2
3
4
5
6
7
8
9
# volume test

FROM centos

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

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

CMD /bin/bash

根据 dockerfile , 去构建一个镜像, 通过 build 命令
docker build -f dockerfile -t image_name:tag .

此时就可看到我们生成的镜像, docker images

通过这个镜像去实例化一个容器 docker run -it 容器ID
此时可以看到数据卷已经有了, 在dockerfile 里面指定的数据卷按照规定生成了
那么此时在宿主机上, 数据卷在哪里呢? 怎么看呢?
通过 docker inspect 容器ID 去查看
从这里就可以看出 在宿主机上,数据卷的位置了, Monuts下, Source是数据卷在宿主机下的路径, Destination是数据卷在容器内的路径(docker20版本)

随后我们就可以去自行验证是否数据共享了.

数据卷的使用(3)容器数据卷的数据共享

命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
翻译成白话就是, 子容器继承父容器的数据, 并且实现数据共享.
新建子容器, 让它的数据卷继承来自父容器, 后面一定要有镜像名(或镜像ID)
docker run -it –name dc02 –volumes-from 容器ID liezhongyu/centos
你们可以自己去试试, 父容器和子容器之间的数据共享 , 子容器A 和子容器B的数据共享, 删除了父容器后, 其他子容器是否还能正常使用数据卷.
结论:容器之间配置信息的传递, 数据卷的生命周期一直持续到没有容器使用它为止