我正在运行一个nodeJS应用程序集群-由于它们作为微服务运行,因此应该很小。他们中只有少数需要额外的东西,例如bcrypt或imagemagick-这给我带来了一些麻烦。
现在,我使用node:10.13-alpine
作为所有Dockerfile的基础映像来构建我的应用程序。对于其中的一些,我需要通过apk
添加依赖项,依此类推。因此,这些图像变得更大。这是使用高山图像的最佳方法吗,该图像会通过添加所需的软件包(例如python,gcc ...)而变得更大?还是应该使用完整图像?
如果我使用node:10.13
,则基本映像会大很多,但是如果我的理解正确,我的应用程序将只添加一小层,因为使用的是相同的基本映像。因此,最后最好使用一个大节点图像?
答案 0 :(得分:9)
高山图像较小,因为其他软件包使用了大量库,而您的解决方案并未使用它们。
使用小图像有什么好处?
好处是:更少的内存,更好的性能,安全性和可维护性。
较小的docker映像会减少磁盘上所需的大小,但是磁盘空间很便宜。
更重要的是它还消耗更少的内存,这在每台服务器上都受到限制。如果减少服务器上基本映像的数量,这也将导致您根本需要更少的内存。更少的内存意味着您的交换也更少,因此,将所有基本映像加载到内存中后,您可以获得一些性能上的改善。
另一个功能是,使用较少依赖的库从高山中获取基本图像,从而提高整体安全性。您可以通过基本的高山图像和仅使用真正需要的apk的顶部图像轻松区分风险。这在整体维护方面也具有优势。
您可以在https://hub.docker.com/r/library/node/tags/上看到,高山版本没有漏洞。所有其他映像版本都有一些问题,可能会以解决方案的安全性为目标。
为什么默认设置仍然是“ buildpack-deps”,为什么您应该使用它们?
当您阅读有关docker镜像的官方文档时
https://hub.docker.com/_/node/
主要收获是:
对我来说,这意味着,如果您使用其他构建在“ buildpack-deps”上的映像,则在大多数情况下您可以使用正常的软件包。在这种情况下,可能是更好的解决方案,因为除了“ buildpack-deps”之外,您无需在磁盘和内存中保存“高山”基础映像。
结论
如果您的docker环境中只有“高山”映像,则应该使用“高山”,或者如果“节点”容器的安全性对您而言确实很重要。
在大多数情况下,基于“ buildpack-deps”的“节点”映像是合适的,因为您还有其他基于“ buildpack-deps”的码头集装箱。
将来,我认为基于“ alpine”的软件包将会越来越多,然后您应该使用node-alpine。
答案 1 :(得分:5)
通常,是的,高山图像比带有预烘焙二进制文件的官方节点图像要好。
但这是非常具体的情况。
libpng16-dev
软件包时发生过一次,并且仅适用于官方节点映像,即使尝试了几天,我也无法弄清为什么它不能与阿尔卑斯节点一起使用)。因此,总结起来,通常最好选择节点阿尔卑斯型,除非您进行了复杂的设置,并且官方的节点映像使您的工作更轻松。
我使用过的几乎所有节点容器,其中90%运行在高山图像上。
答案 2 :(得分:0)
如果您正在运行nodejs 10或更高版本,请考虑使用alpine检测到的内存泄漏问题: