Docker学习笔记(五)——Docker容器数据卷
1.数据卷是什么
先来看看Docker的理念:
-
将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
-
容器之间希望有可能共享数据
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷。
一句话总结:就像redis数据库的导出的rdb、aof文件。
2.数据卷能干什么
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
特点:
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接生效
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止
总的来说,数据卷就是容器停止或关闭以后用来进行数据持久化以及容器间继承和共享数据的。
3.容器内添加数据卷
方式一:使用直接命令添加
1.执行命令
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
,比如执行docker run -it -v /hostVolume:/centosVolume centos
,这条命令会在宿主机绝对路径下新建一个hostVolume文件夹,在docker内的centos系统中的绝对路径下新建一个centosVolume文件夹,两个文件夹是关联起来的。
2.查看数据卷是否挂载成
可以直接查看宿主机中是否新建了名为hostVolume的文件夹,也可以通过docker inspect centos 来查看文件之间的关联信息。
查看文件之间的关联
需要注意的是,如果挂载主机目录Docker访问出现cannot open directory .: Permission denied错误,只需在挂载目录后多加一个--privileged=true
参数即可,即 docker run -it -v /hostVolume:/centosVolume --privileged=true centos
3.容器和宿主机之间数据共享
在宿主机中的hostVolume里面新建一个文件夹,会发现docker中的centos的centosVolume文件夹也会发生变化。即使容器关闭了,在宿主机中修改该文件夹,重启容器之后也会进行同步。
数据共享
4.共享时添加权限
在不添加权限时,使用deocker inspect 查看共享文件的权限信息,可以看到是可读可写的。
可以使用
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
来创建具有只读权限的共享文件。也就是说,默认是rw
模式,现在改成ro
模型。例如使用docker run -it -v /hostVolume:/centosVolume:ro centos
创建的共享文件RW为Flase。这时候,只有宿主机可以单向的对共享文件进行读写,而容器内只能读,不能写。共享时添加权限
方式二:使用Docker File进行添加
下面演示使用docker file进行添加的全过程
- 根目录下新建mydocker文件夹并进入
- 使用VOLUME指令来给镜像添加一个或多个数据卷,编写docker file,内容如下:
volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash
- 使用
docker build -f [docker file所在路径] -t [新的镜像命名空间]/[新的镜像名]
生成新的镜像。例如:docker build -f /mydocker/dockerfile -t dfx/centos .
,注意,此命令必须在mydocker文件夹下运行且最后有个"."表示当前路径。如果是在当前目录下有名为Dockerfile的文件,可以省略-f参数及其路径。
生成新的镜像
查看新生成的镜像
也就是说,新生成的dfx/centos刚“出厂”就自带两个dataVolumeContainer1和dataVolumeContainer2这两个卷。
- 运行新建的容器
使用docker run -it dfx/centos
运行新建的镜像,可以看到刚开始就自带了两个卷。
运行新的镜像 -
与宿主机实现文件共享
由于使用docker file创建卷时并没有指定宿主机的共享文件的位置,所以docker会指定一个默认的位置。
查看宿主机共享文件的默认位置
在容器中的其中的一个卷中新建一个文件,可以看到宿主机的默认位置也有了这个文件。
容器中新建文件
宿主机中实现了同步
以上就实现了使用docker file的方式进行文件共享。
4.数据卷容器
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。通俗一点,就是“活动硬盘”上挂载“活动硬盘”,实现数据的传递依赖。
下面使用实例来讲解容器间的传递共享--volumes -from
:
-
使用修改后带有两个卷的centos,启动一个父容器dc01,并在dataVolumeContainer2中新增一些内容。
启动修改后centos
dc01的第二个卷新增文件 -
dc02、dc03继承自dc01,并在各自的dataVolumeContainer2中新增一些内容。相当于dc01是dc02和dc03模板。在dc02和dc03做完新增之后,查看dc01是否也有改变。
继承后数据传递共享
可以看到,dc02、dc03继承自dc01,并做了新增,但是这个改变也传递给了dc01。即,父到子,子到父都可以传递。
-
现在删除dc01,查看dc02/dc03是否可以访问
删除dc01,查看dc02
可以看到,dc02照样可以访问。
-
在dc02中再进行新增,查看dc03是否有变化
dc03也会跟着dc02变化
可以看到,dc03也有dc02刚新增的文件,即使没有dc01了,他们也是共享的。
小结:容器之间的配置信息的传递,数据卷的是生命周期一直持续到没有容器使用它为止。