网易技术实践|Docker文件系统实战

在本文中,我们来实战构建一个Docker镜像,然后实例化容器,在Docker的生命周期中详细剖析一下Docker的文件存储情况和DockerFile优化战略

网易技术实践|Docker文件系统实战
在初步实战之前,我们先介绍一个概念,联合文件系统(Union File System)。联合文件系统是完成Docker镜像的技术基础,支撑对文件系统的批改作为一次提交来一o 6 z J O 6 q h层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。镜像的分层存储和继承便是根据此特性完成。

下面是Docker官方的一$ @ X I b } | W张描绘文件系统的图片,闪现了一张联合文件系统在串联镜像层和容器层起到的作用

网易技术实践|Docker文件系统实战

Docker支撑多种联合文件系统,常见的有aufs,deviceMapper,overlay,ov* # s Qerlay2,本文章中运用的系统版别为debian9.1,Docker版别为17.06.2-ce,默许运用是overlay2。

看到这里假设你现已对Docker文件体l ) 8 M n n 0 3系有了简略的概念,那么让我们初步实战,来对分层文件系统的存储方式进行愈加深化的了0 b G 9 G `解。

镜像层

这是一个云信私q E q ] o t 7 A有化项目中根据debian系统镜像创立的jdk8基础镜像,为了便利阅览和剖析,我们Dockerfile进行了一些精简,只保存中心部分内容
FROM hub.c.163.com/library/debian:stretch
MAI ^ 4 IINTAINER nim
#下载jdk
ADD http://10.17i $ 3.11.100/nim/jdZ g 1 N K ^ )k-8u202-linux-x64.tar.gz /usr/local/nim/
#解压jdk并删去
RN G u P D N 2 r PUN t} [ K 9ar -xzvf /usr/local/nim/jdk-8u202-linux-xu z z64.tar.gz -C /usr/local/nim/ 
&& rm /usr/local/nim/jdk-8u202-linux-x64.tar.gz
#设置环境变量
ENV JAVA_HOME=/usr/localA h A + n y 1/nim/jdk1.8.0_202
ENV PATH=$JAVAK 5 ] 1 m * O_HOME/bin:$PATH
CMD9 I $ S G 9 u ["/bin/bash"]
根据构建镜像,检查构建效果,原基础镜像100M,构建后镜像体积697M。
网易技术实践|Docker文件系统实战

镜像存? Q h h

现在初步看一下构建镜像作业在文件层存储情况。首要我们运用Docker history检查一下刚刚构建镜像情况,可以看到基础镜像占用100M,两个镜像分层占用194MB和403M。

网易技术实践|Docker文件系统实战

接下来我们看检| Y o 4查一下文件系统中的存储情况,本环境运用overlay2,Docker镜像层存储默许途径为/var/lib/Docker/overlay2/,可以看到镜像存储目录下有4个目录,其间110M的对应是根h T B # ~ S L底镜像,另外两个为ADD JDK(186M)和解压JDK紧缩包的镜像分层(389M)。

网易技术实践|Docker文件系统实战

其间的l目录包含了全部层的软连接C y p q ; w C Q,软链接运用短称谓,防止/ + V R y _ Dmount时分参数到达页面巨细约束。

网易技术实践|Docker文件系统实战

下面我们了解一下,每个分层中的文件内容。基础镜像分层包含diff文件夹和link文件,diffm F : 1 y L文件夹中存放其时分层内容,link文件记载短称谓。

网易技术实践|Docker文件系统实战

接下来看一下COPY JDK生成的内容,diff文件夹保存了jdk紧缩包,本层比较基础镜像层,多了lower,merged,work三个文件/文件夹,其间lower记载了此层的下层Ix t B dD(基础镜像层),merged目录作为供应了一致视图,在容器层读写层被运o – J R z { 1 y用,work目录用于联合挂载指定的作业目录,运用进程对用户不行见。

网易技术实践|Docker文件系统实战

解压JDK层的文件夹结构内容和上一层类似,首要重视jdk紧缩包占用空间为0,表明已被删去。

网易技术实践|Docker文件系统实战

现在来重点重视一个问题,镜像巨细等于全部分层相加,在后续分层中被删去的jdk紧缩包仍然要占用存储空间,这并不是我们本来意图,因此这里就呈现了镜像文件进行优化# m R D a $的点。优化后的Dockerfile如下

FROM hub.c.163.com/library/debian:s1 v ( P k { 8 + Dtretch
MAINTAINER nim
RUN curl -o /u I M M 2 Lusr/local/nim/jdk-8u202-linux-x64.tar.gz http:/% D L P c 2  z ./10.173.11.100/nim/jdk-8u202-linux-x64.tar.gz 
&& tar -xzvfm 4 ] t . /ur ( rsr/local/nim/jdk-8u202-linux-x64.tar.gz -C /usr/local/nim/ 
&& rm /usr/local/nim/jdk-8u202-linux-x64.tar.gz 
&aw 9 u s B u J |mp;& export JAVA_HOME=/usr/lo9 x H R l 8cal/nim/jdk1.9 * 6 e 7 R )8.0_202 
&& export PATH=$JAVA_HOME/bin:$PATH
CMD [) v ) h J r , : {V N a R S k"/bin/bash"]
借这个优化后的内容,我们再谈一下构建Docker镜像时在时间和空& c $ O F n :间可优化的点:
  1. 组合运行句子:兼并相同类型D 8 j W $ ` i构建句子,能{ Y Y H G %够有用削减镜像分t L =层;
  2. 利用镜像构= P . P 5 8 )建缓存:时间同步,基础软件装置等固定内容在镜像前部分处理,镜像重新构建时会运用缓存,节省时0 o 1刻;
  3. 收拾中心产物:留心9 1 Y ~ / ) ! e `装置进程中运用的软件和紧缩包在必定要同一层里收拾,不然仍然会占用镜像s ) C u @ ` L空间;
  4. 构建句子优化:比方ADD在处理! s T本地文x . K件时可以I v h / 5 c : X ;直接解紧缩,起到COPY + RUN tar的作用;
  5. ~ n ^ %化基础镜像源:国内高校和大型IT企业都有_ , r G m创立镜像站,选择一个安稳更新及时的镜站可以有用缩短构建时间;
