返回顶部
首页 > 资讯 > 精选 >怎么选择一个最好的Node.js Docker镜像
  • 425
分享到

怎么选择一个最好的Node.js Docker镜像

2023-07-04 19:07:41 425人浏览 泡泡鱼
摘要

这篇文章主要介绍“怎么选择一个最好的node.js Docker镜像”,在日常操作中,相信很多人在怎么选择一个最好的node.js Docker镜像问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么选择一个最

这篇文章主要介绍“怎么选择一个最好的node.js Docker镜像”,在日常操作中,相信很多人在怎么选择一个最好的node.js Docker镜像问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么选择一个最好的Node.js Docker镜像”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

我们在使用FROM node:latest或只是FROM node时,很容易忽略他潜在的风险。如果你不知道总体的安全风险并且把他引入到了CI/CD的流程中,那无疑是加剧了这个风险。

下面这个例子非常典型,你可以从很多教程或者博客文章中看到这个Node.js Dockerfile的配置。但是这个Dockerfile的配置存在很大的问题,非常不推荐这样使用:

FROM nodeWORKDIR /usr/src/appCOPY . /usr/src/appRUN npm installCMD "npm" "start"

一个可供选择Node.js Docker镜像

当你构建一个Node.js镜像的时候,实际上有很多选择。其中就包括了Node.js核心团队维护的官方Docker镜像,以及从特定的基础镜像中选择的特殊Node.js镜像版本。还可以选择其他的,比如谷歌在distroless项目上构建的Node.js应用程序,或者是Docker官方团队提供的一个名为scratch的镜像。

在这些Node.js的Docker镜像中,哪一个是最适合你的呢?

让我们一个一个的去分析,了解更多他们的好处和潜在风险。

默认的Node.js镜像

我们先从维护的node镜像开始。它是由进行正式地维护的,包含了一些基础的镜像tag。这些tag对应到不同的底层发行版(Debian、ubuntu、Alpine)以及不同版本的Node.js运行时本身。还有针对不同CPU架构的特定版本tag,例如amd64arm64x8(新版苹果的M1)。

Debian发行版中最常见的node镜像,例如bullseyebuster,他们都是基于由另一个团队维护的buildpack-deps的。
当你基于这个默认的node镜像构建Node.js Docker镜像时会发生什么?

FROM node

使用docker build --no-cache -f Dockerfile1 -t dockerfile1构建镜像时,就会出现下面这些:

  • 我们没有指定Node.js运行时版本,所以nodenode:last的一个别名,他的版本指向的是18.2.0

  • 这个Node.js Docker镜像大小是952MB

这个最新的Node.js镜像的依赖和安全漏洞足迹是什么呢?我们可以用docker scan dockerfile1来运行一个Synk-powered容器,就会得到下面的结果:

  • 共有409个依赖项 - 这些是使用操作系统包管理器检测到的开源库,比如curl/libcurl4git/git-manimagemagick/imagemagick-6-common

  • 共有289个安全问题在这些依赖中被发现,例如,Buffer Overflowsuse-after-free errorsout-of-bounds write等。

  • Node.js 18.2.0运行时版本容易出现7个安全问题。例如,DNS RebindingHttp Request SmugglingConfiguration Hijacking

译者注:

  • Buffer Overflows - 缓冲区溢出

  • Use After Free - 一种内存破坏漏洞,通常存在于浏览器中

  • out-of-bounds write - 越界写入

  • DNS Rebinding - DNS重绑定攻击

  • HTTP Request Smugglin - HTTP请求夹带攻击技术

  • Configuration Hijacking - 配置劫持

你真的需要在Node.js镜像中给你的应用提供wgetgitcurl吗?在Node.js Docker镜像中,有成百上千个依赖和工具,而这些依赖又对应着成百上千个漏洞。Node.js运行时的特性对应着7个不同的安全漏洞,给潜在攻击留下了很大的空间。总的来说,情况并不是很乐观。

Node.js Docker Hub选项node:buster vs node:bullseye

如果你在Node.js Docker Hub仓库上浏览可用tags,你将会发现有两个Node.js镜像tags - node:busternode:bullseye

