Docker---容器数据卷

Posted 大忽悠爱忽悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker---容器数据卷相关的知识,希望对你有一定的参考价值。


简介

是什么

类似redis里面的rdb和aof,用来做数据持久化操作的

能干嘛

容器的持久化

容器间继承加共享数据

详解

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供的一些用于持续共享数据的特性

卷的设计目的就是数据的持久化,完全独立与容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷

特点

  1. 数据卷可在容器直接共享或者重用数据
  2. 卷中的更改可以直接生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一致持续到没有使用它为止

容器内添加数据卷的方式

直接命令添加

命令: docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名

未执行命令前,主机里面没有对应的目录,但是执行完命令后,主机里面创建的对应的目录,新建并运行的容器中也创建了指定的目录

可以看出 -v命令: 如果没有指定的目录的话,会新建一个


docker inspect命令,以json字符串形式查看当前容器内部细节

通过docker inspect命令,查看是否绑定成功—HostConfig底下的Binds

HostConfig 的BInds显示主机的myDataVolume目录与容器中dataVolumeCintainer目录绑定在了一起


检测是否实现了宿主机和容器之间的数据共享

在宿主机的myDataVolume目录下面新建一个文件

去容器里面绑定的目录下查看是否存在指定新建的文件


存在,实现了宿主机和容器之间的数据共享

容器向文件中写入数据

宿主机查看,发现了新增的数据


容器停止退出后,主机修改后数据是否同步


容器启动过程中,同步了一遍主机的数据,优点类似redis的rdb和aof


命令带权限

docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

这里ro表示只可以宿主机对容器数据卷进行读写操作,而容器里面对于数据卷的操作只能够是只读的,不可以增删改

以只读的方式启动容器,切换到opt目录下面,创建dhy.txt文件,成功

下面切换到dataVolumeContainer目录下面,尝试创建文件


提示只读,说明只读的权限只针对于和宿主机绑定的共享目录


宿主机在对应的myDataVolume目录下创建文件成功


容器查看,可以得到对应的文件


DockerFile方式添加

根目录下新建mydocker文件夹并进入

在DockerFile中使用VOLUME指令给进行添加一个或多个数据卷

VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"];

说明:

出于可移植性和分享的考虑,用-v主机目录这种方法不能够直接在Dockerfile中实现

由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录


File构建

编写可执行的dockerfile脚本

# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished, ----------------success1"
CMD /bin/bash


新建一个Dockerfile文件,并将上面的脚本放入其中

build后生成镜像

docker build -f /mydocker/Dockerfile -t zzyy/centos .(最后结尾有一个点)

获得一个新镜像zzyy/centos

run 容器

docker run -it zzyy/centos


容器里面已经新建了两个数据卷


容器内的卷目录地址,如果不填写对应的主机目录地址,在主机中也有有对应的数据卷与之绑定


注意

Docker挂载主机目录Docker访问出现cannot open directory…Permission denied

解决方法: 在挂载目录后多加一个 --privileged=true参数即可


执行docker ps命令,出现 "Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?"问题

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?”

此时已确定Docker本身已经安装正常。

问题原因是因为docker服务没有启动,所以在相应的/var/run/ 路径下找不到docker的进程。

执行 service docker start 命令,启动docker服务,返回

docker start/running, process 2662

此时进程启动成功,再执行docker ps,问题解决



容器数据卷volumes-from

总体介绍

上面新建的镜像 zzyy/centos为模板并运行容器dc01/dc02/dco3

他们已经具有容器卷: /dataVolumeContainer1 /dataVolumeContainer2


容器间传递共享(volumes-from)

案例演示

先启动一个父容器dco1,在dataVolumeContainer2新增内容

dco2和dco3继承dco1

命令: --volumes-from

dco2继承至dco1

docker run -it --name dco2 --volumes-from dco1 zzyy/centos

此时看到dco2下面的数据卷中存在dco1_add.txt

并且dco2在当前共享数据卷下面新建一个dco2_add.ttx

dco3继承至dco1,并在共享数据卷下面新建dco3_add.txt


此时回到dco1,可以看到三个不同容器创建的文件,即完成了容器间的数据共享

如果此时删除dco1,数据卷的共享是否会受到影响?


此时进入dco2,发现当前共享数据卷没有受到任何影响,然后我们再新建一个update_dco2.txt,看看是否dco3也可以看到新建的文件,即检验数据卷是否还可以共享

数据卷依然可以共享

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


以上是关于Docker---容器数据卷的主要内容,如果未能解决你的问题,请参考以下文章

Docker学习笔记(8-2)Docker - 数据卷容器

docker数据卷容器

Docker 数据卷

docker数据卷容器

Docker之七:Docker数据卷管理

06-Docker-容器数据卷