广东建设监理协会网站个人账号,推广一单500,宿迁网站建设要多少钱,开发自己的app多少钱在本文中#xff0c;我们来实战构建一个Docker镜像#xff0c;然后实例化容器#xff0c;在Docker的生命周期中详细分析一下Docker的文件存储情况和DockerFile优化策略。在开始实战之前#xff0c;我们先介绍一个概念#xff0c;联合文件系统#xff08;Union File Syste…在本文中我们来实战构建一个Docker镜像然后实例化容器在Docker的生命周期中详细分析一下Docker的文件存储情况和DockerFile优化策略。在开始实战之前我们先介绍一个概念联合文件系统Union File System。联合文件系统是实现Docker镜像的技术基础支持对文件系统的修改作为一次提交来一层层的叠加同时可以将不同目录挂载到同一个虚拟文件系统下。镜像的分层存储和继承就是基于此特性实现。下面是Docker官方的一张描述文件系统的图片显示了一张联合文件系统在串联镜像层和容器层起到的作用Docker支持多种联合文件系统常见的有aufsdeviceMapperoverlayoverlay2本文章中使用的系统版本为debian9.1Docker版本为17.06.2-ce默认使用是overlay2。看到这里如果你已经对Docker文件系统有了简单的概念那么让我们开始实战来对分层文件系统的存储方式进行更加深入的了解。镜像层这是一个云信私有化项目中基于debian系统镜像创建的jdk8基础镜像为了方便阅读和分析我们Dockerfile进行了一些精简只保留核心部分内容FROM hub.c.163.com/library/debian:stretch
MAINTAINER nim
#下载jdk
ADD http://10.173.11.100/nim/jdk-8u202-linux-x64.tar.gz /usr/local/nim/
#解压jdk并删除
RUN tar -xzvf /usr/local/nim/jdk-8u202-linux-x64.tar.gz -C /usr/local/nim/ rm /usr/local/nim/jdk-8u202-linux-x64.tar.gz
#设置环境变量
ENV JAVA_HOME/usr/local/nim/jdk1.8.0_202
ENV PATH$JAVA_HOME/bin:$PATH
CMD [/bin/bash]根据构建镜像查看构建结果原基础镜像100M构建后镜像体积697M。镜像存储现在开始看一下构建镜像工作在文件层存储情况。首先我们使用Docker history查看一下刚刚构建镜像情况可以看到基础镜像占用100M两个镜像分层占用194MB和403M。接下来我们看查看一下文件系统中的存储情况本环境使用overlay2Docker镜像层存储默认路径为/var/lib/Docker/overlay2/可以看到镜像存储目录下有4个目录其中110M的对应是基础镜像另外两个为ADD JDK186M和解压JDK压缩包的镜像分层389M。其中的l目录包含了所有层的软连接软链接使用短名称避免mount时候参数达到页面大小限制。下面我们了解一下每个分层中的文件内容。基础镜像分层包含diff文件夹和link文件diff文件夹中存放当前分层内容link文件记录短名称。接下来看一下COPY JDK生成的内容diff文件夹保存了jdk压缩包本层相比基础镜像层多了lowermergedwork三个文件/文件夹其中lower记录了此层的下层ID基础镜像层merged目录作为提供了统一视图在容器层读写层被使用work目录用于联合挂载指定的工作目录使用过程对用户不可见。解压JDK层的文件夹结构内容和上一层类似主要关注jdk压缩包占用空间为0表示已被删除。现在来重点关注一个问题镜像大小等于所有分层相加在后续分层中被删除的jdk压缩包仍然要占用存储空间这并不是我们原本意图因此这里就出现了镜像文件进行优化的点。优化后的Dockerfile如下FROM hub.c.163.com/library/debian:stretch
MAINTAINER nim
RUN curl -o /usr/local/nim/jdk-8u202-linux-x64.tar.gz http://10.173.11.100/nim/jdk-8u202-linux-x64.tar.gz tar -xzvf /usr/local/nim/jdk-8u202-linux-x64.tar.gz -C /usr/local/nim/ rm /usr/local/nim/jdk-8u202-linux-x64.tar.gz export JAVA_HOME/usr/local/nim/jdk1.8.0_202 export PATH$JAVA_HOME/bin:$PATH
CMD [/bin/bash]借这个优化后的内容我们再谈一下构建Docker镜像时在时间和空间可优化的点组合运行语句合并相同类型构建语句可以有效减少镜像分层利用镜像构建缓存时间同步基础软件安装等固定内容在镜像前部分处理镜像重新构建时会使用缓存节省时间清理中间产物注意安装过程中使用的软件和压缩包在一定要同一层里清理否则仍然会占用镜像空间构建语句优化比如ADD在处理本地文件时可以直接解压缩起到COPY RUN tar的作用优化基础镜像源国内高校和大型IT企业都有创建镜像站选择一个稳定更新及时的镜像站可以有效缩短构建时间举例的镜像中优化策略涉及1,3条用curl替代add与解压和删除合并为一层Dockerfile减少了层数清理中间过程的jdk安装包下图是优化后镜像体积变化构建镜像真的是层数越少越好吗当然不是这么绝对尤其在早期镜像版本不是很稳定或是后续迭代比较频繁时合理的镜像分层会减少编译时间降低出错概率也可以让Dockerfile更具有可读性。可以再稳定版本形成之后对镜像进行二次优化。镜像元数据分析一个镜像元数据我们主要关注三个目录/var/lib/Docker/image/overlay2/imaged/
/var/lib/Docker/image/overlay2/layerdb/
/var/lib/Docker/overlay2/第一个目录保存镜像基础元数据第二个目录保存镜像分层元数据第三个是上文提到的分层存储目录保存实际分层内容。下面就根据实际情况来看一下元数据与存储信息是如何关联起来的。Docker镜像的基本信息保存在/var/lib/Docker/image/overlay2/imaged/content/sha256/下面可以根据Docker image ID在此目录下查找到对应ID开头文件。此文件中以json的形式保存了该镜像的分层文件系统、构建信息、相关容器等内容。第二个目录/var/lib/Docker/image/overlay2/layerdb/sha256/保存分层元数据每一个分层元数据目录下有cache-iddiffsize信息其中cache-id对应分层存储层diff关联镜像基础元数据信息。容器层首先我们来启动一个容器挂载宿主机/opt/yunxin目录到容器/usr/local/yunxin目录创建容器完成之后在镜像存储目录/var/lib/Docker/overlay2/会生成容器的初始层和读写层两者使用相同标识初始层后面多了-init。初始层中主要保存初始化容器环境时与容器相关的环境信息如容器主机名主机host信息以及域名服务文件等读写层用于容器的读写Docker容器内的进程只对读写层拥有写权限而对其他层文件内容只拥有读权限。接下来我们进入容器操作进行一系列操作再根据结果分析一下读写层对于文件的保存和处理下面是操作和对应结果以及读写层实际文件存储情况。读写层中的merged文件夹提供了统一视图面向用户展示联合文件系统挂载完成的最终形态。接下来我们再基于同一个镜像启动几个容器实例然后来查询一下Docker容器使用空间只有第一个容器由于上面修改文件只占用154k新启动的容器并没有额外占用空间。可见基于同一个镜像创建容器时所有的容器共享镜像层内容有效节约了空间。读写层只保存修改内容如果是操作镜像层文件Docker采用的是修改时复制策略(copy-on-write)。这时回头再看一下第一节出现的两张图会对Docker的文件系统有了更深的体会。结语Docker 镜像和容器文件系统相关知识在云信私有化产品的镜像管理和运维存储管理方面作出理论支撑但这只是深入了解Docker的开始。随着时间的积淀和云信旗下IM、音视频、点播以及众多相关产品私有化工作的深入更多的模块和镜像更多的客户和需求更复杂的网络和环境都逐渐呈现在我们面前。Docker作为构建云信私有化服务的基础只有更深入的去了解原理才能在使用中去更好的优化产品和开展运维。希望我们能为用户提供更可靠的云信私有化服务也希望能在后续的文章中能与大家分享更多关于Docker的知识。立即了解网易云信私有云更多技术干货欢迎关注vx公众号“网易智慧企业技术”。系列课程提前看精品礼物免费得还可直接对话CTO。听网易CTO讲述前沿观察看最有价值技术干货学网易最新实践经验。网易智慧企业技术陪你从思考者成长为技术专家。