您当前的位置:首页 > 电脑百科 > 程序开发 > 容器

将 Node.js 应用程序容器化的七种方法

时间:2023-03-24 11:59:12  来源:今日头条  作者:科技狠活与软件技术
本文列出了七种容器化 node.js 应用程序的方法,让我们简要地看一下它们。

在过去的五年里,Node.js 一直是严肃程序员的最爱。最大吞吐量的 JAVAScript 运行时环境是一个免费的开源程序,旨在提高JavaScript在多个平台上的性能。

由于其事件驱动、非阻塞 I/O 方法,Node.js 体积小且处理请求速度快,使其成为数据密集型、实时和分布式应用程序的绝佳选择。

开发人员越来越多地转向 node.js 应用程序优化服务;因此,简化跨平台应用程序的设计和发布过程非常重要。那么,让我们进入文章的上下文。

Node App 容器化和优化建议

这里列出了七种容器化 node.js 应用程序的方法,所以让我们简要地看一下它们。

1.使用特定的基本图像标签而不是“版本:最新”

创建Docker映像时,应始终包含用于定义版本信息、预期目标(例如生产或测试)、稳定性或其他用于跨环境分发应用程序的相关信息的有用标签。

在开发环境之外,您不应依赖 Docker 自动下载的最新标签。使用最新版本的程序可能会导致奇怪甚至有害的影响。

假设您不断更新到最新版本的图像。在这种情况下,最终,其中一个更新肯定会包含一个全新的构建或未经测试的代码,这将导致您的应用程序停止按预期运行。

以针对该节点的这个示例 Dockerfile 为例​:

# Create image based on the official Node image from dockerhubFROM node:lts-buster # Create app directoryWORKDIR /usr/src/app # Copy dependency definitionsCOPY package.json ./package.jsonCOPY package-lock.json ./package-lock.json # Install dependencies#RUN npm set progress=false # && npm config set depth 0 # && npm i installRUN npm ci # Get all the code needed to run the appCOPY . . # Expose the port the app runs inEXPOSE 3000 # Serve the appCMD ["npm", "start"]

您不应使用 node:latest,而应使用 lts-buster Docker 映像。考虑到 lts-buster 是静态图片,这种方法可能更可取。

2.使用多阶段构建

一个单一的 Docker 基础镜像可以在构建的多个阶段使用,包括编译、打包和 单元测试。但是,执行程序的实际代码存储在不同的映像中。

由于完成的图像没有任何开发或调试工具,因此它会更安全并且占用更少的空间。此外,如果您使用 Docker 的多阶段构建过程,您可以确定您的构建将既高效又可重复。

您可以在 Dockerfile 中创建多个阶段来控制构建该映像的方式。您可以使用多层方法容器化您的 Node 应用程序。

应用程序的不同部分,如代码、资产,甚至快照依赖项,可能位于构成程序的许多层的每一层中。如果我们希望为我们的应用程序创建一个独立的图像怎么办?

要查看此操作的示例 Dockerfile,​请检查以下内容:

FROM NODE:LTS-BUSTER-SLIM AS DEVELOPMENT WORKDIR /USR/SRC/APP COPY PACKAGE.JSON ./PACKAGE.JSONCOPY PACKAGE-LOCK.JSON ./PACKAGE-LOCK.JSONRUN NPM CI COPY . . EXPOSE 3000 CMD [ "NPM", "RUN", "DEV" ] FROM DEVELOPMENT AS DEV-ENVSRUN <<EOFAPT-GET UPDATEAPT-GET INSTALL -Y --NO-INSTALL-RECOMMENDS GITEOF # INSTALL DOCKER TOOLS (CLI, BUILDX, COMPOSE)COPY --FROM=GLOURSDOCKER/DOCKER / /CMD [ "NPM", "RUN", "DEV" ]

我们首先在 node:lts-buster-slim 语句中添加一个 AS 开发标签。这使我们可以在其他构建阶段中引用此构建阶段。接下来,我们添加一个标记为 dev-envs 的新开发阶段。我们将使用这个阶段来运行我们的开发。

现在,让我们重建我们的形象并运行我们的开发。为了仅执行开发构建阶段,我们将使用与之前相同的 docker build 命令,但这次我们将使用 —target 开发参数。

docker build -t node-docker --target dev-envs

3.修复节点镜像中的安全漏洞

为了创建现代服务,程序员经常使用已有的第三方软件。但是,在将第三方软件集成到您的项目中时一定要谨慎,因为它可能存在安全漏洞。

使用经过验证的图像源和保持警惕的容器监控都是有用的安全措施。Docker Desktop 会通知您对新创建的 node:lts-buster-slim Docker 镜像进行安全检查。

