Docker:最后的节点高山映像是否比完整的节点映像小?

时间:2018-10-27 16:58:18

标签: node.js docker alpine

我正在运行一个nodeJS应用程序集群-由于它们作为微服务运行,因此应该很小。他们中只有少数需要额外的东西,例如bcrypt或imagemagick-这给我带来了一些麻烦。

现在,我使用node:10.13-alpine作为所有Dockerfile的基础映像来构建我的应用程序。对于其中的一些,我需要通过apk添加依赖项,依此类推。因此,这些图像变得更大。这是使用高山图像的最佳方法吗,该图像会通过添加所需的软件包(例如python,gcc ...)而变得更大?还是应该使用完整图像?

如果我使用node:10.13,则基本映像会大很多,但是如果我的理解正确,我的应用程序将只添加一小层,因为使用的是相同的基本映像。因此,最后最好使用一个大节点图像?

3 个答案:

答案 0 :(得分:9)

高山图像较小,因为其他软件包使用了大量库,而您的解决方案并未使用它们。

使用小图像有什么好处?

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

较小的docker映像会减少磁盘上所需的大小,但是磁盘空间很便宜

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

另一个功能是,使用较少依赖的库从高山中获取基本图像,从而提高整体安全性。您可以通过基本的高山图像和仅使用真正需要的apk的顶部图像轻松区分风险。这在整体维护方面也具有优势。

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

为什么默认设置仍然是“ buildpack-deps”,为什么您应该使用它们?

当您阅读有关docker镜像的官方文档时

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

主要收获是:

  • 您可以使用普通图像,因为它是基于“ buildpack-deps”的,它通常被许多图像使用。
  • 高山图像非常小,减少了所需的内存量。尤其是没有其他类型的Docker容器安装。

对我来说,这意味着,如果您使用其他构建在“ buildpack-deps”上的映像,则在大多数情况下您可以使用正常的软件包。在这种情况下,可能是更好的解决方案,因为除了“ buildpack-deps”之外,您无需在磁盘和内存中保存“高山”基础映像。

结论

如果您的docker环境中只有“高山”映像,则应该使用“高山”,或者如果“节点”容器的安全性对您而言确实很重要。

在大多数情况下,基于“ buildpack-deps”的“节点”映像是合适的,因为您还有其他基于“ buildpack-deps”的码头集装箱。

将来,我认为基于“ alpine”的软件包将会越来越多,然后您应该使用node-alpine。

答案 1 :(得分:5)

通常,是的,高山图像比带有预烘焙二进制文件的官方节点图像要好。

但这是非常具体的情况。

  1. 如果您进行了大量的自定义,那么即使使用正式的节点映像,您仍然可能最终会添加依赖项。
  2. 如果您没有太多的自定义功能,则与官方节点映像相比,在阿尔卑斯山节点上添加较小的依赖关系不会在大小和构建时间方面花费太多。
  3. 如果您有复杂的依赖项(有时文档可能很差),那么在正式的节点映像中一切正常,但是您将需要竭尽全力使事情在高山节点中正常工作,但仍然不稳定。 (这种情况在我使用libpng16-dev软件包时发生过一次,并且仅适用于官方节点映像,即使尝试了几天,我也无法弄清为什么它不能与阿尔卑斯节点一起使用)。

因此,总结起来,通常最好选择节点阿尔卑斯型,除非您进行了复杂的设置,并且官方的节点映像使您的工作更轻松。

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

答案 2 :(得分:0)

如果您正在运行nodejs 10或更高版本,请考虑使用alpine检测到的内存泄漏问题:

https://github.com/nodejs/node/issues/29038