Docker教程(五)——Docker容器数据卷

一、Docker容器数据卷是什么?

先来看看Docker的理念:

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

  • 容器之间希望有可能共享数据

Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,

那么当容器删除后,数据自然也就没有了。

为了能保存数据在docker中我们使用卷。

二、docker容器数据卷的作用

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

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

容器数据卷的特点:

1:数据卷可在容器之间共享或重用数据

2:卷中的更改可以直接生效

3:数据卷中的更改不会包含在镜像的更新中

4:数据卷的生命周期一直持续到没有容器使用它为止

三、数据卷

数据卷在容器内的添加。可以通过直接命令添加,也可以通过DockerFile进行添加。

1、通过命令直接添加
docker run -it -v /宿主机绝对路径目录:/容器内目录  镜像名  

这里的v就是volueme的缩写。

在这里插入图片描述

2、查看数据卷是否挂载成功
查看容器内部详细信息:docker inspect 容器ID

如果能看到下图中的信息,即为数据卷均挂载成功:
在这里插入图片描述

3、容器和宿主机之间数据共享

如图所示,我们在容器的目录底下创建或者修改的文件会同步到宿主机目录下,宿主机目录下修改或者创建的文件夹也一样会同步到容器内目录下:
在这里插入图片描述
在这里插入图片描述
由此可以看出,数据卷可以实现容器和宿主机之间数据共享。

4、容器停止退出后,宿主机进行数据修改,查看数据是否进行同步

在这里插入图片描述
可以看到,容器停止退出后,宿主机进行数据修改,查看数据是可以进行同步的。

5、带权限的命令创建数据卷
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

以带权限的命令创建数据卷,容器可以同步宿主机内的数据,但是是只读的,写是禁止的。

6、通过DockerFile添加数据卷

1、首先我们需要在宿主机目录下创建一个mydocker文件夹,在文件夹下创建一个dockerfile文件。在dockerfile中,可以使用VOLUME指令来给镜像添加一个或多个数据卷,如:

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

需要注意的是在dockerfile文件中使用该指令来给镜像添加数据卷时,切记VOLUME 和[]中是需要空一格的。

出于可移植和分享的考虑,用-v主机目录:容器目录这种方法不能够直接在Dockerfile中实现。用于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。

2、编写dockerfile,将以下内容写入dockerfile,即:

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

3、通过编写的dockerfile构建一个新的镜像:

docker build -f /root/mydocker/dockerfile -t sg/centos .     //注意命令末尾是有一个.的。

如下图可知,通过dockerfile构建sg/centos镜像成功(因为没有指定TAG,所以默认为latest):
在这里插入图片描述

4、运行通过dockerfile构建的镜像
  如下图所示:以交互式模式启动通过dockerfile build的容器,在容器内部可以查看到在dockerfile中给镜像添加的数据卷,即VOLUME ["/dataVolumeContainer1",“dataVolumeContainer2”]中的值。
  
在这里插入图片描述

5 、通过上述步骤,可以明确知道在容器内的数据卷目录所在,此时我们可以通过docker inspcet IMAGE命令来查看宿主机中的卷的目录,
  如:docker inspect b3620bf3fbd4 //可以查看到容器内的卷对应宿主机中卷的目录,关于容器内的卷和宿主机中的卷是否实现了数据共享等功能,可以参照本篇文章中第三部分的数据卷中的内容进行测试。
  
在这里插入图片描述
最后:如果Docker挂载主机目录Docker访问出现错误cannot open directory.:Permission denied,则在挂载目录后多加一个–privileged=true参数即可。

7、数据卷容器

命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。

先启动一个父容器,在dataVolumeContainer2中新增一个文件;
在这里插入图片描述

然后,dc02、dc03继承自dc01:

docker run -it --name dc02 --volumes-from dc01 zzyy/centos

在这里插入图片描述
回到dc01可以看到dc02、dc03的各自添加都共享了:
在这里插入图片描述
删除dc01后,可以看到dc02修改后dc03依然可以访问:
在这里插入图片描述
删除dc02后dc03依然可以访问:

在这里插入图片描述
新建dc04后继承dc03后再删除dc03:
在这里插入图片描述
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项实战经验。 使用场景及标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值