容器镜像的备份及恢复方案.docx
ENVPKGRE1.EASE1-bmterRUNset-xcreatengnxusergropfirsttobeconsistentthroughoutdockervariantsH(Uddgroup-system-gid101n9inxEthadduser-system-YrsabM-IogM-ingroupnginx-no-crwtt-hofnc-home/nonexistentrecos*,nginxuser*-shdlb<nfalsc-uid101ngiu8ftat-9etupdateWtapt-getinstall-rx>"<nstall-cofnmends-no-iretall-suggcsts-ygnupglca-ctificatcsftftNGIhlX_GPGKEY«573BFD6B3D8FBC641O79A6ARABF5BD827BOW62;found*:forservetinha4>ool.sks-kcy5cfvcr5.ncthkpJZkeyKrvcrubuntuem£0hkp80.pool.sks-kcyscrvers.ftttr80p9p.mitdu:doecho"FetchingGPGkey$NGaNX_GPGKEYfromSsw"apt-keyadv-keyserver"Sserver*-keysetver-optiomtimeout*10ecvkeyseSNGINXGPGKEYwHafound三ycsHftbruk;donc:tot-zSfoufxttttecho>tt2"11x:fadtofctcGPGkeySNGlNX_GPGKErHttexit1;APtretremove-purge-XKxemovt-y9nup9lHHrm-rfvarfW¼)ttaaftdpk9Arch-vS(dpkgfictarChiteCtlXftftn9inxPdu9e5*n9inx-SNGINX.VERSION|.$!PKG_RElEASejngmx-fnodulc-xsIt-SNGINX_VERS*ON$PKGJEIEASECgmX-modulc-geoNSNGlNX.VERSION)-$PKG.RE1.EASEngnx-module-im>gc-filter三SNGlNX_VERSIoN)-$PKGRE1.EASE)ngmx-module-n>>SNGINXVERSION.$NJSVERSION)-$(PKGRE1.fAs£wHftc×"SdpkgArcbeinM11d64i386)9archesOfficialybuiMbupstreamecho"debhttpsnginx.orgkagemainiiedebiarbust。nginx"»etgpt0urmJitd119ExJist&&apt-getupdate11)we'reonMarchitectureupstreamdoesn'toffid>llbuildforfIctSbu«ldbinariesfromthepublishedsourcepackagesecho"deb-vchttpi/nginjuorg/padogn/mianline/debian/bu%ternginx-»/ctc/apt/$ourres.li$t.d/nginx.list# newdirectoryforstoringsourcesand.dcbfilesftfttempDir="S(mktemp-d)-Etachmod777"StempDir"# (777toensureAPTs"_apt"usercanaccessitt)# savelistofcurrently-installedpackagessobuilddependenciescanbedeanlyremovedlaterEtftsavedAptMark="S(apt-markShowmanual)"# build.debfilesfromupstream'ssourcepackages(whichareverifiedbyapt-get)EtEtapt-getupdateEtEtapt-getbuild-dep-ySnginxPackagesaa(cd"StempDir"EtftDEB.BUI1.DOPTIONS="nocheckparalld-$(nproc)Napt-getsource-compileSnginxPackages)UWedon'tremoveAPTlistsherebecausetheygetre-downloadedandremovedlater# resetapt-mark's"manual"listsothat"purge-auto-remove"willremoveallbuilddependencies#(whichisdoneafterWeinstallthebuiltpackagessowedon'thavetoredownloadanyoverlappingdependenn)Etftapt-m>rkshowmanualK3rg%apt-markauto>knu1lftft-z"SuvcdAptM3rk*'t-markmanualSuvedAptMark;.createatemporarylocalAPTrepotoinstallfrom(sothatdependencyresolutiononbehandledbyAPT.asitshouldbe)ftftIsMAFheStempDireftfcdwStempDir*Hftdpkg-ScanpKiuigcs.>Fck>gft)HHgrep-Pc*j9e:,StempDirPckages"ftftecho-dcbtrusted>yefileStemPOirf>etcaptSoUrCWJiSt4ftugi“workroundthefollowingAPTissuebyusing"Acquire:6ZiPlndexes*f±"(overriding7etcap<>p1.conf.(Vdodcef-ip-i(kxes*)“Couldnotopenfile/var/)it/apt/)isb/partial/.tmp_tnip.0DW1jpQfk£_._P!KUges-open(13:Rfrmissiondenied).E:F4cdtofetchStOreMm岫pt1sW叼)ODVjpQfk£_,_P»cU9«Couldnotopenfile/vM/lib/apt/lisWpertial/_tmp_tmp,00W1)pQfkE_._P»du9CS-open(13:Rwmtssiondenied)Wt叩QFet-oAcquirt:<izip*n(kxcs»fal$eupdateesacEtEtapt-getinstall-no-istall-recommcnds-no-istalI-suggests-yJnginxPackagcsgettcxt-baHEtapt-getremove-purge-auto-remove-yCa-CCrtifiCateSHHrm-rfvarlibaptlistsetcapt$ource$.list.d/nginx.listifwchav«leftoversfrombuilding,Icfspurgeth<m(includingextra,unnecessarybuildCtePS)ftftif-n"StempDir-;thenapt-getpurge-y-auto-removeftftrm-rf"StcmpDir-/ctc/apt/sources.li$t.d/temp.list;fiRforwardrequestanderrorlogstodkcrlogCoIICetOfRUNIn-sfdevstdoutvarlognginxcccslogftftIn-sfdevstckrrvaognginxcor.logEXPOSEOSTOPSIGNA1.SIGTERMCMD("ginx".-g."daemonoff:"如下所示,是一个java应用构建容器樵像的Dockerfile.DodwfiiC文件:fromdaodou(IiMibfMy/tomcatMAINTAINERbcCOPYtestwarusrkaltomcatvcbaps第一个Nginx的例子中我们可以看到,其Dockerfile非常夏杂,而第二个java应用的Dockerfile很简单,基于tomcat将代码war包拷贝至潦像中即可.容器镜像Dockerfile一般可以分为两种,标准化应用的容器镜像Dockerfile,非标准化应用的容器Dockerfile.标准化应用容器的Dockerfile,变更很少,就像第二个DoCkerfiIe示例一样,只需要将不同的War包放进即可.这类的DoCkerfiIe备份一个即可.这类的容器镜像恢怎也有直接的企业流程,故而可以快速的恢复.Dockerfile本质上是一段构建拭像的脚本文件,存硫体积很小,需要迸行版本管理.Dockerfile的备份和存储,亘接使用企业现有的代码版本管理系统直接备份和保存即可.对于非标准化的镜像Dockerfile则针对不同的需求定制不同的Dockerfile,这类变更频次蛟低,构建的依赖文件或者环境往往不进行备份,此类如果病要备份和存储,需要将DockerFiIe中涉及的内容一起备份.本小节介绍了基于DoCkerfiIe的容IMlUt的备份和恢复,标准DOCkerfile,企业代码版本管理方式备份,构建环境恢复快速,容器铤像恢红.非标准Dgkerme.Dockurfile和依赖内容一起备份,也可恢史.需要注意的是根据DOCkCrfiIe备份从而实现愤像的备份,般上要用于CIZCD的场景。因为Dockerfile备份的何时,需要对其所依赖的文件以及构建环境都要进行答份,或者能实现快速创建,一旦构建环境或者依赖的uar包等无法快速创建或者恢复,是无法现在镜像的假更,3单个容器的备份和恢复容器说像是分蜃存储,从这个角度,镜像是相关文件的集合.镜像是否可以按照文件备份那样迸行备份呢?答案是肯定的。 tofcm9tt7I9rtphelk>-wfldhello-wofldIateKfce289e99ct9ISmonthsago14kB ,保存镇金至文件 dockersavehello-world>/daHhegwori&imige.ta1.JCdM3JhIgrephclk>-world-ifu9e.tar4z“期除UIB dockerrmi-fhello-worid:latntUnta99cd:helk>>wor1d:UtestUntagged:helkHwodda2S6dfddf63G36dMef479d645abS88S1SO3(X611aS6f337ac7f2fdd86d7e4eDekted:sha256ct289c99cWb<977dMl36fbc2a82b6b7d4<372474<923S*Jcl741675f587e认己畸镜便.(todcrm9es->Igrephclk>>world“导入VIG Mttfk»d<heHo-worW-1ma9c.tar.9z1.oadedimage:hctto-worldlatest”新馈像是否导入 dockerimagn7grvphelk>-worldKIQwortdlatestfct28*99cW15EthS390184kB在一般安装了docker的机器上,可以使用dockersave将容器境像保存至压缩文件。如需要镜像时候再将容器镜像导入至本地。如果是一个已经运行了容器,在原有的镜像中修改了一些文件,是否可以把相应的容器镜像进行备份?答案也是肯定的.“查全部运行的docefPS7CONTAINERK)IMAGECOMMANDCREATEDSTATUSPORTSHAMES77c3122319fOnginxalpinen9inxP'daemonof-w24houna90Up24hoursMcp*tvcrent-ho<stdtef,将运行的容器”iru制作成容荏快照,dockercommit77c3122319fOngnxzbkupsha2S6:1023f6fWM305fSbMdbOd7275fdc3110八36M48bOc3c72e24J2180b“此时容器快用将容爵保存成相应的各器镇便102f28fGf804Gsccondsago21.8MB9dockerimages-agrepngnxnnxbackup通过dockercommit将运行的容器先制作成相应的镜像,再通过上述的dockersave和dockerload将镜像导出和导入.将镜像导出成文件,再进行备份,可以通过各种的文件备份方案或者存储方案进行备份.这种方式在正式的场景中用的比较少,一是操作比较复杂,效率不商,二是备份存佬介质也有要求,三是正式场品中镜像数量较妥,也有成熟的容器镜像存储的方案。一般用在对于某些特性的场景镜像调试时候会采用.本小节演示和介绍了单个容叁、单个容IMt像的备份方法,操作而便,效率有待商椎.可以备份使用频次不高的镜像,对于福要快速恢复和部黑的场景需要商雄.4多容器镜像的备份和饮位容器镜像来源于DockerFiIe,那么只要将D。CkerfiIe和容器镜像制作的环境备份和存储,就能恢复容器镜像.这种方案的前提是能通过DOCkerFiIe快速的构建容器镜像.镜像的制作目的是进行使用,企业内部使用,或者企业外部使用.是否有一个专门存储镜像的仓库,镇可以支持容器镜像的高效下毂,友好首理昵?有.容器镜像管理仓库服务器称为imageRegiSter,其中相应的镜像仓库称为ImageRepository,一个ImageRegiSter可以包含多个Repository.一个Repository会包含同一个软件不同版本的镜像,而标签(Tag)就常用于对应该软件的各个版本。可以通过仓库名:标签的格式来指定具体是这个软件哪个版本的线像.如果不设立标签将以IateSt作为默认标签,如前面的nginx:alpine,其中nginx是软件名,alpine是标签.Hello-world没有指定Tag,在镜像直看是看到Tag是latest.doc*erug7Igrtphello-*woddhelk>>wof1dlatestfct289e99rtISmcmKago1.84*8容器镜像仓座有公有仓阵,也称第三方仓库,和企业内部自行搭建的称为,私有仓库。公有仓库(第三方仓库)公有的ImageRegiSter一股提供容器镜像免费上传和下在服务,也可提供付费镜像管理等服务.私有仓库私有仓库在企业内部使用,不对外发布,在局域网内,访问效率高.使用公有ImageRegister,容器钱像的备份一般相应的企业或者组织会进行维护。如需要企业内快速和高效使用,可以本地搭建一个私有ImageRegiSter进行本地Mirror.使用私有ImageRegister,需要了解其相应的架构,将其重要的数据文件进行备份.比如Harbor将数据使用独立的volume挂载,相应的磁盘在机器上做快照或者选用RAID系列,也可搭建多个ImageRegister进行同步备份,也可将数据使用共享存储进行挂载.目前的共享存储多种多样,例如SAN,NAS,分布式存储等,可以结合企业已有的共享存储是指快照或者异地备份等策略.ImHgeRegister能进行友好、高效、统一管理容器慢像.无论是采用公有ImHgeRegister还是私有ImageRegister,针对各个相应的软件服务将重要的数据备份,即能实现容器镜像的备份和恢发。5容器镜像的备份和恢复场景前面介绍了容器镜像存备份的场景以及相应的意义.针对不同的容器备份场景采用不同的容器潦像备份方式方法,如下所示是几种场景场景的解决方案。CI/CD流程中标准构建的容器镜像对于CI/CD流程中标准构建的容器镜像,其Dockerfile文件是标准,比如前面的java应用的DoekerfiIe,每个不同版本只需要替换其中的War包。此种场景中,只需要将Dockerfile进行版本管理,需要时将Dockerfile依赖的代码和环境是快速搭建和恢复,构建镜像,然后将镜像传送至ImageRegister,实现容器镜像存储在ImageRegister的生命周期较短保存,减轻ImageRegister的中容器镜像的存储压力。应用系统系统类应用,比如Ingress.CoreDNSlPormetheus等等,部署频次不高,同时镜像的个数也不多,这类应用应多重备份,多个ImageRegister之间备份,甚至可以参考上一章节的导出至文件进行备份,安全策略允许的前提下可以发布至公网的ImageRegister.安全审计安全审计通常时间跨度较长,如果一直存储在ImageRegister上,考无疑问有存储成本和ImageRegiSter镜像使用效率影响,此种场景可以分级进行备份.距离当前时间较长的镜像使用低成本的存储进行备份,距商当前时间短的镜像使用DOCkerfile、ImageRegiSter进行备份。总结本文介绍了容器镜像的本质,容器镜像的从代码,到Dockerfile,到镜像再到存储,再到业务运行的“一生".对于不同的需求有着不同的备份和存储的要求和意义。随着业务的增长和时间的推移,潦像的数量和存储的空间肯定都会面临挑战,所以一开始就需要明确存储和备份的业务需求,选择好对应的方案,再进行细化。就像使用ImageRegiSter也要细化容器镜像的生命周期,ImageRegister的存储方式,DockerRegister的高可用,监控、告警等等.希望本文从本质上介绍后,能给大家以更多的思考.