Docker:结尾处的节点高山图像是否比整个节点图像小?

use*_*695 13 node.js docker alpine-linux

我正在运行一个nodeJS应用程序集群 - 它应该非常小,因为它们作为微服务运行.只有少数人需要额外的东西,如bcrypt或imagemagick - 这对我来说不时会有些麻烦.

现在我node:10.13-alpine用作所有Dockerfiles的基本映像来构建我的应用程序.对于其中一些我需要通过apk等添加依赖项.所以这些图像变大了.这是使用高山图像的最佳方法,通过添加所需的包(例如python,gcc ......)来增加图像?或者我应该使用完整的图像?

如果我会使用node:10.13,基本图像会更大,但如果我的理解是正确的,我的应用程序只会添加一个小层,因为使用相同的基本图像.所以最后使用一个大节点图像会更好?

Chr*_*ler 10

Alpine图像较小,因为其他软件包使用了很多库,而您的解决方案并未使用这些库.

使用小图片有什么好处?

好处是:更少的内存,更好的性能,安全性和可维护性.

较小的docker镜像会减小磁盘所需的大小,但磁盘空间很便宜.

更重要的是它还消耗更少的内存,这在每台服务器上都是有限的.如果减少服务器上的基本映像数量,这也会导致您需要更少的内存.内存越少意味着交换越少,因此在将所有基本映像加载到内存中时可以获得一些性能改进.

另一个特点是,使用较少依赖库的高山基础图像,这提高了整体安全性.您可以使用基本的高山图像轻松分离风险,并使用仅使用真正需要的apk的顶级图像.这在整体维护方面也具有优势.

您可以在https://hub.docker.com/r/library/node/tags/上看到,alpine版本没有漏洞.所有其他映像版本都有一些问题,可能会针对您的解决方案的安全性.

为什么默认仍然是"buildpack-deps"以及为什么你应该使用它们?

当您阅读节点的docker镜像的官方文档时:

https://hub.docker.com/_/node/

主要内容是:

  • 您可以使用普通图像,因为它基于"buildpack-deps",这是许多图像常用的.
  • 阿尔卑斯山图像非常小,减少了所需的内存量.特别是没有其他类型的docker容器安装.

对我来说,这意味着,如果您使用"buildpack-deps"构建的其他图像,大多数情况下您可以使用普通包.它可能是更好的解决方案,在这种情况下,因为除了"buildpack-deps"之外你不需要在你的磁盘和内存中保存一个"高山"基本图像.

结论

如果您在docker环境中"只有"高山图像,那么您应该使用"alpine"或者"节点"容器的安全性对您来说非常重要.

在大多数情况下,基于"buildpack-deps"的"节点"图像是合适的,因为您有其他基于"buildpack-deps"的docker容器.

在未来,我假设基于"alpine"可以提供越来越多的包装,然后你应该选择node-alpine.


Din*_*yan 5

一般来说,是的高山图像比预先添加的二进制文件带来的官方节点图像更好.

但这是高度具体的案例.

  1. 如果您进行了大量自定义,即使使用官方节点映像,您仍可能最终添加依赖项.
  2. 如果您没有进行大量自定义,那么与官方节点映像相比,在节点alpine中添加小依赖性将不会在大小和构建时间方面花费太多.
  3. 如果你有复杂的依赖关系(有时文档可能很差),事情在官方节点图像中可以正常工作,但是你需要自己的方式让事情在高山节点中运行,但它仍然会不稳定.(这件事发生在我身上,只有一个libpng16-dev包,它只适用于官方节点图像,我无法弄清楚为什么即使在尝试了几天之后它也不适用于节点alpine).

总而言之,除非你有一个复杂的设置,官方节点图像让你更容易,否则选择节点alpine是一个好主意.

我使用的几乎所有节点容器中,90%都运行在高山图像上.