docker数据卷

Docker容器数据卷

这个就好比我们取拷贝资料的U盘,主要是为了让数据持久化和共享用的

是什么

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

能干嘛

简单来说,就是为了持久化和数据共享
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Unionfs提供的一些用于持续讯处或共享数据的特性

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

  • 数据卷可以在容器之间以及主机和容器之间的共享或重用数据,就好比插上U盘在电脑上,可以互相传数据
  • 卷中的更改可以直接生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止
容器内添加数据卷案例
  1. 直接命令添加
    1. 命令: docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名,例如: docker run -it -v /myDataVolume:/dataVolumeContainer centos 表示将centos容器中的dataVolumeContainer 与宿主机中的myDataVolume连接起来,就相当于说将U盘连接到了电脑上,这两个文件夹如果没有的话都会自动创建的
    2. 查看数据是否挂载成功,直接通过ls -l 查看是都两个地方都有对应的文件夹就可以了,也可以通过docker inspect 容器ID查看
      在这里插入图片描述
    3. 容器和宿主之间实现数据共享:我们在宿主机的**myDataVolume目录下通过touch host.txt命令新建一个文件,此时我们就会发现在centos容器中也会有该文件夹,**我们也可以给这个文件加内容,此时宿主机和容器内都会存在该内容
    4. 当容器停止退出后,主机修改后数据是否同步呢?答案是会的!!!
    5. 我们添加数据卷的时候,默认是可读写的,我们可以手动设置权限为只读,命令为: docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名,此时只能在宿主机上创建和修改目录及文件,容器内啥都做不了
  2. DockerFile添加
    1. DockerFile是什么? DockerFile就可以理解为docker里每个镜像的源码级别的描述文件,就相当于.java文件编译后的源码级别的描述是.class文件一样
    2. 根目录下新建myDocker文件夹并进入:mkdir /myDocker创建文件夹 -->然后cd /myDocker进入文件夹内
    3. (我们可以在DockerFile中使用VOLUME指令来给镜像添加一个或多个数据卷:VOLUME ["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"])—这步不是操作步骤
    4. 进行File构建:首先输入vim Dockerfile进入编辑界面,然后输入以下命令
      在这里插入图片描述
    5. 将Dockerfile文件build后生成一个新的镜像fanlei/centos: docker build -f /mydocker/Dockerfile -t fanlei/centos . 注意最后还有一个点,执行该命令之后,他就会去一句一句的执行我们的File里的命令行
    6. 此时我们run我们自己build的镜像,它就会自动生成两个数据卷: docker run -it fanlei/centos /bin/bash(最后这两个可以不写,因为我们上面写了默认就是跳转到这个目录下),然后我们再通过ls -l就会发现当前容器下有两个容器卷,而名字就是我们上面的dataVolumeContainer1和dataVolumeContainer2
    7. 通过上述步骤,我们已经知道了容器内的数据卷目录地址,但是对应的宿主机目录地址在哪里呢?我们通过docker inspect 容器ID去查看我们刚才启动的容器的内部细节就可以看到他的默认路径如图黄色部分
      在这里插入图片描述

数据卷容器

是什么

假设一个容器A挂载了数据卷,如果其他容器B通过挂载这个容器A实现数据共享的话,那么容器B就被称为数据卷容器,就类似于传递依赖那种关系

案例演示

以上面新建的镜像fanlei/centos为木板,并运行容器container01->container02/container03

  1. 先启动一个父容器container01,这个父容器是实现于fanlei/centos模板镜像,命令: docker run -it --name=“container01” fanlei/centos
  2. dataVolumeContainer2目录下新建container01.txt文件
  3. container02和container03继承自container01容器,命令为:docker run -it --name container02 --volumes-from container01 fanlei/centos,容器container03也同样执行下面的命令
  4. 此时在任意一个容器中进行文件的添加,语句为attach container02.txt,在其他所有容器中都会同步进行
  5. 删除container01容器 docker rm -f container01,此时container02容器修改后,container03是否可以访问?—答案是可以的
  6. 删除了container01和container02之后,container03是否还可以继续访问?—答案是可以的
  7. 结论: 数据卷的生命周期会一直持续到没有容器使用它为止,也就是说它跟是否其父容器存在没关系,就可以理解为一个全局变量嘛
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值