docker容器数据卷

5、Docker容器数据卷

1、概念:

Docker的理念:

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

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

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

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

docker容器数据卷有点类似我们Redis里面的rdb和aof文件

2、用途

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

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

特点:

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

2、卷的更改可以直接生效

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

主要用途:

容器的持久化

容器间继承+共享数据

3、数据卷

容器内添加

  • 直接命令添加

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

      在这里插入图片描述

    • 查看数据卷是否挂载成功

      挂载信息:

      在这里插入图片描述

    • 宿主机和容器数据共享:

      在这里插入图片描述

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

      [root@iZ2ze9gzwtvgold6960x4uZ myDataVolume]# docker stop hopeful_kilby
      hopeful_kilby
      [root@iZ2ze9gzwtvgold6960x4uZ myDataVolume]# cd /
      [root@iZ2ze9gzwtvgold6960x4uZ /]# docker ps
      CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
      [root@iZ2ze9gzwtvgold6960x4uZ /]# echo "the data from host">>./myDataVolume/a.log 
      [root@iZ2ze9gzwtvgold6960x4uZ /]# cat ./myDataVolume/a.log 
      the data from container
      the data from host
      [root@iZ2ze9gzwtvgold6960x4uZ /]# docker start hopeful_kilby
      hopeful_kilby
      [root@iZ2ze9gzwtvgold6960x4uZ /]# docker exec -it hopeful_kilby /bin/bash
      [root@d0a109c025af /]# cat ./dataVolumeContainer/a.log 
      the data from container
      the data from host
      
      

      当容器停止退出后,主机修改后数据能同步到容器中

    • 命令(带权限)

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

      在这里插入图片描述

  • DockerFile添加

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

    2、可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷

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

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

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

    3、File构建

    #volume test
    FROM centos:7.5.1804
    VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
    CMD echo "finished------success"
    CMD /bin/bash
    
    #获得一个新的镜像zyp/centos
    [root@111 mydocker]# docker build -f /mydocker/dockerfile -t zyp/centos .
    

    参数说明:

    -f:指定要使用的Dockerfile路径

    -t:镜像的名字及标签,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个标签

    在这里插入图片描述

    运行通过Dockerfile构建的镜像:

    在这里插入图片描述

    通过上述步骤,容器内的卷目录地址已经知道,对应的主机目录地址在哪?

    docker inspect 容器名或容器ID

    在这里插入图片描述

    主机对应默认地址:

    在这里插入图片描述

  • 备注

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

    解决办法:挂载目录后多加–privileged=true参数即可

    参数说明:

    –privileged=true:

    • 使用该参数,container内的root拥有真正的root权限。

    • 否则,container内的root只是外部的一个普通用户权限。

    • privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。

    • 甚至允许你在docker容器中启动docker容器。

4、数据卷容器

概念:

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

总体介绍:

以上一步新建的镜像zyp/centos为模板并运行容器dc01/dc02/dc03

它们已经具有容器卷:

/dataVolumeContainer1、/dataVolumeContainer2

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

1、先启动一个父容器dc01,在dataVolumeContainer2新增内容

2、dc02/dc03继承自dc01

#1、启动一个父容器dc01,并在dataVolumeContainer2新增内容container_dc01.txt
[root@111 /]# docker run -it --name="dc01" zyp/centos /bin/bash
[root@3609f50be22c /]# cd dataVolumeContainer2
[root@3609f50be22c dataVolumeContainer2]# vi container_dc01.txt
[root@3609f50be22c dataVolumeContainer2]# [root@111 /]# 
#2、启动一个容器dc02继承自dc01,并在dataVolumeContainer2新增内容container_dc02.txt
[root@111 /]# docker run -it --name="dc02" --volumes-from dc01 zyp/centos
[root@0809ed4e8499 /]# cd /dataVolumeContainer2
[root@0809ed4e8499 dataVolumeContainer2]# vi container_dc02.txt
#容器dc01中的container_dc01.txt共享到了容器dc02中
[root@0809ed4e8499 dataVolumeContainer2]# ls
container_dc01.txt  container_dc02.txt
[root@0809ed4e8499 dataVolumeContainer2]# [root@111 /]# 
#3、启动一个容器dc03继承自dc01,并在dataVolumeContainer2新增内容container_dc03
[root@111 /]# docker run -it --name="dc03" --volumes-from dc01 zyp/centos
[root@bdb0006e1068 /]# cd /dataVolumeContainer2
[root@bdb0006e1068 dataVolumeContainer2]# vi container_dc03
#容器dc01中的container_dc01.txt和容器dc02中的container_dc02.txt共享到了容器dc03中
[root@bdb0006e1068 dataVolumeContainer2]# ls
container_dc01.txt  container_dc02.txt  container_dc03

3、回到dc01可以看到dc02/dc03个自添加的都能共享了

在这里插入图片描述

4、删除dc01,dc02修改后dc03能否访问:

[root@111 /]# docker rm -f dc01
dc01
[root@111 /]# docker attach dc02
[root@0809ed4e8499 dataVolumeContainer2]# ls
container_dc01.txt  container_dc02.txt  container_dc03.txt
#在dc02中新建dc02_update.txt文件
[root@0809ed4e8499 dataVolumeContainer2]# touch dc02_update.txt
[root@0809ed4e8499 dataVolumeContainer2]# ls
container_dc01.txt  container_dc02.txt  container_dc03.txt  dc02_update.txt
[root@0809ed4e8499 dataVolumeContainer2]# [root@111 /]# 
#进入dc03容器中
[root@iZ2ze9gzwtvgold6960x4uZ /]# docker exec -it dc03 /bin/bash
[root@bdb0006e1068 /]# cd /dataVolumeContainer2
#dc02中的文件被修改后在dc03中还是能访问
[root@bdb0006e1068 dataVolumeContainer2]# ls
container_dc01.txt  container_dc02.txt  container_dc03.txt  dc02_update.txt

5、删除dc02后dc03能否访问

[root@111 ~]# docker rm -f dc02
dc02
[root@111 ~]# docker exec -it dc03 /bin/bash
[root@bdb0006e1068 /]# cd /dataVolumeContainer2
#删除dc02后dc03任然可以访问
[root@bdb0006e1068 dataVolumeContainer2]# ls
container_dc01.txt  container_dc02.txt  container_dc03.txt  dc02_update.txt

6、新建dc04继承dc03后再删除dc03

[root@111 ~]# docker run -it --name="dc04" --volumes-from dc03 zyp/centos
[root@b5993c4d8662 /]# cd /dataVolumeContainer2
[root@b5993c4d8662 dataVolumeContainer2]# ls
container_dc01.txt  container_dc02.txt  container_dc03.txt  dc02_update.txt
[root@b5993c4d8662 dataVolumeContainer2]# [root@iZ2ze9gzwtvgold6960x4uZ ~]# 
[root@111 ~]# docker rm -f dc03
dc03
[root@111 ~]# docker exec -it dc04 /bin/bash
[root@b5993c4d8662 /]# cd /dataVolumeContainer2
#删除dc03后dc04还是可以访问
[root@b5993c4d8662 dataVolumeContainer2]# ls
container_dc01.txt  container_dc02.txt  container_dc03.txt  dc02_update.txt

7、结论

3
[root@111 ~]# docker exec -it dc04 /bin/bash
[root@b5993c4d8662 /]# cd /dataVolumeContainer2
#删除dc03后dc04还是可以访问
[root@b5993c4d8662 dataVolumeContainer2]# ls
container_dc01.txt container_dc02.txt container_dc03.txt dc02_update.txt


7、结论

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值