Docker容器数据卷
一、容器数据卷是什么?
先来看看Docker的理念:
- 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
- 容器之间希望有可能共享数据
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷。
二、容器数据卷能做什么?
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System(联合文件系统)提供一些用于持续存储或共享数据的特性:
- 容器间的继承和数据共享
- 容器的持久化
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
三、数据卷
3.1.直接命令添加
3.1.1.创建容器
创建一个centos容器,语法如下:
docker run -it -v /宿主机目录:/容器内目录 centos /bin/bash
案例如下:
docker run -it -v /mydatavolume:/datavolumecontaniner centos
执行后如下:

3.1.2.查看数据卷是否挂载成功
执行命令如下:
docker inspect 容器ID
执行后如下:

3.1.3.容器和宿主机之间的数据共享
在mydatavolume路径下创建文件 a.log,写入内如,如下:

进入上面创建的容器内容的datavolumecontaniner目录查看,也会出现a.log文件

3.1.4.容器停止退出后,主机修改后数据是否同步
先停止容器,修改主机上的数据,将姓名修改为:LS,如下:

然后,启动容器,进入容器内部查看,文件信息已经被同步过来了

3.1.5.权限控制
之前的操作可以在容器中查看和修改文件,查看之前的容器文件权限

权限控制:不允许在容器中修改,但是可以查看,如下:
docker run -it -v /宿主机绝对路径:/容器目录:ro 镜像名
注意:ro是read only的简写
案例如下:创建容器和之前的路径进行挂载
docker run -it -v /mydatavolume:/datavolumecontaniner:ro centos
进入创建的容器,查看文件内容,然后进行修改

修改后,发现无法保存,如下:

这时候退出来查看容器的权限,无法修改

3.2.DockerFile添加
3.2.1.File构建
根目录下新建mydockerfile文件并且进入,创建dockerfile1文件内容如下:
# volume test FROM centos VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] CMD echo "finished,--------success1" CMD /bin/bash
可以在Docker中使用VOLUME指令来给镜像添加一个或多个数据卷
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
说明:
- 出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。
- 由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。
3.2.2.build生成镜像
执行命令如下:
docker build -f /mydockerfile/dockerfile1 -t z/centos .
结果如下:

查看。会获得了一个新的镜像z/centos

3.2.3.创建容器
run容器,语法如下:
docker run -it 镜像ID /bin/bash
如下

3.2.4.通过上述步骤,容器内的卷目录地址已经知道,那么对应的主机目录地址在哪?
容器内部的就在根目录下面

那么主机目录在哪里呢?这就用通过inspect命令进行查看,如下:
docker inspect 容器ID
执行后即可查看对应的主机目录,如下:

3.2.5.验证
验证就只需要在宿主机中创建文件,然后再到容器对应的文件夹中查看即可,在宿主机中两个目录中创建文件aaa.log和bbb.log,如下:

进入容器中查看两个目录,发现存在文件

3.2.6.备注
Docker挂载主机目录Docker访问出现 cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个--privileged=true参数即可
说明:Docker在创建和运行容器时,提供了许多命令行参数来自定义容器的行为。其中之一就是--privileged=true选项。此选项提供了对主机系统资源更深层次的访问权限。
四、数据卷容器
4.1.数据卷容器是什么?
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
4.2.容器间传递共享(--volumes-from)
以上一步新建的镜像z/centos为模板构建容器dc01/dc02/dc03,他们已经具有容器卷
- dataVolumeContainer1
- dataVolumeContainer2
4.2.1.先启动一个父容器
命令如下:
docker run -it --name dc01 z/centos
执行后如下:

在dataVolumeContainer2里面新增内容,如下:

4.2.2.创建容器dc02/dc03继承dc01
通过--volumes-from参数可以指定新建的容器继承其他的父容器
docker run -it --name 新容器名 --volumes-from 父容器的ID或者名字 z/centos
执行dc02和dc03继承dc01
docker run -it --name dc02 --volumes-from dc01 z/centos docker run -it --name dc03 --volumes-from dc01 z/centos
执行后如下:
- dc02

- dc03

4.2.3.删除dc01,dc02修改后dc03可否访问

4.2.4.删除dc02后,dc03可否访问

4.2.5.新建dc04继承dc03后再删除dc03
执行案例:
docker run -it --name dc04 --volumes-from dc03 z/centos
如下:

再删除dc03,然后查看文件依然存在

4.2.6.总结
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止

浙公网安备 33010602011771号