赞
踩
顾名思义,容器数据卷即Docker用于存放数据的卷;Docker将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求是能够持久化存储的,同时希望不同容器之前能够共享数据
Docker容器产生的数据,如果不通过docker commit成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除之后,数据自然也就没有了,为了能够保存数据,在容器中我们使用卷
卷就是目录或者文件,存在于一个或者多个容器中,由Docker挂在到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。卷的设计目的就是为了持久化,完全独立于容器的生命周期,因此,Docker不会在容器删除时删除其挂载的数据卷
特点
容器数据卷可以通过命令添加,也可以通过DockerFile添加,关于DockerFile相关介绍将在下一章讲解
命令: docker run -it -v /宿主机目录:/容器内目录 镜像ID或名称:tag
创建一个默认的centos容器,docker run -it centos
创建并启动centos容器,容器运行后查看目录,为默认文件结构
通过命令添加 -v
参数配置容器数据卷,docker run -it --name reel_centos -v ~/reelHostTest:/reelDokcerTest centos
分别在主机目录和Docker容器内目录下新创建的两个文件夹,说明容器在启动时会自动创建数据卷文件夹,此时可以通过 docker inspect 容器ID
查看容器内部细节查看数据卷是否挂载成功
数据卷挂在成功,RW为true, 即具有读写权限
在容器内reelDockerTest目录下新建a.log文件,测试数据共享,查看主机对应目录下是否存在该文件,容器内创建文件
创建后宿主机中存在相同文件
修改主机中文件内容,查看容器中是否修改
容器中文件内容已同步修改,说明主机与容器中存在数据共享
先停止容器退出,主机修改文件
重新启动容器,数据卷中文件内容已同步修改
通过 -v
参数添加的数据卷默认容器具有读写命令,可以添加RO限定只读
如图,ReadOnly权限下,容器无法在该文件夹目录下新增文件,docker inspect
查看容器内部信息,此时的 "RW":false
在主机该目录下添加文件readOnly.txt文件,切换至容器中查看
容器中存在该文件,可以正常读取但无法被修改,修改文件提示 E45: ‘readonly’ option is set (add ! to override)
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。DockerFile定义了进程需要的一切东西,DockerFile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和系统内核进程打交道,这时需要考虑如何设计namespace的权限控制)等,简单来说通过DockerFile可以构建出我们锁需要的镜像。DokcerFile的详细介绍将在下一章讲解
创建DockerFile文件,文件中添加以下测试内容,其中 VOLUME 指令用于给镜像添加一个或多个数据卷
# volume test
FROM centos
VOLUME ["/dockerFile1","/dockerFile2"]
CMD echo "finished,--------success1"
CMD /bin/bash
-v 主机目录:容器目录
这种方法不能直接在Dockerfile中实现。由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。docker build
命令构建镜像 docker build -f DockerFile文件地址 -t 镜像名称:tag .
**注意结尾的 .
**号不可省略(猜测应该是Docker引擎中镜像存储的目录)
新建并启动容器,查看容器目录,dockerFile1与dockerFile2均创建,数据卷绑定成功
通过命令添加容器数据卷时,需要指定主机中数据卷文件目录与容器中数据卷文件目录,容器中的文件最终还是存储在主机磁盘中的,那么,通过DockerFile创建的数据卷对应的主机中的文件目录在什么位置呢?Docker inspect
命令查看容器内部细节,确认数据卷在主机中的位置
切换至对应目录下,查看dockerFile1 与dockerFile2 是否创建
切换至docker目录时提示没有权限,可以在运行容器时加入 --privileged=true
即可,或授予用户访问权限
1. sudo chmod -R 777 /var/lib/docker/
2. docker run -it --privileged=true --name privilegedtest -d ac9c738661da
进入文件夹后创建文件,检验容器中同步情况
文件数据同步成功
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
已我们刚刚构建的镜像为例,先启动父容器df1, 在dockerFile1目录下创建文件aa.txt
启动df2、df3容器继承自df1 容器 主要命令 --volumes-from
,在df2与df3容器分别添加aa2.txt与aa3.txt文件
进入df1容器,aa2.txt 与 aa3.txt文件均已同步。删除df1容器,进入df2容器,df1创建的文件aa.txt存在且可以修改
再删除df2容器,访问df3,文件可以正常访问
基于df3再创建df4容器后删除df3,文件能够正常访问
**结论:容器数据卷用于容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止 **
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。