举例的镜像中优化战略触及1,3条,用curl替代5 2 9 A ] o (add,与解p i o w 0 |压和c E D删去兼并为一层,Dockerfile削减了层数,收拾中心进程的jdk装置包,下图是优化后镜像体积变化:
网易技术实践|Docker文件系统实战

构建镜像真的是层数越少越好吗?当然不是这么肯定,尤其在早期镜像版别不是很安稳或是后续迭代比较频频时,合理的镜像分层会削减编译时间,下降出错概率,也可以让Dockerfile更具有可读性。可以再安稳版{ | 9 ^ u别构成之后对镜像进行二次优化。

镜像元数据

剖析一个镜像元数据我们首要重视三个目录
/vaC p w s jr/lib/Docker/image/overlay2, c } : i L O `/imaged/
/var/lib/Docker/image/overlay2/layerdb/
/var/lib/Docker/ove2 c i N  f | F 5rlay2/
第一个目录保存镜像基础元数据,第二个目录保存镜像分层元数据,第三个是上文说到的分层} C g | w存储目录,保存实践分层内容。下面就根据实践情况来看一下,元数据与存储信息是如何相关起来的。

Docker镜像的基本信息保存在/var/lib/Dockec } @ E @ n Hr/image/overlay2/imaged/c o f = ) 7content/sha256/下面,可以根据Docker image ID在此目录下查找到对应ID最初文件。此文件中以json的方式保存了该镜像的分g g m i C l d 2层文件系统、构建信息、相关容器等内容。

网易技术实践|Docker文件系统实战

第二个目录/var/lib/Docd ] pker/image/overlay2/layerB } _ odb/sha25# k s 1 A ]6/保存分层元数据,每一个分层元数据目录下有cache-id,dy – b n + z b Diff,size信息,其间cache-iq [ C 0 d对应分层存储层,diff相关镜像基础元数据信息。

网易技术实践|Docker文件系统实战
网易技术实践|Docker文件系统实战
网易技术实践|Docker文件系统实战

容器层

首要我们来发动一个容器,挂载宿主机/opt/yunxin目M [ r D 6 2 W Y录到容器/usr/local/yunxin目录
网易技术实践|Docker文件系统实战

创立容器结束之后,在o t z H @ g 9 $镜像存储目录/var/lib/Docker/overlay2/会生成容器的初始层和读写层,两者运用相同标识,初始层后边多了-init。初始层中首要保存初始化容器环境时,与容器相关的环境信息,如容器主机名,主机host信息以及域名服务r @ b文件等;读写层用于容器的读写,Doc1 f d ; W V gker容器内的进程只对读写层具有写权限,而对其他层文件内容只具& b P : ^ e ^ [ P有读权限。

网易技术实践|Docker文件系统实战

接下来我们进入容器操作进行一系列操作,再根据效果剖析一下读写层关于文件的保存和处理,下面是操作和对应效果以及读写层实践文件存储情况。

网易技术实践|Docker文件系统实战
网易技术实践|Docker文件系统实战

读写层中的merged文件夹供应了一致视图,面向& w T d用户展示联合文件系统挂载结束的终究形状。

网易技术实践|Docker文件系统实战

接下来我们再根据同一个镜像发动几个容器实例,然后来[ R X @ ; 2 y ,查询一下Docker容器运用空间,只要第一个容器因为上面批改文件只占用154k,新发动的容器并没A N L G F C b有额定占用空间。可见根据同一个镜像创立容f % i G器时,全部的容器# q ,同享镜像层内容,有用节约了空间。读写层只保T . 4存批改内容,假设是操作镜像层; E i $ !文件,Docki a – + # Ger选用的是批改时复制战略(copy@ 1 P ( H D m-on` I @ h P A ? @ x-write)。这时回头再看一下第一节呈现的两张图,会对Docker的文件系统有了更深的体会。

网易技术实践|Docker文件系统实战

结语

DockM { +er 镜像和容器文件系统相关知识在云信私有化产品的镜像管理和运维存储管理方面作出理论支撑,但这只是深化了解DockY Y % 4 , b K % 4er的初步。随着时间的沉积和云信旗下IM、音视频、点播以及许多相关产品私有化作业的深化,更B = ; 3 C 8 i多的模块和镜像l A J X w,更多的客户和需求,更杂乱的网络和环境都逐渐呈现在我们面前。Docker作为构建云信私有化服务的基础,只要更深化的去了解原理才能在运用中去更好的优化产品和展开运维。期望我们v f n a X能为用户供应更可靠的云信私有化服务,也期望能在后续的文章中能与我们共= 1 ) . m U享更多关于Docker的知识。
立即了解网易云信私有云>>

更多技术干货,欢迎重视vx大众号“网易才智企业技术+”。系列课程提早看,精品礼物免费得,还可直接对话CTO。

听网易CTO叙说前沿调查,看最有价值技术干货,学网易最新实践经验。网易才智企业技术+,陪你从考虑者成长为技c p 4能专家。

发表评论

提供最优质的资源集合

立即查看 了解详情