这两个Docker镜像tags都基于Debian发行版。buster镜像tag对应着Debian10,将会在2022年8月到2024年进入到他的End of Life日期,所以buster不是一个很好的选择。bullseye镜像tag对应着Debian11,被当做Debian的当前稳定版本,预计EOL日期为2026年6月。

译者注:

  • End of Life。特指产品寿命的结束,通常缩写为EOL。

因此,十分建议你将所有新的和现有的Node.js Docker镜像从node:buster迁移到node:bullseye或者其他合适的可替代版本。
我们先构建一个新的Node.js Docker镜像基于:

FROM node:bullseye复制代码

如果你构建了这个Node.js Docker镜像tag并且与之前使用node:latest的结果进行比较,将会得到完全相同的大小、依赖数量和发现的漏洞。原因是nodenode:latestnode:bullseye全部指向了同一个正在构建的Node.js镜像tag。

Node.js镜像tag瘦身

官方的Node.js团队还维护了一个显式地针对功能性Node.js环境所需工具的镜像tag并且不会存在其他的东西。

这个Node.js镜像tags是通过slim镜像tag变量来引用的,比如node:bullseye-slim,或者带有Node.js指定版本,像node:14.19.2 -slim

我们再来基于Debian的当前稳定版本的bullseye构建一个Node.jsslim镜像:

FROM node:bullseye-slim

  • 镜像的大小已经急剧下降,从接近1GB的容器镜像降到246MB的镜像大小

  • 扫描他的内容也显示了整体软件足迹的大幅下降,只有97个依赖项和56个漏洞。

就容器镜像大小和安全状况而言,node:bullseye-slim已经是一个比较好的起点了。

一个LTS的Node.js Docker镜像

到目前为止,我们的Node.js Docker镜像基于当前版本的Node.js,即Node.js18。但是根据Node.js的发布时间表,这个版本直到2022年10月才进入正式的Active LTS状态。

译者注:LTS - Long-term support,即长期支持版本。

如果我们总是依赖于我们正在构建的Node.js Docker镜像中的LTS版本的话会怎么样?我们先更新这个Docker镜像tag并构建一个新的Node.js镜像:

FROM node:lts-bullseye-slim

瘦身后的Node.js LTS版本(16.15.0)在镜像上带来了相似数量的依赖、安全漏洞和一个略小的体积(188MB)。

因此,尽管你可能需要在LTS和当前Node.js运行时版本中选择,但他们都不会对Node.js镜像的软件占用空间有大的影响。

node:alpine对于Node.js镜像来说是一个更好的选择吗?

Node.js Docker团队维护了一个node:alpine镜像tag以及他的变体,以便将Alpine linux发行版的特定版本与Node.js运行时的特定版本进行匹配。

Alpine Linux项目经常因为其非常小的镜像体积而被引用,小体积意味着更新的软件占用空间和更少的漏洞,确实十分不错。
下面的命令会让Dockerfile去生成一个node环境,这个将会增加未压缩的镜像体积:

FROM node:alpine

这个将会产生一个178MB大小的docker镜像,和slimNode.js镜像大小差不多,但是在alpine镜像tag中,只检测到了16个系统依赖漏洞和2个安全安全漏洞。这就意味着alpine镜像tag对于小体积和漏洞数量来说是一个比较好的选择。

alpine对Node.js镜像可能提供了一个较小的镜像体积和更少的漏洞数量。但是,我们必须意识到Alpine项目使用musl作为C标准库的实现。而Debian的Node.js镜像tag依赖于glibc实现,比如bullseyeslim。这些差异可以解释性能问题、功能性的bug或者是潜在的应用程序崩溃,这些都是由于底层C库的差异造成的。

选择一个alpine的Node.js镜像tag意味着你实际上是在选择一个非官方的Node.js运行时。Node.js Docker团队并不会正式支持基于alpine的容器镜像构建。因此,他声明基于Alpine的镜像tag是实验性的,并且可能和官方的构建不一致。

如果你正在选一个一个基于Alpine的Node.js Docker镜像,需要记住一点,Docker安全工具(例如Trivy或Snyk)目前无法检测到Alpine镜像中与运行时相关的漏洞的。虽然这种情况未来可能会改变,但是目前还不能找到Node.js18.2.0alpine基础镜像tag的安全漏洞,而18.2.0运行时本身实际上是容易受到攻击的。这与安全工具本身有关,而不是与Alpine基础镜像有关,但是也应该考虑到这一点。

