详解容器镜像优化.docx
《详解容器镜像优化.docx》由会员分享,可在线阅读,更多相关《详解容器镜像优化.docx(9页珍藏版)》请在第壹文秘上搜索。
1、对于刚接触容器的人来说,很容易被自己制作的DoCker镜像大小所吓到,我只需要个几MB的可执行文件而已,为何镜像的大小会达到TGB以上?卜面将从两方面来进行货像大小优化,一种是通过多阶段构建处理一种是使用不同的基础镜像进行特定优化与精简.1减少镜像大小这部分着于介绍多阶段构建(multi-stagebuilds),因为这是慢像精简之路至关至要的一环.在这部分内容中,我会解秣静态链接和动态琏接的区别,它们对愤像带来的影响.以及如何避免那些不好的影响。我们还是从helloworid的程序开始,用C语营实现如下:hdkc7intmain()putsCHelk.world!);return0:然后为其
2、编写Dockerfile.如下:SROM9COFYheIIox.RUNgcc-CKdloKdloxCMDeHowl执行Dockerbuild-theldgcc.进行构建后,发现偏像大小超过了1GB.因为该镜像包含了整个gcc镜像的内容,但其实编译好的代码可执行文件只有8.4KB,这显然不科学.Enr1o11us11nutes09032mnuteogo在声明构建阶段时,可以不必使用关域词AS,最终阶段拷贝文件时可以直接使用序号表示之前的构建阶段(从零开始),也就是说,下面两行是等效的:COPY-from三mytjiIdstagchello.COPY-from三Ohello.如果Dockerfil
3、e内容不是很豆杂,构建阶段也不是很多,可以直接使用序号表示构建阶段。一旦Dockerfile变聂杂了,构建阶段增多了,最好还是通过关燧词AS为每个阶段命名,这样也便于后期维护.细心的你,可能会发现上面以ubuntu为基础镜像还是大了些,能不能选择一个更小的潦像呢?当然可以,我们可以采用busybox或alpine镜像来替代该ubuntu镜像.2精简策略这部分将会针对不同的基咄镜像进行精简,比如scratch,alpine,slim等,还可以从语言层面进行精简,会以golang语言为例进行分析.2.1 golang精筒Go语言程序编译时会将所有必须的依赖编译到二进制文件中,但也不能完全肯定它使用
4、的是静态链接,因为G。的某些包是依赖系统标准库的,例如使用到DNS解析的包。只要代码中导入了这些包,编译的二进制文件就需要调用到某些系统库,为了这个需求,Go实现了一种机制叫CgO,以允许Go调用C代码,这样编译好的二进制文件就可以调用系统库。也就是说,如果Go程序使用了net包,就会生成一个动态的二进制文件,如果想让镜像能够正常工作,必须将需要的库文件苴制到或像中,或者直接使用busybox:glibc镜像.当然,你也可以禁止ego,这样Go就不会使用系统库使用内置的实现来替代系统南例如使用内者的DNS解析器),这种情况下生成的二进制文件就是静态的。可以通过设置环境变量CGo_ENAB1.E
5、D=O来禁用ego,例如:ROMgolangPYwhatsmyipoENVCG0-ENAB1.ED-0RUNgobuildwhatsmyip.90FROMSaatChCOPYfrom三Ogowhatsmyip.CMDwhatsmyip由于编译生成的是岸态二进制文件,因此可以直接跑在scratch镜像中(下面会介绍)当然,也可以不用完全禁用ego,可以通过-tags参数指定需要使用的内建库,例如-tagsnetgo就表示使用内建的net包,不依赖系统库:$gobuild-tagsnetgoWhatSmyipe90这样指定之后,如果导入的其他包都没有用到系统库,那么编译得到的就是静态二进制文件.也
6、就是说,只要还有一个包用到了系统库,都会开启ego,最后得到的就是动态二进制文件.要想一劳永逸,还是设因环境变量CGe1.ENAB1.ED=O吧.2.2 使用scratch镜像SCratCh镜像很小,因为它基本上是空的,除了D。Cker给它额外添加的metadata(元数据:描述数据的数据)。它是一个虚拟镜像,不能被pu,也不能运行,因为它表示空!scratch镜像不可以直接从Docker官方拉取下来,但可以用以下命令构建这个scratch潦像:Starcv-files-fromdevnulldockerimport-Saateh$dockerimageIsREPOSITORYTAGIMAGE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 详解 容器 优化
