1.是什么?
docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么 当容器删除后,数据自然也就没有了。
为了能保存数据,在docker中我们使用卷。
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性
卷的设计目的就是数据的持久化,独立于容器的声明周期,因此docker不会在删除容器时删除其挂载的数据卷
特点:
1.数据卷可在容器之间共享或重用数据
2.卷中的更改可以直接生效
3.数据卷中的更改不会包含在镜像的更新中
4.数据卷的生命周期一直持续到没有容器使用它为止
2.能干嘛?
容器的持久化
容器间继承+共享数据
3.数据卷
1.直接命令添加
命令:
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it -v /myDataVolume:/dataVolumeContainer centos
以centos镜像启动容器,并在宿主机/myDataVolume和容器内/dataVolumeContainer实现数据共享,若没有相应的目录,则创建
查看宿主卷是否挂在成功:
docker inspect 容器ID
clipboard.png
容器和宿主机间数据共享:
容器内修改,创建文件均可以同步到主机内,反之亦然
容器停止退出后,主机修改后数据是否同步:?
完全同步
带权限:
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 (ro readonly)
主机只可以单向的向容器内传数据,容器内只可以读数据,不可以写数据
2.DockerFile添加
DockerFile是什么?
是描述镜像的文件
步骤:
1.宿主机内新建mydocker文件夹并进入 mkdir mydocker
2.可在DockerFile中使用VOLUME指令来给镜像添加一个或多个数据卷
VOLUME["/dataVolumeContainer","/dataVolumeContainer02","/dataVolumeContainer03"]
说明:
出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现
由于宿主机目录是依赖于特定宿主机的,并不能保证在所有的宿主机上都存在这样的特定目录
3.File构建
mydocker文件夹下使用vim编辑器新建DockerFile文件(DockerFile语法下一篇介绍), vim DockerFile
FROM centos
VOLUME ["/dataVolumnContainer1","/dataVolumnContainer2"]
CMD echo "finished,-------successs1"
CMD /bin/bash
4.build生成镜像
将DocekrFile文件
docker build -f /mydocker/DockerFile -t huan/centos:1.0 . (最后的.不能少 会报错 坑啊!!)
出现Successfully built xxxx即成功构建
5.run镜像
容器启动后就自动创建了文件夹
docker images 查看自己本地镜像,获取创建的镜像id
clipboard.png
通过上述步骤容器内的卷目录地址已经知道。
可以使用docker inspect 容器id 查看容器相应信息,包括容器对应的主机目录地址
备注:
Docker挂载主机目录Docker访问出现cannot open directory.:Permission denied
解决办法:在挂载目录后多加一个 --privileged=true 参数即可
docker run -it -v /宿主机绝对路径目录:/容器内目录 --privileged=true 镜像名
4.数据卷容器
概念:命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
作用:容器间数据传递共享
以上一步新建的镜像为模板,新建容器dc01、dc02、dc03,它们已经有了容器卷
dc02的数据来自于dc01?
先启动一个父容器dc01
docker run -it --name dc01 huan/centos
dataVolumnContainer2文件夹下新建文件dc01.txt
启动容器dc02,继承自dc01
docker run -it --name dc02 --volumes-from dc01 huan/centos:1.0
查看容器dc02,dataVolumnContainer2,可以看到父容器新建的文件,新建dc02.txt
启动dc容器dc03,继承自dc01
docker run -it --name dc03 --volumes-from dc01 huan/centos:1.0
查看容器dc03,dataVolumnContainer2,可以看到父容器新建的文件,以及dc02的文件 dc01.txt、dc02.txt
新建dc03.txt,ctrl+p+q,退出但不停止容器
重新进入dc01容器,查看dataVolumnContainer2文件夹,可以看到dc01.txt.dc02.txt.dc03.txt,容器间数据达到共享
删除dc01容器,进入dc02容器,新建dc02_update.txt,退出,进入dc03容器,可以发现dc02_update.txt!
即使父容器dc01删除,02和03容器依然可以共享数据
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
猜想:dc02 dc03均继承自dc01,也继承了dc01的数据卷,dc01和宿主机之间数据是共享的,那么dc02 dc03也是如此!!
网友评论