Node.js的distroless(无损)Docker镜像

我们的基准测试的最后一个比较项目是谷歌的Distroless容器镜像。

什么是distroless容器镜像?

这种镜像甚至比slim的Node.js镜像更加小,因为distroless镜像只针对这个应用和应用运行时的依赖性而已。因此,一个distroless的docker镜像没有容器包管理器、shell、或者其他通用工具的依赖性,这使得它们的体积更小,漏洞也更少。

幸运的是,Distroless项目为Node.js维护了一个特殊运行时的distrolessdocker镜像,通过其完整的命名空间识别为grc.io/distroless/nodejs-debian11,并且可以在谷歌的容器注册表中找到(这个是GCr.io的部分)。

因为Distroless容器镜像没有软件,我们可以使用一个docker的多阶段工作流来为我们的容器安装依赖项,并且把它们复制到Distroless镜像:

FROM node:16-bullseye-slim AS buildWORKDIR /usr/src/appCOPY . /usr/src/appRUN npm installFROM gcr.io/distroless/nodejs:16COPY --from=build /usr/src/app /usr/src/appWORKDIR /usr/src/appCMD ["server.js"]

构建这个distrolessdocker镜像将产生112MB的文件,而在slimalpine镜像tag来说,这已经减小了很多文件的体积了。
如果你正在考虑使用distrolessdocker镜像,有一些重要的事项需要注意:

  • 好的一点是,它们是基于当前稳定的Debian发行版本,这意味着它们是最新的,很久才会到EOL的日期。

  • 因为它们是基于Debian的,所以它们依赖glibc实现,并且不太可能在生产环境出现一些奇怪的问题。

  • 你很快就会发现Distroless团队没有维护细粒度的Node.js运行时版本。这意味着你需要依赖于通用的nodejs:16的标记(该标记经常更新),或者在一个特定时间点根据镜像的SHA256哈希值进行安装。

Node.js Docker镜像tags的比较

我们可以参考下面的表格来总结不同Node.js Docker镜像tags之间的比较:

Image tagNode.js runtime versionOS dependenciesOS security vulnerabilitiesHigh and Critical vulnerabilitiesMedium vulnerabilitiesLow vulnerabilitiesNode.js runtime vulnerabilitiesImage sizeYarn available
node18.2.040928954182177952MBYes
node:bullseye18.2.040928954182177952MBYes
node:bullseye-slim18.2.0975648447246MBYes
node:lts-bullseye-slim16.15.0975547446188MBYes
node:alpine18.2.01622000178MBYes
gcr.io/distroless/nodejs:1616.17.091100110112MBNo

我们来通过之前学习到的每个不同的Node.js镜像tags的数据和见解,然后确定哪个是最理想的。

DEVELOPMENT-PARITY(开发环境平价)

如果你选择使用的Node.js镜像tag取决于开发的一致性(这意味你希望为开发和生产完全相同的环境进行优化),那么这可能已经是一场失败的battle了。在大多数情况下,所有3个主要操作系统都使用不同的C库实现。Linux依赖glibc,Alpine依赖musl,而MacOS有自己的BSD libc实现。

DOCKER镜像大小

有时候,镜像大小也很重要。更准确地说,我们的目标不是拥有最小的体积,而是拥有最小的整体软件占用。在这种情况下,slim镜像tags和alpine没有太大的区别,而且它们对于一个容器镜像来说平均大概是200MB。当然,slim镜像的软件占用相对于alpine来说还是相当高的(slim97个 VS alpine16个),因此,漏洞数量对于alipne来说也更高(slime56个 VS slpine2个)。

安全漏洞

漏洞是一个重要的问题,并且一直是很多文章的中心——关于你为什么应该减少容器镜像的大小。

忽略nodenode:bullseye这种由于较大的软件占用而跟着增加安全漏洞的镜像,我们可以更关注稍微小一点的镜像类型。在slimalpinedistroless之间对比,高危和关键安全漏洞的绝对数量并不高,范围在0到4之间,这是一个可控的风险,并不会影响到你的应用程序。

本质内容?

