网站设计原则,怎样做招嫖网站,无排名优化,网站建设 php jsp .net深入理解Docker之#xff1a;存储卷相关概念详解和分析
1. 为什么要使用存储卷
Docker镜像由多个只读层叠加而成#xff0c;启动容器时#xff0c;Docker会加载只读镜像层#xff0c;并在镜像栈顶部添加一个读写层如果运行中的容器修改了现有的一个已经存在的文件#x…深入理解Docker之存储卷相关概念详解和分析
1. 为什么要使用存储卷
Docker镜像由多个只读层叠加而成启动容器时Docker会加载只读镜像层并在镜像栈顶部添加一个读写层如果运行中的容器修改了现有的一个已经存在的文件那该文件将会从读写层下面的只读层复制到读写层该文件的只读版本仍然存在只是已经被读写层中该文件的副本所隐藏这个叫做 “写时复制cow”机制关闭并重启容器其数据不受影响但是删除Docker容器则其更改将会全部丢失存在的问题就是存储于联合文件系统中不易于宿主机访问容器间数据共享不便删除容器其数据会丢失解决方案就是使用volume中文叫卷或者存储卷“卷”是容器上的一个或多个“目录”此类目录可绕过联合文件系统与宿主机上的某个目录“关联”或者叫“绑定”
docker是容器运行的底层引擎在组织和运行其容器时一般只运行一个程序及其子程序。 而程序启动时所借助的镜像很可能是不止一层的联合挂载组成的。像这种文件系统aufs和overlayfs2一定要在最上面挂载一个读写层对此读写层来说所有在容器中所执行的操作事实上都是保存在这一层之上的而对下层内容的操作比如要删除文件我们就需要使用cow机制。
如果一个文件在底层layer0是存在的而后在Layer1上标记删除他不会真的删除而是标记为删除。在layer2上就看不见了在Layer0上的文件在Layer2上标记为删除用户也同样看不见。也就是说如果一个数据在到达最上层之前我们把它标记为删除对于最上层的用户一定是不可见的如果是没标记为删除的或者是标记为删除的而用户在最上层又建了一个一模一样的同名文件的用户才可见。我们去访问一个文件修改删除之类的操作之后再访问效率非常的低。尤其是那些对IO要求比较高的应用比如redis这样的系统在存储数据的时候势必在于实现底层数据存储的时候对于底层存储系统的性能要求较高。又比如我们运行了一个存储系统比如mariadb或者mysql本来mysql对于性能的要求就比较高而mysql是运行在容器中自己创建的文件系统也就是通过联合挂载之后运行在最上层的可写文件系统之上的时候不仅在容器停止的时候数据会被删除而且在存储的时候效率也非常的低。 这就导致这类对IO要求比较高的应用在使用容器本身的读写层时性能影响比较大。
要想绕过这种使用的限制我们需要使用存储卷的形式来实现。 在宿主机上找一个文件系统这个文件系统上可能存在一个目录我们就把这个目录直接与容器内部的文件系统之上的某一目录建立绑定关系就好像挂载一样。比如我们把主机上的/data/web与容器内的/containers/data/web目录建立映射关系向/data/web中写目录的时候会写在宿主机的/containers/data/web目录就好像mount –bind的效果。这样就使得我们容器内的进程实现数据保存时能够绕过容器内部文件系统的限制从而与宿主机的目录建立关联关系我们可以在容器内和系统上共享数据内容让他们的数据是同步的本来mount这样的名称空间本来应该是隔离的但是我们却可以让两个本来是隔离的文件系统在某个子路径上建立一定程度的绑定关系从而使得在两个容器之间的文件系统的子目录上不再是隔离的而是能够实现一定意义上共享的效果。所以像这样的关联关系使得像容器之间跨文件系统共享数据这类需求变得容易了。而主机上的这个目录就是跟容器内建立绑定关系的目录对于容器来讲就称作volume就是存储卷。
2. 什么叫存储卷呢
存储卷提供了多种功能来持久存储和共享数据 Volume于容器初始化之时就会创建由base image提供的卷中的数据会于此期间完成复制数据卷可以在容器间实现共享和复用对于数据卷中数据的更改是直接体现在宿主机上的绑定的目录的在更新镜像的时候数据卷是不变的即使容器被删除了数据卷还是存在的
如果容器内进程的所有有效数据都是保存在存储卷从而脱离的容器自身的文件系统以后带来的好处就是当容器关闭甚至删除时我们都不用担心数据会丢失了。
不删除与之绑定的在宿主机上的存储目录就可以了。因此数据就实现了持久脱离了容器生命周期的持久这样即便容器被删除只要我们的容器在重建的时候让他关联到同一个存储卷上虽然创建的容器已经不是此前的容器了但是数据还是那个数据。
容器会被当成一个有生命周期的动态对象来使用容器关闭就是容器被删除的时候但是底层的镜像不删除我们可以基于镜像再启动一个容器。我们启动容器的时候如果我们忘记了上次关联的文件目录怎么办如果可以的话我们希望有一个文件能够保存下来我们上次的容器是怎样启动和保存相关配置的这个一般都是容器编排工具的作用。这样还有一个好处就是容器启动在哪台主机上就不太重要了。如果我们有多个docker host他们所关联的卷也不是宿主机本地的文件系统我们会使用nfs共享出来一个目录这每一个docker主机挂载了nfs目录对于宿主机来讲就好像是挂载了本地目录一样先确保宿主机能够驱动并且连接到后端的存储服务上去。这每一个宿主机都必须是nfs客户端并且能够正常挂载nfs文件系统。在宿主机之上我们启动某一个容器的时候使用自己本地的目录关联到了容器上的某个目录而这个目录恰恰就是nfs之上的某个目录随后容器启动保存数据会保存在宿主机之上。然后这个容器就可以被删除了下次容器启动在哪并不重要我们可以在全集群内调度这个容器并启动只要nfs上的数据目录还在 且宿主机也能够关联到nfs之上我们就还能访问到。
因此我们以后再去分配存储计算和内存资源的时候就不需要局限在单机之上了而是在集群内部所有的机器上进行。 这种机制很多容器编排工具都能实现但是这后面非常依赖一个共享的存储系统。
存储卷的初衷是独立于容器的生命周期实现数据持久化因此删除容器之时既不会删除卷也不会对哪怕未被引用的卷做垃圾回收操作当然如果我们删除容器的时候使用特殊的选项也能够一并删除存储卷。卷为docker提供了独立于容器的数据管理机制 可以把“镜像”想象成静态文件例如“程序”把卷类比为动态内容例如“数据”于是镜像可以重用而卷可以共享卷实现了“程序镜像”和“数据卷”分离以及“程序镜像”和“制作镜像的主机”分离用户制作镜像时无须在考虑镜像运行的容器所在的主机的环境
Docker有了存储卷之后在内部读取数据时如果写在/上那么还是会写在联合挂载文件系统上只有写在挂载卷上来比如/data就会被关联到宿主机的某一个目录上来。又比如我们在运行程序的时候会产生一些临时的文件这些文件通常都会被写在/tmp下面而tmp下面的数据都会被写在联合挂载的文件系统上。由于这些数据不需要保存他们会随着容器的删除而删除。
如果说我们期望应用能够在多台机器上运行的话就需要他在其他宿主机上启动的时候能够找到此前存储数据的地方否则这种启动和运行就不再是此前的容器所实现的效果了。这个对我们的生产是不适用的因此持久存储是必备的条件。 对于这种有状态的应用来讲不用存储卷数据只能放在容器本地即使我们能接受他的存储效率但是他会导致容器无法被迁移相当于与当前宿主机绑定。一旦生命周期停止我们只能让他处于停止状态而不能删除需要下次启动的时候再启动这个容器才能保证数据还在。 一旦删除了就不存在了因为他的可写层是随着容器的生命周期存在而存在的 。 所以这么一来大家应该牢牢建立起来一个概念对于有状态的应用只要他有存数据的需求那么持久卷就是必须的。
不过对于docker的存储卷用起来并没有这么麻烦他并没有我们想象的这么强大的功能至少说如果不借助额外的体系来组织这个维度的。因为docker的存储卷默认的情况下是使用其所在的宿主机之上的本地文件系统目录的。 也就是说宿主机自己有一块磁盘磁盘并没有共享给其他的docker主机而这个容器所使用的目录是关联到宿主机上磁盘的一个目录而已也就意味着这个容器在当前一个宿主机上启动创建再删除只要他关联到宿主机的目录那么他的数据就还存在如果我们把他调度到其他机器上就不能的这也是docker本身没有解决的问题。 所以说docker的存储卷本身只能是宿主机的本地存储而不是我们刚才说的共享存储。 大家发现其实如果我们手动创建nfs服务器并且挂载到宿主机上然后让容器在挂载的时候挂载nfs服务器所提供的存储的的方式也可以实现数据的跨主机迁移。但是这样的缺陷也很明显就是这样也很依赖于运维人员的手动操作。
3. 存储卷的类型
Docker有两种类型的卷每种类型都在容器中存在一个挂载点但其在宿主机上的位置有所不同 Bind mount volume一个在宿主机文件系统上指向用户指定位置的卷。也就是说两个卷都需要手工指定然后才能建立绑定关系。 Docker-managed volumedocker进程创建的在宿主机上的一个由docker管理的分区。也就是说我们只管指定容器内部的卷路径而在宿主机上的目录是由docker创建的我们不需要人工干预。这样极大的减少了卷在使用时候的耦合关系缺点是没法手动指定目录这种卷用于临时使用很方便但是如果容器删除而需要再次挂载这个卷的时候就必须找到指定位置的目录也就是含有容器ID的目录重新挂载上去才能继续使用上次的卷。
4. 在容器中使用Volumes
为docker run命令使用-v选项即可使用Volume
4.1 Docker-managed Volume
docker run -it --name bbox1 -v /data busybox
# 查看bbox1容器的卷、卷标识符及挂载的主机目录
docker inspect bbox1使用docker inspect来观察一下容器会看到 Volumes: {/data: {}},而挂载的位置在
Mounts: [{Type: volume,Name: 9e62f0c4931f7ea297e12d6baeb0ab74609fb4f85efdff8d5805e5332d8166c6,Source: /home/webedit/docker_data_root/volumes/9e62f0c4931f7ea297e12d6baeb0ab74609fb4f85efdff8d5805e5332d8166c6/_data,Destination: /data,Driver: local,Mode: ,RW: true,Propagation: }],也就是说如果我们在/home/webedit/docker_data_root/volumes/9e62f0c4931f7ea297e12d6baeb0ab74609fb4f85efdff8d5805e5332d8166c6/_data路径下创建一个文件则在容器的/data目录下也能看到。
4.2 Bind-mount Volume
这次我们使用本机的/tmp作为存储卷送给docker的/data/tmp目录去挂载
docker run -it --name bbox1 -d -v /tmp:/data/tmp busybox我们在通过docker inspect去查看mounts Mounts: [{Type: bind,Source: /tmp,Destination: /data/tmp,Mode: ,RW: true,Propagation: rprivate}],另外如果指定的宿主机目录并不存在docker也会自动创建目录。
4.3 Shared Volume
既然我们可以把一个目录分给容器做为存储卷使用我们同样也可以把这个目录同时分给另外一个目录使用同时也实现了在容器间共享数据了。也就是让他们同时挂载宿主机上的同一个卷。
docker run --name b1 --it -d --rm -v /data/tmp:/tmp busybox
docker run --name b2 --it -d --rm -v /data/tmp:/tmp busybox通常来说我们使用共享卷的时候需要在创建的时候指定这个卷也就是要记住宿主机的目录的名字。 而Docker还支持共享已经启动的容器的存储卷也就是说我们只要指定容器名字就可以读取这个容器内的定义好了的宿主机和容器内目录且在创建新容器的时候直接应用到新容器中。也就是说我们先创建一个容器只要这个容器存在就可以不一定要启动只不过在创建这个容器的时候我们指定他应该使用什么样的存储路径但是我们不启动他让他作为其他容器启动时候的架构容器或者叫模板容器我们创建新容器的时候复制架构容器的配置来启动新容器。好处就在于我们可以直接获取架构容器中的设定当然如果只是为了存储卷这一个用途这样有点大材小用。我们前面还学过joined containers他还可以共享网络的名称空间。 文章转载自: http://www.morning.xzgbj.cn.gov.cn.xzgbj.cn http://www.morning.fmqw.cn.gov.cn.fmqw.cn http://www.morning.gcfg.cn.gov.cn.gcfg.cn http://www.morning.ysmw.cn.gov.cn.ysmw.cn http://www.morning.ykyfq.cn.gov.cn.ykyfq.cn http://www.morning.tsnq.cn.gov.cn.tsnq.cn http://www.morning.mxptg.cn.gov.cn.mxptg.cn http://www.morning.nywrm.cn.gov.cn.nywrm.cn http://www.morning.nckjk.cn.gov.cn.nckjk.cn http://www.morning.mcjyair.com.gov.cn.mcjyair.com http://www.morning.fdfdz.cn.gov.cn.fdfdz.cn http://www.morning.qllcm.cn.gov.cn.qllcm.cn http://www.morning.sffkm.cn.gov.cn.sffkm.cn http://www.morning.xrtsx.cn.gov.cn.xrtsx.cn http://www.morning.lfjmp.cn.gov.cn.lfjmp.cn http://www.morning.kncrc.cn.gov.cn.kncrc.cn http://www.morning.nbiotank.com.gov.cn.nbiotank.com http://www.morning.htbbp.cn.gov.cn.htbbp.cn http://www.morning.gmgnp.cn.gov.cn.gmgnp.cn http://www.morning.bntgy.cn.gov.cn.bntgy.cn http://www.morning.nktgj.cn.gov.cn.nktgj.cn http://www.morning.pmsl.cn.gov.cn.pmsl.cn http://www.morning.ljmbd.cn.gov.cn.ljmbd.cn http://www.morning.ydrn.cn.gov.cn.ydrn.cn http://www.morning.okiner.com.gov.cn.okiner.com http://www.morning.pbzlh.cn.gov.cn.pbzlh.cn http://www.morning.rqjl.cn.gov.cn.rqjl.cn http://www.morning.plqsz.cn.gov.cn.plqsz.cn http://www.morning.snxbf.cn.gov.cn.snxbf.cn http://www.morning.nmqdk.cn.gov.cn.nmqdk.cn http://www.morning.bryyb.cn.gov.cn.bryyb.cn http://www.morning.kzxlc.cn.gov.cn.kzxlc.cn http://www.morning.ljngm.cn.gov.cn.ljngm.cn http://www.morning.lqws.cn.gov.cn.lqws.cn http://www.morning.nrtpb.cn.gov.cn.nrtpb.cn http://www.morning.fbzyc.cn.gov.cn.fbzyc.cn http://www.morning.bbgr.cn.gov.cn.bbgr.cn http://www.morning.gbhsz.cn.gov.cn.gbhsz.cn http://www.morning.wpspf.cn.gov.cn.wpspf.cn http://www.morning.gcbhh.cn.gov.cn.gcbhh.cn http://www.morning.pqjpw.cn.gov.cn.pqjpw.cn http://www.morning.wfttq.cn.gov.cn.wfttq.cn http://www.morning.mnwb.cn.gov.cn.mnwb.cn http://www.morning.pzlhq.cn.gov.cn.pzlhq.cn http://www.morning.jfxth.cn.gov.cn.jfxth.cn http://www.morning.fxzlg.cn.gov.cn.fxzlg.cn http://www.morning.bfysg.cn.gov.cn.bfysg.cn http://www.morning.prmbb.cn.gov.cn.prmbb.cn http://www.morning.hhnhb.cn.gov.cn.hhnhb.cn http://www.morning.dmtwz.cn.gov.cn.dmtwz.cn http://www.morning.jjnry.cn.gov.cn.jjnry.cn http://www.morning.qfmcm.cn.gov.cn.qfmcm.cn http://www.morning.fnzbx.cn.gov.cn.fnzbx.cn http://www.morning.cptzd.cn.gov.cn.cptzd.cn http://www.morning.pzbjy.cn.gov.cn.pzbjy.cn http://www.morning.clyhq.cn.gov.cn.clyhq.cn http://www.morning.mjdbd.cn.gov.cn.mjdbd.cn http://www.morning.rzysq.cn.gov.cn.rzysq.cn http://www.morning.fbjqq.cn.gov.cn.fbjqq.cn http://www.morning.qgbfx.cn.gov.cn.qgbfx.cn http://www.morning.lnbcx.cn.gov.cn.lnbcx.cn http://www.morning.prgyd.cn.gov.cn.prgyd.cn http://www.morning.bpmdr.cn.gov.cn.bpmdr.cn http://www.morning.nwjd.cn.gov.cn.nwjd.cn http://www.morning.qnzgr.cn.gov.cn.qnzgr.cn http://www.morning.ghcfx.cn.gov.cn.ghcfx.cn http://www.morning.c7496.cn.gov.cn.c7496.cn http://www.morning.ey3h2d.cn.gov.cn.ey3h2d.cn http://www.morning.hdwjb.cn.gov.cn.hdwjb.cn http://www.morning.ylxgw.cn.gov.cn.ylxgw.cn http://www.morning.lyldhg.cn.gov.cn.lyldhg.cn http://www.morning.gczzm.cn.gov.cn.gczzm.cn http://www.morning.rltw.cn.gov.cn.rltw.cn http://www.morning.ygkk.cn.gov.cn.ygkk.cn http://www.morning.xrmwc.cn.gov.cn.xrmwc.cn http://www.morning.zkjqj.cn.gov.cn.zkjqj.cn http://www.morning.fprll.cn.gov.cn.fprll.cn http://www.morning.rjnky.cn.gov.cn.rjnky.cn http://www.morning.kybjr.cn.gov.cn.kybjr.cn http://www.morning.jwefry.cn.gov.cn.jwefry.cn