让我们借助 Docker Desktop 的 Snyk 插件看看我们的 Node.js 应用程序。首先在您的 macwindowslinux PC 上设置 Docker Desktop 4.8.0+。接下来,选择设置 > 扩展下的允许 Docker 扩展复选框。

之后,您可以通过选择左侧栏中的“添加扩展”选项在扩展市场中搜索 Snyk。

放入 Snyk 并登录网络:

 

 

lts-buster-slim 在“选择图像名称”框中键入“Node Docker 官方图像”。为了开始扫描,您需要登录到 Docker Hub。如果您没有帐户,请不要担心;制作一个简单、快速且完全免费。

使用 Docker Desktop,扫描结果如下所示:

在此扫描期间,Snyk 发现了 70 个不同严重程度的漏洞。确定它们后,您可以开始修复它们以提高您的声誉。

不仅如此。在 Dockerfile 上使用 docker scan 命令将执行漏洞扫描:

 

 

4. 利用健康检查

HEALTHCHECK 指令指示 Docker 如何检查容器的健康状况。例如,这可用于确定 Web 服务器是否处于无限循环中并且无法接受新连接,即使服务器进程仍处于活动状态。

# syntax=docker/dockerfile:1.4 FROM node:lts-buster-slim AS development # Create app directoryWORKDIR /usr/src/app COPY package.json ./package.jsonCOPY package-lock.json ./package-lock.jsonRUN npm ci COPY . . EXPOSE 3000 CMD [ "npm", "run", "dev" ] FROM development as dev-envsRUN <<EOFapt-get updateapt-get install -y --no-install-recommends gitEOF RUN <<EOFuseradd -s /bin/bash -m vscodegroupadd dockerusermod -aG docker vscodeEOF HEALTHCHECK CMD curl --fAIl http://localhost:3000 || exit 1 # install Docker tools (cli, buildx, compose)COPY --from=gloursdocker/docker / /CMD [ "npm", "run", "dev" ]

在生产阶段,应用程序通常由 Kube.NETes 或服务结构等编排器管理。HEALTHCHECK 允许您通知编排器有关容器的健康状况,这可能用于基于配置的管理。

这是一个很好的例子:​

BACKEND: CONTAINER_NAME: BACKEND RESTART: ALWAYS BUILD: BACKEND VOLUMES: - ./BACKEND:/USR/SRC/APP - /USR/SRC/APP/NODE_MODULES DEPENDS_ON: - MONGO NETWORKS: - EXPRESS-MONGO - REACT-EXPRESS EXPOSE: - 3000 HEALTHCHECK: TEST: ["CMD", "CURL", "-F", "HTTP://LOCALHOST:3000"] INTERVAL: 1M30S TIMEOUT: 10S RETRIES: 3 START_PERIOD: 40S

5.使用.dockerignore

我们建议在与 Dockerfile 相同的文件夹中创建一个 .dockerignore 文件以缩短构建时间。本指南需要您的 .dockerignore 文件中的一行:

NODE_MODULES

由于这一行,包含 Maven 输出的节点模块目录未包含在 Docker 构建上下文中。拥有一个组织良好的 .dockerignore 文件有很多好处,但目前,这个简单的文件就足够了。

接下来,我将描述构建环境及其如此重要的原因。可以使用 Docker build 命令通过组合 Dockerfile 和“上下文”来创建 Docker 映像。在此设置中,您所做的一切都适用于您刚才给我的目录结构或 URL。这些文件中的任何一个都可以在构建过程中使用。

同时,开发人员在编译上下文中进行操作。Mac、Windows 或 Linux 上的目录。运行该程序所需的一切都可以在此文件夹中找到,包括源代码、设置、库和插件。

如果您提供 .dockerignore 文件,我们可能会在创建新图像时使用它来跳过项目的某些部分:代码、配置文件、库、插件等。例如,如果您想将节点模块目录保留在外面在您的构建中,您可以通过将以下内容添加到您的 .dockerignore 文件来实现。

后端

前端

 

 

6.出于安全目的以非根用户身份运行

在用户许可的情况下运行应用程序更安全,因为这有助于减少漏洞。即使使用 Docker 容器。Docker 容器及其内容会自动获得对主机系统的根访问权限。这就是为什么建议永远不要以 root 用户身份运行 Docker 容器。

这可以通过在 Dockerfile 中包含某些 USER 指令来实现。在执行映像以及任何未来的 RUN、CMD 或 ENTRYPOINT 指令时,USER 命令指定所需的用户名(或 UID)以及可选的用户组(或 GID):

