• 聊聊Docker数据卷和数据卷容器


         当程序在容器运行的时候,特别是需要与其他容器中的程序或容器外部程序进行沟通交流,这时需要进行数据交换,作为常用的两种沟通数据的方式,网络通信与文件读写是需要提供给程序的支持,

    【数据卷】

    文件是数据持久化的最常见的保存方式,由于文件系统的隔离,以及本身是以沙盒形式运行等性质,使其对保存需要持久化的数据并不稳定,对此,docker使用了数据卷这种专门定制的形式

    数据卷就是一个挂载在容器内文件或目录,在容器中,数据卷是从外界挂载到内部容器中的,所以可以脱离容器的生命周期而独立存在,正式由于数据卷的生命周期并不等同于容器的生命周期,在容器退或者是删除之后,数据卷仍然不会受到影响,会依然存在于docker中

    【数据卷的特点】

    数据卷中的数据并不能继承于镜像,也不在联合文件系统临时层所管理的范围内,所以镜像层面的写时复制不会作用于数据卷中的数据,而这些数据也不会被docker commit提交到新的镜像中;

    1)文件的操作不是在沙盒环境中进行的,而是直接作用于宿主机内真实的硬盘I/O中;

    2)外界直接挂在到容器中,脱离了容器的生命的周期

    3)生命周期不受容器控制,能够安全有效的存储文件到数据卷中

    4)数据卷独立于容器之外,可实现多个容器共享一个数据卷

    【创建数据卷】

    创建数据卷的方式有很多种,其中最为常用的是在创建容器的同时也创建数据卷,在使用docker create或者docker run都可以实现,可以通过-v参数向容器中挂载到一个数据卷

    Ps:在这里如果通过docker create 这种方式创建容器的话,创建成功之后,手动docker start会无法启动的(亲身经历,郁闷了好久。)

    # docker run --name version1 -v /www/html/ docker.io/centos    #-v指定数据卷目录

    d4363f3bce6e801518ab565fee659e664d779b8cf0091c109fbf9b476f264137

    # docker run -itd  --name version2 -v /www/html/ -v /tmp/ docker.io/centos
    4faa7bd0b279a12a4b571cb43b6156430cccce8737187366c2df44cfed53a468

    另外还可以通过docker CLI中专属的参数来创建数据卷

    # docker volume create --name data    #通过这种方式查看数据卷的基本信息

    # docker volume inspect data
    [
    {
    "Driver": "local",
    "Labels": {},
    "Mountpoint": "/var/lib/docker/volumes/data/_data",
    "Name": "data",
    "Options": {},
    "Scope": "local"
    }
    ]

    我们可以发现。数据卷其实就是放置在数据主机中的一个特殊的目录,只是docker将其封装在容器中进行展示

    【挂载数据卷】

    # docker run -itd --name test123 -v data:/html e934aafc2206
    1d843afd1755ea1ab32588fff39b666f702ef0ad7c3984052341415b9d101e7b

    使用挂载数据卷的主机目录已经成为数据卷的方式,可以非常方面的实现容器内部和外部的文件共享,特别是将配置,代码类的可能需要临时修改文件,通过主机目录挂载方式,修改结果立马体现在容器中

    Ps:当需要容器中的程序只能读取数据卷的内容,而不能对数据卷中的数据进行修改的时候,我们可以在挂载参数后面加上:ro三个字符,从而达到只读挂载数据卷的目的

    docker run -itd --name testv1 -v data:/html:ro  e934aafc2206  

    只读挂载能在安全性上面作出一定的贡献,只读挂载使攻击者入侵到容器中,无法对挂载目录中的程序数据卷进行修改,同时容器对应用之间的隔离,对文件系统的隔离,对物理主机之间隔离,攻击者无法进行其他的操作;

    Ps:删除数据卷很简单,数据卷不会因为容器的删除而被删除,已经被删除的容器所挂载的数据卷仍然存在宿主机中,并保存着数据,占据着空间大小,可以通过docker提供的命令进行查看宿主机存在的所有数据卷

    删除数据卷

    PS:另外如要删除数据卷,我们更推荐-随容器删除,可以使用docker rm -v指定容器,在删除容器的同时,也会将容器使用的数据卷一并删除

    随容器一并删除数据卷,前提是该数据卷没有被其他容器使用,才能生效,因为数据卷是脱离容器而存在的,因为这个特点,我们也能够将一个数据卷挂载到多个不同的容器中,所以在随容器删除数据卷的前提下,docker会先检查容器中挂载的数据卷是否被其他容器使用,如果其他容器也在使用该数据卷,那么无法随容器删除;

    【数据卷容器】

    将一个运行的容器作为数据卷,其他容器可以通过挂载这个容器实现数据共享

    优势:1,轻松的将数据卷进行归类和汇总;2,能够更好的管理容器与数据卷之间的关系;3,更加合理的控制数据卷的生命周期

    数据卷容器详情:

    用于持久化保存数据的数据卷,可以通过挂载宿主机目录的方式来实现,但这也存在着弊端,很容易破坏docker的统一性,为了解决这个问题,我们可以使用数据卷容器

    顾名思义,数据卷容器也就是专门存放数据卷的容器

    创建 数据卷容器

    # docker create --name datatest -v /www/html/ e934aafc2206   #创建数据卷容器时候,指定-v参数来创建数据卷容器所使用的数据卷,

    # docker inspect datatest    #通过docker inspect查看数据卷容器详细信息

    【链接数据卷容器】

    数据卷容器只是链接其它容器与数据卷的桥梁,通过--volumes-from参数可以挂在指定的数据卷中的所有数据卷

    # docker run -itd --name webserver --volumes-from datatest e934aafc2206
    a58b0c09b1ff75159e2dcd974700325aa7ff72fea878b8308414aa67ca340b41

    【数据卷的迁移】

    数据的备份或是导出导入都是保证数据的安全性最简单直接的方式

    Ps:已经启动的容器是无法再挂载新的外部目录进去,利用数据卷的特性,数据卷是可以被多个容器挂载的,我们可以通过新建容器挂载宿主机中的目录,并共享需要导出的容器数据卷,这样的就容易实现数据的导出了

    要导出数据,需要创建一个新的容器,并将其连接到持有我们需要导出的数据卷的数据卷容器上,容器创建之后,我们就可以进入容器执行打包命令,并将所有数据方式到挂载的宿主机的目录中

    返回到宿主机上面,会发现,备份的tar包已经同步/root/目录了!

    恢复数据之前,依然要创建新的容器,挂载上面宿主机中存在备份数据的目录,并连接到包含目标数据卷的数据卷容器上面,然后运行并进入这个容器,在容器中进行解压命令,把导出的数据放置到目录数据卷里

    # docker run -it --volumes-from datatest -v $(pwd):/backup --rm --name importer e934aafc2206 /bin/bash 

    [root@88563d2cf14b /]# tar xf /backup/data.tar

    整个过程经历了创建容器-运行命令-关闭和删除容器的过程,上述提到的--rm是容器退出时就能够自动清理容器内部的文件系统

  • 相关阅读:
    【集训队作业2018】不可名状
    【UTR #3】量子破碎
    【清华集训2016】你的生命已如风中残烛
    【清华集训2016】如何优雅地求和
    玩转大数据系列之Apache Pig高级技能之函数编程(六)
    ElasticSearch入门之彼行我释(四)
    玩转大数据系列之Apache Pig如何与Apache Solr集成(二)
    玩转大数据之Apache Pig如何与Apache Lucene集成
    如何学好一门编程语言或技术?
    2015年春节往事小记
  • 原文地址:https://www.cnblogs.com/bixiaoyu/p/9069778.html
Copyright © 2020-2023  润新知