《容器基础镜像的编写及最佳实践.docx》由会员分享,可在线阅读,更多相关《容器基础镜像的编写及最佳实践.docx(27页珍藏版)》请在优知文库上搜索。
1、容器始于镜像,在容涔作为云原生架构上的工作负载发挥其应用价值之前,它以镜像的形式存在并流转。相比于攻击生命周期较短的容器,聪明的攻击拧往往会选择投毒镜像,这样不管是基于该饿像运行容器抑或是生成新的镜像,全部都将含有恶意成分。不然了解饯像,就无法建立对镜像的管理体系。镜像有哪些种类?镀像里有哪些内容?镜像该由谎来构建又如何构建?通过本内容学习您将清楚了解到容器镜像的施本概念,容器镜像在容器云平台系统组成中的位巴,镜像主要特点以及容器镜像和虚拟机镜像的区别。基于以上基本概念了解的前提下,本文延伸讲解容卷债像的分类,各类镜像如何在企业业务中使用,健护.其中最重要部分是给大家讲解各类债像的构建方式以及
2、僮像构建的最佳实豉.最后前要总结如何通过自动化的方式进行俵像创建管理具体实践中每个容器云平台的实现方式不同,大家可以在工作中根据业务需要进一步丰寓。镜像是容器之源,在文末介绍了从镜像到容器运行起来的过程,结合操作系统核心技术解择了如何通过其中涉及的各类技术实现容器的虚拟化。息之,通过本内容的学习可以零基础了解镜像的基本概念,同时逐步掌握镜像的构建原理以及镜像构建方面的企业最佳实践,为大家在以后工作中创建镜像羹定技术基础.1基本概念1.1 Docker系统组成整体D。Cker的系统包括以下主要组成部分,包括D。Ckerdient、Dockerdaemon.DockerregistryDOCker
3、镜像、DOCker容涔,他们之间的关系如下图:Docker架构主要分为客户端和服务端,客户端负责发起请求,服务端负责接受,解析和处理请求,图示中的DockerClient即为DoCker客户端的一个命令行工具,用户通过DockerClient与DockerDaemon进行通信井返回结果给用户.也可以使用其他工具通过DockerApi与DockerDaemon通信.拿一个简单的拉取潦像并运行容器的过程举例便于大家更好的理解容器系统架构.从上图中我们可以看到,当daemon接收到由CIient发起的dockerrun等运行容器指令时,docker系统先会由registry(本地镜像仓库)中拉取磷像
4、,图示中拉取了ubuntu:14.04镜像.当由UbUntU:14.04镜像启动容器时,UbUntU:14.04潦像的镜像层Iayer内容将作为容器的rootfs;而UbUntU:14.04镜像的yaml文件(json格式),会由Dockerdaemon解析成为该docker运行起来后的各项配置,并提取出其中的容器执行入口CMD信息,以及容器进程的环境变量ENV信息,最终初始化容器进程。当然,容器进程的执行人口来源于镜像提供的rootfs.在传统的1.inux操作系统内核启动时,首先挂载一个只读的rootfs,当系统检测其完整性之后,再将其切换为读写模式.而在Docker架构中,当Docker
5、daemon为Docker容器挂载rootfs时,沿用了1.inux内核启动时的做法,即将rootfs设为只读模式。但d。Cker运行的下一步产生了与传统IinUX的差别,这里要特别注意,在挂载完毕之后,docker系统利用联合接载(UniOnmount)技术在已有的只读rootfs上再挂载一个读写层。可读写的层处于Docker容器文件系统的最顶层,其下可能联合挂载了多个只读的层,只有在Docker容器运行过程中文件系统发生变化时,才会把变化的文件内容写到可读写层,并如同photoshop中的多层覆表一样,由最顶层的新的文件内容覆盖掉只读展中的旧版本文件(旧版本文件依旧存在只是被盖住了).1.
6、2 D。Cker镜像Docker镜像是一个只读的Docker容器模板,含有启动Docker容器所需的文件系统结构及其内容,是启动一个Docker容器的基础,但是需要重点注意镜像中不包括系统内核,在下文也会讲述这是容器与虚拟机最关键的区别之一。Docker镜像的文件内容(rootfs)以及一些运行D。Cker容器的配置文件组成了Docker容器的睁态运行环境。可以这么理解Q。Cker镜像是Docker容器的睁态视角,D。Cker容器是D。Cker镜像的运行状态.镜像是容器之源,如果大家熟悉java,镜像和容器的关系类似class文件和java对象的关系。1.3 Docker镜像特点-分层Dock
7、er镜像是采用分层的方式构建的,每个镜像都由一系列的镜像层”组成。分层结构是Docker镜像如此轻信的审要原因.当需要修改容器镜像内的某个文件时,只对处于最上方的读写层进行变动,不覆写下层已有文件系统的内容,已有文件在只读展中的原始版本仍然存在,但会被读写展中的新版本所隐藏.当使用dockercommit提交这个修改过的容器文件系统为一个新的镜像时,保存的内容仅为最上厩读写文件系统中被吏新过的文件.分房达到了在不同的容器说像之间共享镜像层的效果。- 骂时且制(不变性)Docker镜像使用了写时豆制(CoPy-On-Write)的策略.如果要在多个容器之间共享镜像,每个容器在启动的时候并不需要单
8、独复制一份镜像文件,而是将所有镜像层以只读的方式挂载到一个挂载点,再在上面覆盖一个可读写的容器层.在未更改文件内容时,所有容器等于共享同一份数据,只有在Docker容器运行过程中文件系统发生变化时,才会把变化的文件内容写到可读写层,并隐藏只读层中的老版本文件.写时复制配合分展机制减少了镜像对磁盘空间的占用和容器启动时间。- 内容寻址在Docker1.lO版本后,Docker镜像经历了较大的改动,其中最至要的特性便是引入了内容寻址存储(Content-addressablestorage)的机制,根据文件的内容来索引镜像和镜像层。与之前版本对每个镜像层随机生成一个UUID不同,新模型对镜像层的内
9、容计算校验和,生成一个内容哈希值,并以此哈希值代替之前的UUID作为镜像展的唯一标识.该机制主要提高了镜像的安全性,并在pull,push.load和save操作后检测数据的完整性.另外,基于内容哈希来索引镜像展,在一定程度上减少了ID的冲突并且增强了镜像国的共享.对于来自不同构建的镜像层,只要拥有相同的内容哈希,也能被不同的镜像共享.- 联合挂载通俗地讲,联合挂载技术可以在一个挂载点同时挂载多个文件系统,将挂载点的原目录与被挂载内容进行整合,使得最终可见的文件系统将会包含整合之后的各层的文件和目录.实现这种联合挂载技术的文件系统通常被称为联合文件系统(unionfilesystem),d。C
10、ker依靠此技术实现镜像本身的只读孱与生成容器以后产生的读写层的整合。1.4 Docker镜像和虚拟机僦像区别容器是一个应用层抽象,用于将代码和依籁资源打包在一起.多个容器可以在同一台机器上运行,共享底展操作系统内核,但各自作为独立的进程在用户空间中运行.因为剥离了相对沉电的操作系统,所以与虚拟机相比,容器占用的空间较少(容器镜像大小通常只有几十兆),瞬间就能完成启动.虚拟机(VM)是一个物理硬件属抽妥,用于将一台服务器变成多台服务器.管理程序允许多个VM在一台机器上运行.抵个VM都包含一整套操作系统、一个或多个应用、必要的二进制文件和库资源,因此占用大量空间.而且VM启动也十分缓慢.需要理解
11、的是,容器和虚拟化并不是一项冲突的技术,现实环境中在资源允许的情况下,可先通过虚拟化技术获得多台VM,再在VM上运行容器.容Hi应用A应用B应用C二进制文件/库二进制文件/库二进制文件/库DockerVMSfflA应用B应用C二进制文件/摩二遗制文件/座二进制文件/Jt喜户机摄作系蛟客户机(1作系姣客户机缰作系统理程序“破柒构主机!作系绫M础架构1.5 容器和虚拟机区别容器虚拟机启动白动应用内功操作系统,可能含“内用交付物容需镜像.*他像仓咋实现统一管理.支持私有悔像忏理和公有镜像忏理机M虚拟机成像,在Ift像管理功能,HI像在私行集辞内管理S像更新操作系统愤像版本更新,小N持悔像修改仅主特同
12、类中掾作系轨的容甥俶像版本更新、操作系统内的支持坦件更新同一布匕机支并不同操作系统由颗机.比如windows和HCUXNl育性cgrou.namespace隔隔不同OS密度单京l10单101001集群规模千千万万成百上千高可用策略“性、负收、功态_任*a,ifj二ZZzz1.管理平台Kubernetes-Openshift.SwarmVCenter.Openstack.AWS.Alryn适应场景以应用为中心,侧,Rr向用快速交M.构建PgS的挺础以枭统为中心,向取货源供绐,KJitIWS的映础2镜像分类根据实际容器镜像管理的经验,结合镜像的来源,镜像的用途以及镜像制作参与人员的不同将镜像分为4
13、类:- 官方操作系统镜像此镜像是操作系统厂商给出的OS的最基础版本,比如ubuntu,susel2sp3,centos,redhat,alpine,windowsNanoServer,WindowsServerCoreIQwindowsinsider等镜像其中开源的镜像比如apline镜像可以通过DoCkerhub官方网站下载,如使用susel2sp3横像标要请求SUSE它方支持获得.为了便于维护,此类型虢像的版本需要尽量少,并且尽量简单.- 公司操作系统镜像此镜像是在原厂镜像的基础上安装了经过公司内部OS运维人员审核过的工具包形成的镜像,此镜像的构建基于官方操作系统镜像.其中常见的工具包括必
14、要的诊断、编担工具等构建的符合行内规范的操作系统穗像.此部分镜像不区分应用运行环境,由容器云平台运维人员进行维护.- 公司基础镜像此镜像是在公司操作系统镜像基础上安装了符合公司版本规范的基础软件的镜像.比如安装了JDK,Tomcat,Apache,Nginx,Weblogic,Mysql等,此部分镜像不区分应用运行环境,由容器云平台运维人员进行运维.-公司应用镜像此镜像是用于公司业务运行的镜像,构建于公司操作系统说像或者公司基础镜像之上,一股为开发人员和运维人员共同构建,并且构建完毕以后随带一篇多个环境(开放/测试/生产)的部署说明,参数配置文件说明.注意,不建议直接下载第三方甚至Docker
15、hub上的基础镜像直接使用,比如ngin,tomcat镜像,理由:1)安全可控的目的,防止有“击”镜像.2)未融入公司的软件配置规范、未进行性能优化以及安全加固.3床融入公司软件基线管理体系,未引入持续构建机制,定期更新以及漏洞修复.3镜像制作根据镜像不同分类,镜像的制作方式也不尽相同,其中对于第一类镜像,即官方操作系统镜像。一般直接从厂商茨得,比如ubuntu,centos,suse.alpine等,并且从厂商获得的形式也不尽相同,比如rpm,minibootfs,镜像tar包.但是对于特殊发行软件,比如busybox,官方只提供了一个二迸制文件,因此需要通过自己构建rootfs进行构建.第一类镜像的构建属于基础镜像构建范购,一般情况有原厂制作,本若知其然也要知其所以然的目的,本文也准备特定亩节进行阐述.对于第二、三、四类镜像需要遵循一定镜像制作规范,通过命令或者自动化工具进行持续构建,此部分是常规的镜像构建过程,也是本文容器镜像构建阐述的函点,正如上面容器镜像分类说明的那样,第二、第三类镜像一般由容器云平台建设者进行构建,并提供维护,第四类是应用开发和应用运维负责人进行构建并维护.综上所述,镜像构建主要分为两大类,基础谎像构建和公司专属镜像构建.其中公司专属镜像构建的镜像是上面所述的第二、三、四类镜像.3.1