当我们实现一个高度可水平扩展的镜像技巧微服务架构时,需要考虑到一个关键的点: 当前端的访问压力突增的时候,我们的微服务群怎么快速的增加对应的容器的数量,通过达到足够数量的容器来应对的压力. 短时间扩展出大量后端服务资源,需要考虑架构和运维的瘦身方方面面,其中通过减少镜像的镜像技巧WhatsApp%E3%80%90+86%2015855158769%E3%80%916378%20crane%20dr%20whitestown%20in%2046075体积,在同样的瘦身网络带宽的情况下就能缩短镜像的拉取时间,进而缩短整个容器的镜像技巧部署就绪时间。 根据Best for 和Best - your with ECS这2篇文章,瘦身我们对镜像瘦身的镜像技巧几种技巧做一次梳理。 总而言之我们有下面的瘦身几种方式来共同作用减少容器的体积: 使用多阶段构建技术使用合适的小体积的基础镜像 这个是最容易做到并且很容易理解的一种常见策略,也就是将FROM xxx语句中使用的基础镜像在满足程序运行性能和稳定性的前提下越小越好。 举个例子,镜像技巧我有一个Java项目需要运行,瘦身那么我需要引入一个镜像做基础镜像,镜像技巧WhatsApp%E3%80%90+86%2015855158769%E3%80%916378%20crane%20dr%20whitestown%20in%2046075那么我们就需要考虑用那种镜像做为基础最合适. 下面我列举如下的瘦身几个选项,这些选项可以在 hub 上检索到. Size :11-jre-slim 76.39 MB :11-jre 117.76 MB :11-slim 225.52 MB :11 318.71 MB :17 231.66 MB :17-slim 210.62 MB :17- 181.71 MB 很明显,我们当我们运行的镜像技巧项目需要JDK11的情况下,那么:11-jre-slim是最佳选择,如果我们的项目是JDK17的情况下,那么:17-slim是瘦身最佳选择。 为什么我不建议使用:xxx-选项呢?镜像技巧 This image is based on the Linux , in the image. Linux is much than most base (~5MB), and thus leads to much in . 以 linux为基础的在大多数情况下,的确是有最小的体积,但是不是绝对的;java程序运行只需要jre并不一定需要全套的JDK环境,在有jre版本的镜像面前, linux为基础的镜像不一定最小,比如:11-jre-slim在上表中是最小的基础镜像 The port for is not in a by , since it is not in the code base. It is only as early of . See also this . So this image what is from the 's . What this means is that based are only for early of . Once a a "-" , the is from the " Tags"; they are still to pull, but will no be . 不优先选的原因是如上的2个说明: slim和jre版本的是什么含义? 首先,jre版本表示对java运行环境做裁剪,jre是java的基础可执行环境,它移除了JDK中不需要的开发套件,进而节约了体积,通常我们要有限选择jre版本的基础镜像,完全不会影响java程序的运行指标. 其次,slim版本表示对linux做裁剪,相比完整的linux它移除了容器运行中几乎不可能使用到的一些linux组件,比如curl等shell命令就由于裁剪可能不会预装进去 总结就是,最好是选择jre和slim后缀的基础镜像,它同时对linux和JDK做裁剪,能最小化镜像的体积而不影响java程序的运行性能 普通的镜像的价值在哪里? 不带jre,slim和后缀的镜像我成为普通镜像,它有完整的JDK和完整的Linux环境,在大部分情况下是我们最无脑的选择,如果你不知道怎么选,选它就准没错,当然镜像的体积就大很多,它有一个优势就是全面,比如有完整的linux包管理和shell工具,能让你做一些细节的操作,比如健康检查就可能用到curl,如果你使用slim版本的就可能由于缺失curl而导致健康检查被误认为不通过,当然最好是你在slim上安装对应的软件,这样既有slim的小体积优势也能满足你的细节需要。 减少镜像的layer的数量 镜像是由很多镜像层()组成的(最多127层),中的每条指定都会创建镜像层,但是只有RUN, COPY, ADD会使镜像的体积增加. Only the RUN, COPY, ADD . Other , and do not the size of the build. 所以我们在使用上面讲的三个指令的使用,就需要特别注意尽量把它们合并为一条shell语句,而不是每个语句一行 例如下面的用法 我们就可以合并为 这样在理论上减少了一个layer. 此外对于上面的2个指令,合并还能获取避免意料之外的问题 可能的问题 Using apt-get alone in a RUN and apt-get fail sees the and as and the cache from steps. As a the apt-get is not the build uses the . the apt-get is not run, your build can get an of the curl and nginx . 所以合并指令是一个百利无一害的方式 镜像只包含程序运行所需的最小的资源 我们在使用构建镜像的时候,可能会产生一些中间文件或者由于考虑步骤意外的引入了程序运行无关的文件,这个也需要考虑 首先是排除不必要的资源 我们的程序只需要它需要的资源,一切与他无关的文件,比如某些图片,文档等,我们可以使用排除出去,原理和.一样 按照程序语言的运行特性做对应的资源裁剪 有时我们在构建的时候需要安装某种linux工具,比如为有些slim版本的linux安装curl执行内部的健康检查,这是我们执行apt/dnf包管理软件的时候,可能无意间产生了大量的临时缓存,这很容易被无意间打包到镜像中,所以我建议使用结合指令合并技术加上rm -rf /var/lib/apt/lists/*来立即在软件安装完后清理缓存,比如我安装curl时会这样写RUN apt -y && apt -y curl && rm -rf /var/lib/apt/lists/ *此外在经验不足的情况下,我们没有具体的语言具体分析,比如它是一种纯粹的编译型语言,在程序被编译出来后,它只需要linux基础环境即可运行 有些人可能会这样写FROM :1.17并以为它作为的运行环境是最合适的,其实未必,编译出的二进制可执行程序,只需linux环境即可,我们就可以先编译并FROM :-slim 即可,它能有更小的体积并完全不影响正常的运行性能. 还有就是,这类解释性语言,我们需要在运行前执行包管理程序下载依赖包,然后程序才能运行,但是实际上程序的运行只需要有程序本身和依赖包即可,包管理器和包管理器执行过程产生的缓存以及临时文件是我们不需要的,我们也可以使用分阶段构建技术(后文会讲)来在后续的阶段移除这些运行无关的文件,哪怕它们在构建早期是如此重要。 此外解释性语言在安装包时可能会附带一些调试和附加工具,它们在开发阶段很实用但是正式环境运行时不再必要,我们最好也是要注意一下只安装生产环境级别的依赖,排除一些辅助性的开发组件。 In the case of a image for we want to that we only in a way, and this us to the for the best for npm in a image: RUN npm ci --only= 参考: 10 best to Node.js web with 使用多阶段构建技术 是我们构建过程中相对来将复杂一段的技术,但是也异常的实用,比如前面讲的等解释性语言就可以充分利用本技术来瘦身。当然java,go等编译性语言也能受益于此技术 它的核心思想是:将镜像的构建分为多个阶段,下一个阶段依赖上一个阶段的输出,将上一个阶段的输出作为输入来排除掉上个阶段构建过程中无法排除的废弃文件 通常会分为2个大致的阶段 编译/依赖下载->实际的镜像构建 以官方的例子为例 的构建,第一阶段使用基础镜像做依赖的下载和编译工作,第二阶段只复制上一阶段产生的二进制文件并使用更加精简的 镜像作为实际的运行环境 构建,第一步下载依赖,第二步只将上一阶段的依赖复制过来,排除了上一阶段的npm和npm运行过程中的中间文件,同时使用更精简的slim镜像来提供实际的运行环境 通过这2个例子,相信大家可以清楚的理解多阶段构建对编译型/解释性语言都有很好的瘦身效果。 |
扩展影响力!意媒:意甲任命摩根大通为国际电视转播权顾问67.9万胃癌患者忠告:一查癌症就是晚期?只因这事你没做好蒙太奇荣获品牌网十大品牌:十载峥嵘,不负初心200万中风患者:这种症状是脑梗最后“警报”,为何你却忽视?住院61天花了104万:ICU真需那么多钱吗?医生说出大实话扩展影响力!意媒:意甲任命摩根大通为国际电视转播权顾问神奇动物在哪里?若不幸患上6种病,还真会长出“动物”中国常驻联合国副代表敦促相关国家加强轻小武器管控想造为什么禁欲的女人长得漂亮?容貌变化全过程道出真相张歆艺儿子四坨为金晨打call:加油鸭 晨晨子39岁女人结婚生子的八字详解,好不好看看算命大师怎么说扩展影响力!意媒:意甲任命摩根大通为国际电视转播权顾问英超统计本赛季球员速度TOP10:狼队查舒亚创造历史第3快纪录46.6万新发病例:被肝癌“盯上”4种人,这种最危险!37岁结婚生小孩有无意义戳,看完这些男明星经历豁然开朗英媒:芒特伤势并不严重是轻微伤,他正在进行力量与康复训练陈意涵一家三口外出骑车 享受悠闲时光十分惬意何猷君带奚梦瑶游玩迪士尼 拒绝回应何猷邦的相关问题郭碧婷晒照似情绪不佳 配文引粉丝猜测后关评论“江姐”于蓝去世 朱军冯远征等众星发文追思钟丽缇晒姐姐们宿舍日常 穿睡衣敷面膜跳舞十分欢乐伊能静谈教王丽坤王智唱歌:教了10个小时 嗓子都哑了英媒:芒特伤势并不严重是轻微伤,他正在进行力量与康复训练蒋劲夫承认家暴:原谅了施暴者,那些受害者又该何去何从?罗马诺:曼联明年仍想引进巴莱巴;记者:奥纳纳现在非常认真考虑租借加盟特拉布宗体育德国vs北爱尔兰首发推算:沃尔特马德和维尔茨继续出战于正秒删风波后 黄璐发文:某些人真的很恶心王力宏直播荣誉墙入镜 周杰伦赞其奖杯是“风水”一句话毁掉一个人,多少孩子毁于父母不经意的这些话?饭后急着做6件事会“折寿”?其实有2件还真不宜做陈冠希晒女儿萌照 Alaia紧抱玩偶乖巧可爱伊能静谈教王丽坤王智唱歌:教了10个小时 嗓子都哑了快乐大本营常驻新人名单 快乐大本营常驻新人都有哪些明星一句话毁掉一个人,多少孩子毁于父母不经意的这些话?39岁女人结婚生子的八字详解,好不好看看算命大师怎么说英超统计本赛季球员速度TOP10:狼队查舒亚创造历史第3快纪录蒋劲夫承认家暴:原谅了施暴者,那些受害者又该何去何从?200万中风患者:这种症状是脑梗最后“警报”,为何你却忽视?无法睡个好觉?可能床头放了这4样东西,趁早撤走扩展影响力!意媒:意甲任命摩根大通为国际电视转播权顾问《赛博朋克2》北美团队已达80人 超90%是资深人士《真三国无双:起源》DLC新武器绳镖演示视频《怪奇物语》第五季角色神秘消失:采个蘑菇再没回来《夜勤人2:无尽宝库》补丁发布 减少卡顿调整BOSS战写春联送“福”字!癸卯年名家挥春送福活动获市民点赞!《战神》还是《老滚》?TGA官号发神秘坐标引猜测寄语2023!一起分享你的暖心时刻与新年期盼~PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比《仁王3》捏人系统异常丰富 玩家可自定义胸部和肌肉9800X3D加强版来了 AMD官网已出现9850X3D