Docker:Node Alpine镜像最终比完整的Node镜像更小吗?

29

我正在运行一组NodeJS应用程序的集群 - 这些应用程序应该非常小,因为它们是作为微服务运行的。只有其中几个需要额外的模块,例如bcrypt或imagemagick - 这会给我带来一些麻烦。

目前,我使用node:10.13-alpine作为所有Dockerfile构建我的应用程序的基础镜像。对于其中一些应用程序,我需要通过apk等方式添加依赖项。所以这些镜像变得更大了。使用alpine镜像作为基础镜像并添加所需的软件包(例如python、gcc...)是否是最好的方法?还是应该使用完整的镜像?

如果我使用node:10.13,基础镜像会变得更大,但是如果我的理解正确,我的应用程序只会添加一个小的层,因为使用相同的基础镜像。所以最终,使用一个大的node镜像比较好吗?

3个回答

32

阿尔派尼(Alpine)镜像更小,因为其他软件包使用了许多库,这些库在您的解决方案中没有使用。

使用小型镜像有什么好处?

好处是:内存占用更少、性能更好、安全性和可维护性更高。

较小的Docker镜像可以减少磁盘空间占用,但是磁盘空间很便宜

更重要的是,它还可以消耗更少的内存,而每台服务器的内存都是有限的。如果您减少服务器上的基础镜像数量,则也会减少所需的内存量。内存越少意味着交换次数越少,因此您可以通过将所有基础映像加载到内存中来获得一些性能改进。

另一个特点是,阿尔派尼(alpine)基础镜像使用更少的依赖库,这提高了总体安全性。您可以轻松地将风险与您的基本Alpine镜像分离,并使用仅使用真正需要的apk的顶部镜像。这在整体维护方面也具有优势。

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

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

当你阅读有关Node Docker镜像的官方文档时:

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

主要的要点是:

  • 您可以使用普通镜像,因为它基于“buildpack-deps”,这是许多镜像常用的基础。
  • Alpine镜像非常小,并减少了所需内存的数量。特别是没有其他类型的docker容器安装。

对我来说,这意味着在大多数情况下,如果您使用其他基于“buildpack-deps”的镜像,则可以使用普通包。在这种情况下,它可能是更好的解决方案,因为您不需要在磁盘和内存上持有“alpine”基本映像。

结论

如果您的Docker环境中仅有“alpine”镜像,则应选择“alpine”,或者如果“node”容器的安全性对您非常重要,则应该选择“alpine”。

在大多数情况下,基于“buildpack-deps”的“node”镜像是合适的,因为您还有其他基于“buildpack-deps”的Docker容器。

未来,我认为将有越来越多的基于“alpine”的软件包可用,那么您应该选择node-alpine。


11

通常情况下,使用预制二进制文件的官方Node镜像相比之下,使用Alpine镜像更好

但这高度取决于具体情况。

  1. 如果您有大量自定义,即使使用官方Node镜像,您仍可能需要添加依赖项。
  2. 如果您没有太多自定义,将小型依赖项添加到Node Alpine中与官方Node镜像相比,不会花费太多的时间和空间。
  3. 如果您遇到复杂的依赖关系(有时文档可能很差),官方Node镜像可以正常工作,但您需要费尽心思才能让Node Alpine运行,并且仍然不稳定。(我曾经遇到过“libpng16-dev”软件包的问题,只有在官方Node镜像上才能运行,我试了几天也无法弄清原因为何Node Alpine运行失败)。

因此,总的来说,选择Node Alpine通常是个好主意,除非您的设置较为复杂且官方Node镜像可以让事情变得更加容易。

我使用的几乎所有Node容器中,90%都是基于Alpine镜像运行的。


3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接