最理想的Node.js Docker镜像应该是一个基于现代Debian OS的操作系统的精简版本,它有一个稳定且活跃的Node.js长期支持版本。

归根结底就是选择node:lts-bullseye-slimNode.js镜像tag。我赞成使用确定性图像标记,因此我要做的细微更改是使用实际的底层版本号,而不是lts别名。

最理想的Node.js Docker镜像tag是**node:16.17.0-bullseye-slim**

如果你在一个成熟的开发团队工作,该团队可以支持自定义基础镜像,那么我的第二个最佳建议是选择谷歌的distroless镜像tag,因为它保持了glibc对官方Node.js运行时版本的兼容性。这个工作流会需要一些维护,所以我只是建议而已。

到此,关于“怎么选择一个最好的Node.js Docker镜像”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 怎么选择一个最好的Node.js Docker镜像

本文链接: https://lsjlt.com/news/346990.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么选择一个最好的Node.js Docker镜像
    这篇文章主要介绍“怎么选择一个最好的Node.js Docker镜像”,在日常操作中,相信很多人在怎么选择一个最好的Node.js Docker镜像问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么选择一个最...
    99+
    2023-07-04
  • 聊聊如何选择一个最好的Node.js Docker镜像?
    一个可供选择Node.js Docker镜像当你构建一个Node.js镜像的时候,实际上有很多选择。其中就包括了Node.js核心团队维护的官方Docker镜像,以及从特定的基础镜像中选择的特殊Node.js镜像版本。还可以选择其他的,比如...
    99+
    2023-05-14
    Docker镜像 前端 Node.js 面试
  • 阿里云服务器选择哪个镜像模式最好
    阿里云服务器提供了多种镜像模式,包括公共镜像、自定义镜像、共享镜像和镜像市场等。不同的镜像模式适用于不同的场景和需求,因此选择最好的镜像模式需要根据具体情况进行评估。 公共镜像 公共镜像是阿里云官方提供的镜像,包括多种操作系统和应用程...
    99+
    2023-10-26
    阿里 镜像 模式
  • 云服务器选择什么镜像模式最好
    云服务器的镜像模式是指创建镜像的操作系统或应用程序使用的文件系统。以下是一些选择镜像模式的建议: Gnome和Symantec:这些镜像提供了大多数Linux发行版和其他操作系统的完整镜像。 KVM和Xen:这些镜像提供了大多数Unix...
    99+
    2023-10-27
    镜像 模式 服务器
  • 怎么创建一个新的Docker镜像
    本篇内容介绍了“怎么创建一个新的Docker镜像”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们在使用Dockerfile构建docker...
    99+
    2023-06-04
  • 云服务器选择什么镜像模式最好用
    Amazon EC2 Amazon EC2是亚马逊推出的一种虚拟服务器技术,它使用Amazon EC2虚拟服务器平台将多个虚拟服务器连接在一起,从而构建出一个高可用性和高可扩展性的云计算基础设施。Amazon EC2的优势在于它的可扩...
    99+
    2023-10-27
    镜像 最好用 模式
  • 云服务器选择什么镜像文件夹最好
    数据安全性 云服务器通常存储着许多用户的敏感数据,因此选择一个安全的镜像文件夹可以确保这些数据得到妥善保护。建议选择具有强密码保护和访问控制功能的镜像文件夹,以确保只有授权用户可以访问它们。 数据可靠性 云服务器的存储容量有限,因...
    99+
    2023-10-28
    镜像 文件夹 服务器
  • 揭秘Pip镜像源:如何选择最适合个人需求的镜像源?
    Pip镜像源大揭秘:如何选择最适合你的镜像源? 简介:Pip 是 Python 中最常用的软件包管理工具之一,能够方便地安装、升级和移除 Python 包。在使用 Pip 的过程中,选择适合自己的镜像源可以显著提高安装速度和稳定...
    99+
    2024-01-16
    pip 选择 镜像源
  • 云服务器选择什么镜像模式好一点
    对于大多数云服务器平台,通常会提供多种不同的镜像模式,例如: Mirror/Mirror Auto:该模式是一个虚拟的镜像模式,将应用程序和数据存储在云服务器上的多个虚拟机中,每个虚拟机都运行相同的应用程序和数据,以提高性能和可用性。这...
    99+
    2023-10-28
    镜像 模式 服务器
  • 使用Dockerfile怎么构建一个Docker镜像
    这篇文章将为大家详细讲解有关使用Dockerfile怎么构建一个Docker镜像,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Dockerfile是一个文本文件,其内包含了一条条的指令(In...
    99+
    2023-06-06
  • Node.js项目中怎么优化docker镜像
    这篇文章给大家介绍Node.js项目中怎么优化docker镜像,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Node 项目简单写了一个自己用的 wechat-bot ,接下来就以这个项...
    99+
    2024-04-02
  • docker容器中怎么创建一个MariaDB镜像
    docker容器中怎么创建一个MariaDB镜像,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。基于commit命令方式创建docker的安装[root@test01&nbs...
    99+
    2023-06-04
  • 阿里云服务器选择哪个镜像端口好
    阿里云服务器的镜像端口选择取决于您要运行的应用程序和服务。以下是一些常见的端口和它们的用途: 80端口:用于HTTP协议的Web服务,通常用于Web服务器。 443端口:用于HTTPS协议的Web服务,通常用于安全的Web服务器。 22...
    99+
    2023-10-26
    阿里 镜像 端口
  • 阿里云服务器选择哪个镜像模式好
    安全性 选择阿里云服务器ECS镜像,安全性是最为重要的因素之一。在选择镜像时,应选择经过安全认证的镜像。这些认证包括SSL证书、数字签名、双重身份验证等。 可靠性 选择阿里云服务器ECS镜像时,还应考虑镜像的可靠性。这些镜像应具备...
    99+
    2023-10-28
    阿里 镜像 模式
  • 云服务器选择什么镜像模式比较好一点
    Mirror-Image镜像模式 Mirror-Image镜像模式是将多个镜像合并成一个镜像的一种方式,它适用于那些需要快速将数据从一台服务器复制到另一台服务器的场景。这种镜像方式比较适合对数据安全性要求比较高的用户,因为多个服务器会...
    99+
    2023-10-28
    比较好 镜像 模式
  • 云服务器选择什么镜像模式好
    云服务器选择什么镜像模式比较好呢 选择一个适合自己的镜像模式:可以选择单一镜像,也可以选择复制镜像,也可以选择多镜像。根据自己的应用场景,选择适合自己的镜像模式。 选择一个安全的镜像:选择一个安全的镜像,可以减少数据被盗用的可能性。 选...
    99+
    2023-10-27
    镜像 模式 服务器
  • 轻量应用服务器镜像选哪个模式最好
    轻量应用服务器镜像可以选用以下几种模式:Docker镜像:这种镜像可以将应用服务器的所有文件复制到镜像目录下。这种方式对于一些较小的项目可能更适合,因为它们可能会占用一些磁盘空间。Dropbox 镜像:这种镜像使用 Dropbox 客户端创...
    99+
    2023-10-25
    镜像 模式 服务器
  • 轻量应用服务器镜像选哪个好一点的
    选择一款能够容纳数百TB的服务器镜像的服务器,这样可以支持更多的用户在不同的地理位置使用。 根据实际情况选择可以容纳数千或上万用户的服务器,这样可以支持更多不同的应用程序在不同的设备上运行。在选择服务器镜像时,需要考虑到用户数量和应用程序种...
    99+
    2023-10-25
    镜像 服务器
  • 云服务器镜像怎么选择
    选择云服务器镜像的一般步骤如下: 选择云服务器提供商:您可以通过访问云服务提供商的网站或客户端以获取更多信息来选择适合您的镜像服务提供商。 查看数据保护:查看云服务器提供商的数据保护政策,了解其对客户数据的保护级别,以及是否提供数据删除...
    99+
    2023-10-26
    镜像 服务器
  • 阿里云服务器镜像了解和选择最适合您的镜像
    本文将介绍阿里云服务器的镜像,包括阿里云官方提供的镜像以及用户自定义镜像。我们将探讨如何选择适合您需求的镜像,并提供一些常见的应用场景举例。 1. 阿里云官方提供的镜像阿里云提供了多种官方镜像供用户选择。这些镜像是经过测试和验证的,具有较高...
    99+
    2024-01-16
    镜像 您的 阿里
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作