容器数据卷是什么
容器数据卷类似于Redis中的持久化方法RDB和AOF,也是将容器持久化的东西,而且容器间能够继承和共享数据
容器内添加数据卷
直接命令添加
无带权命令
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
例: docker run -it -v /myDataVolume:/dataVolumeContainer centos
查看数据卷是否挂载成功
docker inspect 容器ID
有以下数据证明挂载成功
容器和宿主机之间数据共享,表现为myDataVolume
文件夹和dataVolumeContainer
文件夹中的内容会保持同步,主机可读写,容器也可读写(volumesRW值为true)
容器关闭后,主机进行读写,待容器再次启动,数据会同步挂载的两个数据卷文件夹中
如果运行镜像后,容器无法进行写操作,那么需要修改一下代码
docker run -it -v /myDataVolume:/dataVolumeContainer --privileged=true centos
带权命令
带权命令
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
例: docker run -it -v /myDataVolume:/dataVolumeContainer:or centos
容器被添加只读权限,数据也会同步到数据卷,但是容器只能进行读操作,不能进行写操作,而主机可以进行读写
DockerFile添加
DockerFile是什么?
举个栗子
people.java ======> people.class
docker images ======> Docker File
Docker File 是docker镜像的源码级描述文件
添加数据卷步骤
在根目录下新建一个mydocker文件夹
mkdir /mydocker
进入mydocker目录下
cd /mydocker
出于可移植和分享的考虑,用 -v 主机目录:容器目录 这种方法不能够直接在Dockerfile中实现。
由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。
也就是说,如果主机更换了,没办法保证新的主机上有规定的数据卷目录
编写dockerfile
vi Dockerfile
============================================================
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash
============================================================
File构建
docker build -f /mydocker/Dockerfile -t zzyy/centos
得到镜像名为zzyy/centos的镜像
使用docker images
命令即可查看镜像
主机挂载数据卷目录:
docker inspect ee2a35672484
数据卷容器
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
通过上面使用DockerFile进行数据卷的配置,可得知主机和zzyy/centos镜像已经挂载了数据卷。
接下来我们要验证容器间的数据共享
先启动一个父容器dc01
docker run -it --name dc01 zzyy/centos
启动子容器dc02继承dc01
docker run -it --name dc02 --volumes-from dc01 zzyy/centos
这个时候无论在父容器dc01还是在子容器dc02中的数据卷文件夹添加东西,数据卷文件夹都能够同步
启动子容器dc03继承dc01
docker run -it --name dc03 --volumes-from dc01 zzyy/centos
这个时候我们删除dc01
docker rm -f dc01
然后再子容器dc02的数据卷文件夹添加文件,dc03还可以同步到吗,答案是可以的
我们再新建一个dc04继承于dc03
docker run -it --name dc04 --volumes-from dc03 zzyy/centos
然后我们删除掉dc03
docker rm -f dc03
这个时候无论再dc02 还是dc04 的数据卷添加数据都是可以同步到dc02和dc04的
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止