FROM NODE:LTS-BUSTER AS DEVELOPMENT WORKDIR /USR/SRC/APP COPY PACKAGE.JSON ./PACKAGE.JSONCOPY PACKAGE-LOCK.JSON ./PACKAGE-LOCK.JSON RUN NPM CI COPY . . EXPOSE 3000 CMD ["NPM", "START"] FROM DEVELOPMENT AS DEV-ENVSRUN <<EOFAPT-GET UPDATEAPT-GET INSTALL -Y --NO-INSTALL-RECOMMENDS GITEOF RUN <<EOFUSERADD -S /BIN/BASH -M VSCODEGROUPADD DOCKERUSERMOD -AG DOCKER VSCODEEOF# INSTALL DOCKER TOOLS (CLI, BUILDX, COMPOSE)COPY --FROM=GLOURSDOCKER/DOCKER / /CMD [ "NPM", "START" ]

7. 探索 Node 的优雅关闭选项

在 Docker 中为 Node.js 创建的临时存储空间。它们很容易预防、销毁,然后更换或重新利用。可以通过向进程提供 SIGTERM 信号来终止容器。

为了充分利用这个短暂的机会窗口,您的应用程序必须能够立即处理传入的请求并释放任何相关资源。

另一方面,Node.js 对于成功关闭应用程序至关重要,因为它从操作系统接收并传递 SIGINT 和 SIGTERM 等信号。由于 Node.js,您的应用程序可以选择如何响应它接收到的信号。

如果你不为他们编程或使用一个模块,你的应用程序将无法正常终止。但是,它将继续正常运行,直到 Docker 或Kubernetes由于超时而终止它。

如果您无法修改应用程序的代码,您仍然可以在 Dockerfile 中使用 docker run —init 或 tini init 选项。但是,建议您提供代码来管理适当的信号处理以实现正常关闭。

结论

在本教程中,我们涵盖了与 Docker 镜像优化相关的广泛主题,从构建可靠的 Dockerfile 到使用 Snyk 检查漏洞。制作更好的 Node.js 应用程序并不难。如果你掌握了一些基本技能,你的状态就会很好。



