Docker容器数据卷

一、容器数据卷是什么?

先来看看Docker的理念:

  • 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
  • 容器之间希望有可能共享数据

Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷。

二、容器数据卷能做什么?

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

  • 容器间的继承和数据共享
  • 容器的持久化

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

特点:

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

三、数据卷

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.总结

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

posted @ 2023-11-21 13:00  酒剑仙*  阅读(33)  评论(0)    收藏  举报