17-容器镜像的构建及最佳实践.pptx

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

构建高效的容器镜像;掌握容器镜像构建技巧;构建高效的容器镜像

;通常所说的容器化改造是对应用整体微服务架构改造,再容器化,这样做可以带来如下好处。

单独扩展:拆分为微服务后,可单独增加或缩减每个微服务的实例数量。

提升开发速度:各微服务之间解耦,某个微服务的代码开发不影响其他微服务。

通过隔离确保安全:整体应用中,若存在安全漏洞,会获得所有功能的权限。微服务架构中,若攻击了某个服务,只可获得该服务的访问权限,无法入侵其他服务。

隔离崩溃:如果其中一个微服务崩溃,其它微服务还可以持续正常运行。;为了降低复杂性、减少依赖、减小文件大小、节约构建时间,你应该避免安装任何不必要的包。例如,不要在数据库镜像中包含一个文本编辑器。

apt-getupgrade会使得镜像构建非常不确定,在构建时不确定哪些包会被安装,此时可能会产不一致的镜像。

如果基础镜像中的某个包过时了,你应该联系它的维护者。如果你确定某个特定的包,比如foo需要升级,使用apt-getinstall-yfoo就行,该指令会自动升级foo包。

;容器镜像是分层的,类似于洋葱,它们都有很多层,为了修改内层,则需要将外面的层都删掉。容器镜像有如下特性:

Dockerfile中的每个指令都会创建一个新的镜像层。

镜像层将被缓存和复用。

Dockerfile修改后,复制的文件变化了或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效。

某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效。

镜像层是不可变的,如果我们在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,只是这个文件在容器中不可见。

;将变化频率一样的指令合并在一起,目的是为了更好的将镜像分层,避免带来不必要的成本。如本例中将node.js安装与npm模块安装放在一起的话,则每次修改源代码,都需要重新安装node.js,这显然不合适。;当镜像没有指定标签时,将默认使用latest标签。因此,FROMubuntu指令等同于FROMubuntu:latest。当镜像更新时,latest标签会指向不同的镜像,这时构建镜像有可能失败。

;假设我们更新了apt-get源,下载解压并安装了一些软件包,它???都保存在/var/lib/apt/lists/目录中。但是,运行应用时容器镜像中并不需要这些文件。因此最好将它们删除,因为它会使容器镜像变大。

示例Dockerfile中,删除/var/lib/apt/lists/目录中的文件。

;在示例中,我们选择了ubuntu作为基础镜像。但是我们只需要运行node程序,没有必要使用一个通用的基础镜像,node镜像应该是更好的选择。

更好的选择是alpine版本的node镜像。alpine是一个极小化的Linux发行版,只有4MB,这让它非常适合作为基础镜像。

;WORKDIR指令可以设置默认目录,也就是运行RUN/CMD/ENTRYPOINT指令的地方。

CMD指令可以设置容器创建时执行的默认命令。另外,您应该将命令写在一个数组中,数组中每个元素为命令的每个单词。

;ENTRYPOINT指令并不是必须的,因为它会增加复杂度。ENTRYPOINT是一个脚本,它会默认执行,并且将指定的命令作为其参数。它通常用于构建可执行的容器镜像。;在前文的entrypoint脚本中,使用了exec命令运行node应用。

不使用exec的话,我们则不能顺利地关闭容器,因为SIGTERM信号会被bash脚本进程吞没。exec命令启动的进程可以取代脚本进程,因此所有的信号都会正常工作。;COPY指令非常简单,仅用于将文件拷贝到镜像中。ADD相对来讲复杂一些,可以用于下载远程文件以及解压压缩包。;将变化最少的部分放在Dockerfile的前面,这样可以充分利用镜像缓存。

示例中,源代码会经常变化,则每次构建镜像时都需要重新安装NPM模块,这显然不是我们希望看到的。因此我们可以先拷贝package.json,然后安装NPM模块,最后才拷贝其余的源代码。这样的话,即使源代码变化,也不需要重新安装NPM模块。

;运行容器时很可能需要一些环境变量。在Dockerfile设置默认的环境变量是一种很好的方式。另外,我们应该在Dockerfile中设置映射端口和数据卷。示例如下:;EXPOSE指令用于指定容器将要监听的端口。因此,你应该为你的应用程序使用常见的端口。例如,提供Apacheweb服务的镜像应该使用EXPOSE80,而提供MongoDB服务的镜像使用EXPOSE27017。

对于外部访问,用户可以在执行dockerrun时使用一个标志来指示如何将指定的端口映射到所选择的端口。;VOLUME指令用于暴露任何数据库存储文件、配置文件或容器创建的文件和目录。强烈建

文档评论(0)

学海无涯而人有崖 + 关注
实名认证
内容提供者

教师资格证、人力资源管理师持证人

该用户很懒,什么也没介绍

领域认证该用户于2023年06月11日上传了教师资格证、人力资源管理师

1亿VIP精品文档

相关文档