Tags:容器   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
掌握Docker网络驱动程序:优化容器通信
Docker为在容器内包装、交付和运行应用程序提供了一个强大的平台,从而彻底改变了容器化。网络是容器化的重要组成部分,Docker提供了各种网络驱动程序来支持容器之间的通信以...【详细内容】
2024-03-22  Search: 容器  点击:(11)  评论:(0)  加入收藏
Containerd容器管理
Nginx 指定容器名称 使用 ctr container create 命令创建容器后,容器并没有处于运行状态,其只是一个静态的容器。容器基本操作容器基本操作主要是 ctr image 命令,查看命令帮...【详细内容】
2024-03-20  Search: 容器  点击:(13)  评论:(0)  加入收藏
我们一起聊聊容器资源自愈
在企业实际在使用容器这类资源的时候,除了技术本身,要考虑的其他问题也会很多。企业管理的容器有千千万万,出于效率考虑,对于有特殊需求的容器如何进行批量创建和管理呢,这就需要...【详细内容】
2024-01-30  Search: 容器  点击:(47)  评论:(0)  加入收藏
Docker镜像与容器的交互及在容器内部执行代码的原理与实践
Docker作为一种流行的容器技术,已经成为现代应用程序开发和部署的重要工具。在Docker中,镜像是构建和运行容器的基础,而容器则是基于镜像创建的可执行实例。Docker镜像与容器的...【详细内容】
2024-01-10  Search: 容器  点击:(78)  评论:(0)  加入收藏
Go微服务入门到容器化实践
Go微服务入门到容器化实践Go 是一门高效、现代化、快速增长的编程语言,非常适合构建 Web 应用程序。而 Docker 是一种轻量级的容器化技术,能够使得您的应用程序在任何地方运行...【详细内容】
2024-01-01  Search: 容器  点击:(63)  评论:(0)  加入收藏
容器的“边缘”
译者 | 布加迪审校 | 重楼近年来边缘计算和容器越来越受欢迎,为我们日常生活中与数据处理相关的各种挑战提供了创新的解决方案。这些技术现在已经渗入到各种设备中,包括我们的...【详细内容】
2023-12-25  Search: 容器  点击:(167)  评论:(0)  加入收藏
Docker容器如何打包应用程序的代码和依赖项?
Docker容器通过将应用程序的代码和所有依赖项打包到一个独立的软件包中,实现了应用程序的快速部署和移植。下面是Docker容器实现这一目标的步骤:打包应用程序:使用Docker工具将...【详细内容】
2023-12-20  Search: 容器  点击:(130)  评论:(0)  加入收藏
理解Go、容器以及Linux调度器
Go开发的应用程序通常部署在容器中。在容器中运行时,重要的一点是要设置CPU限制以确保容器不会耗光主机上的所有CPU。但Go运行时不知道容器上设置的CPU限制,因此有可能会把所...【详细内容】
2023-12-18  Search: 容器  点击:(122)  评论:(0)  加入收藏
Docker容器编排技术解析
一、容器编排介绍容器编排是现代云原生应用管理的核心,它涉及在大规模的环境中自动化部署、管理、扩展和网络配置容器。随着微服务架构的兴起和应用的复杂性增加,容器编排成为...【详细内容】
2023-12-15  Search: 容器  点击:(248)  评论:(0)  加入收藏
在Linux系统中实现容器化的大规模数据分析平台:Hadoop和Spark
在Linux系统中实现容器化的大规模数据分析平台,我们可以利用Hadoop和Spark这两个强大的开源工具。Hadoop是一个分布式计算框架,适用于处理大规模数据集。它提供了分布式文件系...【详细内容】
2023-12-15  Search: 容器  点击:(155)  评论:(0)  加入收藏
▌简易百科推荐
Docker 和传统虚拟机有什么区别?
我有一个程序员朋友,他每年情人节都要送女朋友一台服务器。他说:“谁不想在过节当天收到一台 4核8g 的服务器呢?”“万一对方不要,我还能留着自己用。” 给他一次过节的机会,他能...【详细内容】
2024-03-26  小白debug  微信公众号  Tags:Docker   点击:(12)  评论:(0)  加入收藏
掌握Docker网络驱动程序:优化容器通信
Docker为在容器内包装、交付和运行应用程序提供了一个强大的平台,从而彻底改变了容器化。网络是容器化的重要组成部分,Docker提供了各种网络驱动程序来支持容器之间的通信以...【详细内容】
2024-03-22    51CTO  Tags:Docker   点击:(11)  评论:(0)  加入收藏
Containerd容器管理
Nginx 指定容器名称 使用 ctr container create 命令创建容器后,容器并没有处于运行状态,其只是一个静态的容器。容器基本操作容器基本操作主要是 ctr image 命令,查看命令帮...【详细内容】
2024-03-20  云原生运维圈  微信公众号  Tags:容器   点击:(13)  评论:(0)  加入收藏
如何基于Docker镜像逆向生成Dockerfile
引言你是否曾经遇到过一个想要使用的 Docker 镜像,但却无法修改以适应你的特定需求?或者你可能发现了一个喜欢的 Docker 镜像,但想要了解它是如何构建的?在这两种情况下,将 Docke...【详细内容】
2024-03-07  云原生运维圈  微信公众号  Tags:Docker   点击:(23)  评论:(0)  加入收藏
Kubernetes是什么?主要特点是什么?
Kubernetes是什么?Kubernetes,也称为K8s,是一个开源的容器编排系统,由Google首次开发和维护。它允许容器化的应用程序在集群中自动部署、扩展和管理。Kubernetes提供了一种容器...【详细内容】
2024-02-01    简易百科  Tags:Kubernetes   点击:(160)  评论:(0)  加入收藏
我们一起聊聊容器资源自愈
在企业实际在使用容器这类资源的时候,除了技术本身,要考虑的其他问题也会很多。企业管理的容器有千千万万,出于效率考虑,对于有特殊需求的容器如何进行批量创建和管理呢,这就需要...【详细内容】
2024-01-30  匠心独运维妙维效  微信公众号  Tags:容器   点击:(47)  评论:(0)  加入收藏
Docker与Docker Compose入门:释放你应用部署的威力
今天给大家介绍一项强大而有趣的技能,那就是使用 Docker 和 Docker Compose 来释放你的应用部署的威力!无论你是一名开发人员还是系统管理员,掌握这个技能都将为你的工作带来巨...【详细内容】
2024-01-17  waynblog  微信公众号  Tags:Docker   点击:(66)  评论:(0)  加入收藏
Docker镜像与容器的交互及在容器内部执行代码的原理与实践
Docker作为一种流行的容器技术,已经成为现代应用程序开发和部署的重要工具。在Docker中,镜像是构建和运行容器的基础,而容器则是基于镜像创建的可执行实例。Docker镜像与容器的...【详细内容】
2024-01-10  编程技术汇  今日头条  Tags:Docker   点击:(78)  评论:(0)  加入收藏
如何在 Ubuntu 上安装 Docker
使用 Docker 意味着开启一个新的计算领域,但如果你刚刚开始使用 Docker,安装可能看起来是一项艰巨的任务。在 Ubuntu 上安装 Docker 有两种推荐的方法: 从 Ubuntu 的仓库安装 D...【详细内容】
2024-01-04    Linux中国  Tags:Docker   点击:(124)  评论:(0)  加入收藏
从Kubernetes的探针到DevOps
今天在群里又看有人问如何设置 Kubernetes 的探针,感觉要补充的话太多了,结合我们在一些 DevOps 项目中痛苦的体验,今天一劳永逸的全部说完,此外,也为大家展现一下为什么 DevOps...【详细内容】
2023-12-27  云云众生s  微信公众号  Tags:Kubernetes   点击:(116)  评论:(0)  加入收藏
站内最新
站内热门
站内头条