美文网首页
4.docker数据卷

4.docker数据卷

作者: fougert | 来源:发表于2019-11-20 11:14 被阅读0次
    1.是什么?

    docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么 当容器删除后,数据自然也就没有了。
    为了能保存数据,在docker中我们使用卷。
    卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性
    卷的设计目的就是数据的持久化,独立于容器的声明周期,因此docker不会在删除容器时删除其挂载的数据卷
    特点:
    1.数据卷可在容器之间共享或重用数据
    2.卷中的更改可以直接生效
    3.数据卷中的更改不会包含在镜像的更新中
    4.数据卷的生命周期一直持续到没有容器使用它为止

    2.能干嘛?

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

    3.数据卷

    1.直接命令添加

    命令:
        docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
    
    docker run -it -v /myDataVolume:/dataVolumeContainer centos
    以centos镜像启动容器,并在宿主机/myDataVolume和容器内/dataVolumeContainer实现数据共享,若没有相应的目录,则创建
    

    查看宿主卷是否挂在成功:
    docker inspect 容器ID


    clipboard.png
    容器和宿主机间数据共享:
        容器内修改,创建文件均可以同步到主机内,反之亦然
        容器停止退出后,主机修改后数据是否同步:?
        完全同步
    
    带权限:
        docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 (ro readonly)
        主机只可以单向的向容器内传数据,容器内只可以读数据,不可以写数据
    
    

    2.DockerFile添加

    DockerFile是什么?
        是描述镜像的文件
    步骤:
        1.宿主机内新建mydocker文件夹并进入    mkdir mydocker  
    
        2.可在DockerFile中使用VOLUME指令来给镜像添加一个或多个数据卷
        VOLUME["/dataVolumeContainer","/dataVolumeContainer02","/dataVolumeContainer03"]
        说明:
            出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现
            由于宿主机目录是依赖于特定宿主机的,并不能保证在所有的宿主机上都存在这样的特定目录
    
        3.File构建
            mydocker文件夹下使用vim编辑器新建DockerFile文件(DockerFile语法下一篇介绍), vim DockerFile
           
            FROM centos
            VOLUME ["/dataVolumnContainer1","/dataVolumnContainer2"]
            CMD echo "finished,-------successs1"
            CMD /bin/bash
    
        4.build生成镜像
            将DocekrFile文件
            docker build -f /mydocker/DockerFile -t huan/centos:1.0 .  (最后的.不能少  会报错  坑啊!!)
            出现Successfully built xxxx即成功构建
         
        5.run镜像
          容器启动后就自动创建了文件夹
          docker images 查看自己本地镜像,获取创建的镜像id
    
    clipboard.png

    通过上述步骤容器内的卷目录地址已经知道。

    可以使用docker inspect 容器id 查看容器相应信息,包括容器对应的主机目录地址

    备注:
    Docker挂载主机目录Docker访问出现cannot open directory.:Permission denied
    解决办法:在挂载目录后多加一个 --privileged=true 参数即可
    docker run -it -v /宿主机绝对路径目录:/容器内目录 --privileged=true 镜像名

    4.数据卷容器

    概念:命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
    作用:容器间数据传递共享

    以上一步新建的镜像为模板,新建容器dc01、dc02、dc03,它们已经有了容器卷
    dc02的数据来自于dc01?
    
    先启动一个父容器dc01
        docker run -it --name dc01 huan/centos
        dataVolumnContainer2文件夹下新建文件dc01.txt
    
    启动容器dc02,继承自dc01
        docker run -it --name dc02 --volumes-from dc01 huan/centos:1.0
        查看容器dc02,dataVolumnContainer2,可以看到父容器新建的文件,新建dc02.txt
    
    启动dc容器dc03,继承自dc01
        docker run -it --name dc03 --volumes-from dc01 huan/centos:1.0
        查看容器dc03,dataVolumnContainer2,可以看到父容器新建的文件,以及dc02的文件 dc01.txt、dc02.txt
        新建dc03.txt,ctrl+p+q,退出但不停止容器
    
    重新进入dc01容器,查看dataVolumnContainer2文件夹,可以看到dc01.txt.dc02.txt.dc03.txt,容器间数据达到共享
    删除dc01容器,进入dc02容器,新建dc02_update.txt,退出,进入dc03容器,可以发现dc02_update.txt!
    即使父容器dc01删除,02和03容器依然可以共享数据
    
    结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
    
    猜想:dc02 dc03均继承自dc01,也继承了dc01的数据卷,dc01和宿主机之间数据是共享的,那么dc02 dc03也是如此!!
    

    相关文章

      网友评论

          本文标题:4.docker数据卷

          本文链接:https://www.haomeiwen.com/subject/eminictx.html