Docker:最后的节点高山映像是不是比完整节点映像小?
Posted
技术标签:
【中文标题】Docker:最后的节点高山映像是不是比完整节点映像小?【英文标题】:Docker: Are node alpine images at the end smaller then full node images?Docker:最后的节点高山映像是否比完整节点映像小? 【发布时间】:2019-04-01 03:09:30 【问题描述】:我正在运行一个 nodeJS 应用程序集群——它们应该非常小,因为它们作为微服务运行。他们中只有少数需要额外的东西,比如 bcrypt 或 imagemagick - 这不时给我带来一些麻烦。
现在我使用node:10.13-alpine
作为所有 Dockerfile 的基础镜像来构建我的应用程序。对于其中一些,我需要通过apk
等添加依赖项。所以这些图像变得更大。这是使用高山图像的最佳方法,通过添加所需的包(例如 python、gcc ......)而变得更大?还是应该使用完整的图像?
如果我使用node:10.13
,基本图像会大很多,但如果我的理解是正确的,我的应用程序只会添加一个小层,因为使用相同的基本图像。所以最后还是用一张大节点图比较好??
【问题讨论】:
【参考方案1】:如果您运行的是 nodejs 10 或更高版本,请考虑使用 alpine 检测到的内存泄漏问题:
https://github.com/nodejs/node/issues/29038
【讨论】:
【参考方案2】:Alpine 图像更小,因为其他包使用了大量库,而您的解决方案并未使用这些库。
使用小图片有什么好处?
好处是:更少的内存、更好的性能、安全性和可维护性。
较小的 docker 映像会减少磁盘所需的大小,但 磁盘空间很便宜。
更重要的是它还消耗更少的内存,这在每台服务器上都是有限的。如果您减少服务器上的基本映像数量,这也会导致您根本需要更少的内存。更少的内存意味着您的交换也更少,因此您可以在将所有基本图像加载到内存中时获得一些性能改进。
另一个特点是,来自 alpine 的基础图像使用较少依赖的库,提高了整体安全性。您可以使用基本 alpine 映像和仅使用真正需要的 apk 的顶部映像轻松分离风险。这对整体维护也有好处。
您可以在https://hub.docker.com/r/library/node/tags/ 上看到,alpine 版本没有漏洞。所有其他映像版本都存在一些问题,这可能会针对您的解决方案的安全性。
为什么默认仍然是“buildpack-deps”以及为什么你应该使用它们?
当你阅读官方文档到 docker images for node 时:
https://hub.docker.com/_/node/
主要内容是:
您可以使用普通镜像,因为它基于“buildpack-deps”,很多镜像都使用这种方式。 Alpine 图像非常小,并减少了所需的内存量。尤其是没有其他类型的docker容器安装。对我来说,这最终意味着,如果您使用其他镜像构建在“buildpack-deps”上,那么您可以在大多数情况下使用普通包。在这种情况下,它可能是更好的解决方案,因为除了“buildpack-deps”之外,您不需要在磁盘和内存中保存“alpine”基础映像。
结论
如果您的 docker 环境中有“唯一”高山映像,那么您应该使用“高山”或者如果“节点”容器的安全性对您非常重要。
在大多数情况下,基于“buildpack-deps”的“节点”映像是合适的,因为您还有其他基于“buildpack-deps”的 docker 容器。
我假设将来会有越来越多的基于“alpine”的包可用,然后你应该使用 node-alpine。
【讨论】:
【参考方案3】:总的来说,是的,alpine 图像比官方节点图像更好,它带有预烘焙的二进制文件。
但这是高度特定的。
-
如果您有大量自定义,即使使用官方节点映像,您最终仍可能会添加依赖项。
如果您没有大量自定义,那么与官方节点映像相比,向节点 alpine 添加小的依赖项在大小和构建时间方面不会花费太多。
如果您有复杂的依赖关系(有时文档可能很差),在官方节点映像中一切正常,但您需要竭尽全力让一切在节点 alpine 中运行,但它仍然不稳定。 (这在我身上发生过一次
libpng16-dev
包,它只适用于官方节点图像,我无法弄清楚为什么即使尝试了几天它也不能适用于节点 alpine)。
总结一下,一般来说选择node alpine 是个好主意,除非你有一个复杂的设置并且官方的node 镜像让你更容易。
我使用过的几乎所有节点容器,其中 90% 都在 alpine 映像上运行。
【讨论】:
以上是关于Docker:最后的节点高山映像是不是比完整节点映像小?的主要内容,如果未能解决你的问题,请参考以下文章
Docker 无法在新添加的 VM/节点上下载现有服务的映像