在过去的五年里,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 <我们首先在 node:lts-buster-slim 语句中添加一个 AS 开发标签。这使我们可以在其他构建阶段中引用此构建阶段。接下来,我们添加一个标记为 dev-envs 的新开发阶段。我们将使用这个阶段来运行我们的开发。
现在,让我们重建我们的形象并运行我们的开发。为了仅执行开发构建阶段,我们将使用与之前相同的 docker build 命令,但这次我们将使用 —target 开发参数。
docker build -t node-docker --target dev-envs3.修复节点镜像中的安全漏洞为了创建现代服务,程序员经常使用已有的第三方软件。但是,在将第三方软件集成到您的项目中时一定要谨慎,因为它可能存在安全漏洞。
使用经过验证的图像源和保持警惕的容器监控都是有用的安全措施。Docker Desktop 会通知您对新创建的 node:lts-buster-slim Docker 镜像进行安全检查。
让我们借助 Docker Desktop 的 Snyk 插件看看我们的 Node.js 应用程序。首先在您的 Mac、Windows 或 Linux 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 <在生产阶段,应用程序通常由 Kubernetes 或服务结构等编排器管理。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: 40S5.使用.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 <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 应用程序并不难。如果你掌握了一些基本技能,你的状态就会很好。
关键词:
(责任编辑:黄俊飞)推荐内容
- 将 Node.js 应用程序容器化的七种方法
- 3月24日主力动向揭秘——明日预测|最新
- 热点!厦门象屿3月24日盘中跌幅达5%
- 世界观点:《艾尔登法环》光追PC性能分析
- 我的名字叫金三顺剧情介绍
- 世界头条:再续“樱花之约”, 湖北迈向
- 讴歌TSX在三轮驱动下在终点线完成令人难
- 世界防治结核病日:了解结核病的9个认识
- 中成药“国采”,明星药扎堆厮杀,中成药
- 强化作风建设 深化服务意识_全球球精选
- 节约用电的实用方法_生活中的节电小窍门
- 环球微头条丨怎样训练金毛狗
- 江苏民营企业外贸动力澎湃_世界报资讯
- 今日讯!最是书香能致远,来看长沙这所小
- 产量同比走高,轮胎厂开工维持稳定金十期
- 天天新消息丨晶瑞电材:董事会决定不提前
- HPV疫苗免费接种再添一地 惠及江苏省24.
- 每日时讯!吉水是哪个省的城市
- 信息:EQ系列三款车型2021年将引入国产奔
- 教育部:全国共有幼儿园28.92万所,其中8
- 眼睛肿是什么原因用什么药_眼睛肿是什么
- 天天新资讯:3月23日河北正元液氨报价下调
- 看热讯:南华大学男生造黄谣牟利,中科大
- 速讯:2016年里约奥运会的女排冠军是哪个
- 美国损失一架B-2轰炸机
- 晚婚率_对于晚婚率简单介绍
- 世界信息:国际产业投资合作系列活动·江
- 新西兰华人爆料!国足训练半小时就去买垃
- 珠峰测量登山队登顶成功的意义
- 计算并结转本年利润怎么算_结转本年利润
- 当前关注:想要学习Python,又该如何去学?
- 19座城市纳入首批区域再生水循环利用试点
- 全球观速讯丨月亮湾村:激活乡村旅游 打
- OpenAI 首席执行官警告称:竞争对手将使
- 三江县气象台发布大风蓝色预警信号【IV级
- 国泰君安期货高级研究员王笑3月21日LPG、
- 世界观点:网络转码著作权纠纷律师怎么收
- 瑞银无意践行瑞信投行梦,更看重后者的优
- 当前滚动:新疆轮台县首届迎“春分”系列
- 焦点快播:漩涡岛图文攻略_dnf漩涡攻略
- 【环球快播报】沪剧宝别梅华文孙徐春_孙
- 丙醇取代反应方程式_丙醇的消去反应方程
- 全球版图进一步拓展,吉利汽车2022年出口
- 比依股份3月21日打开涨停-天天亮点
- 两市融资余额增加27.18亿元-今日热文
- 天天快看点丨奥尔维亚瑜伽视频大全_奥尔
- 全球新消息丨2019行政事业单位会计科目表
- 天天时讯:从洪崖洞到磁器口怎么走?(公
- 皇庭国际:2023年限制性股票激励计划完成
- 赋能区域产业能级提升!国内顶级泛半导体
- 当前动态:dnf新手满级后怎么弄装备_dnf新手
- 取消教师编制的后遗症:25万的参聘制岗位
- 全球快播:沙河“尖刀兵” 炼成记
- 中国宝安:3月17日获融资买入1439.91万元
- 于心何忍什么意思_于心何忍是什么意思
- 天天即时:德华银行旧址
- 厦门凤凰体育馆精细打磨!2023年CBA全明
- 我国海上首口二氧化碳封存回注井开钻率先
- “山不来见我,我自去见山”——杭州徒步
- 人过40,进入癌症高发期:想长寿,请提防
- 眼睛肿是什么原因用什么药_眼睛肿是什么
- 天天新资讯:3月23日河北正元液氨报价下调
- 看热讯:南华大学男生造黄谣牟利,中科大
- 速讯:2016年里约奥运会的女排冠军是哪个
- 美国损失一架B-2轰炸机
- 晚婚率_对于晚婚率简单介绍
- 世界信息:国际产业投资合作系列活动·江
- 新西兰华人爆料!国足训练半小时就去买垃
- 珠峰测量登山队登顶成功的意义
- 计算并结转本年利润怎么算_结转本年利润
- 当前关注:想要学习Python,又该如何去学?
- 19座城市纳入首批区域再生水循环利用试点
- 全球观速讯丨月亮湾村:激活乡村旅游 打
- OpenAI 首席执行官警告称:竞争对手将使
- 三江县气象台发布大风蓝色预警信号【IV级
- 国泰君安期货高级研究员王笑3月21日LPG、
- 世界观点:网络转码著作权纠纷律师怎么收
- 瑞银无意践行瑞信投行梦,更看重后者的优
- 当前滚动:新疆轮台县首届迎“春分”系列
- 焦点快播:漩涡岛图文攻略_dnf漩涡攻略
- 【环球快播报】沪剧宝别梅华文孙徐春_孙
- 丙醇取代反应方程式_丙醇的消去反应方程
- 全球版图进一步拓展,吉利汽车2022年出口
- 比依股份3月21日打开涨停-天天亮点
- 两市融资余额增加27.18亿元-今日热文
- 天天快看点丨奥尔维亚瑜伽视频大全_奥尔
- 全球新消息丨2019行政事业单位会计科目表
- 天天时讯:从洪崖洞到磁器口怎么走?(公
- 皇庭国际:2023年限制性股票激励计划完成
- 赋能区域产业能级提升!国内顶级泛半导体
- 当前动态:dnf新手满级后怎么弄装备_dnf新手
- 取消教师编制的后遗症:25万的参聘制岗位
- 全球快播:沙河“尖刀兵” 炼成记
- 中国宝安:3月17日获融资买入1439.91万元
- 于心何忍什么意思_于心何忍是什么意思
- 天天即时:德华银行旧址
- 厦门凤凰体育馆精细打磨!2023年CBA全明
- 我国海上首口二氧化碳封存回注井开钻率先
- “山不来见我,我自去见山”——杭州徒步
- 人过40,进入癌症高发期:想长寿,请提防
- 立冬吃什么传统食物有哪些讲究_立冬吃什
- 烤羊排的腌制方法和配料_烤羊
- 御龙修仙传小说叫什么_御龙修仙传小说
- 银胶布百科_银胶布
- 环球今头条!月刊少女野崎君漫画_月刊少
- 普冉股份:3月17日融券卖出2.28万股,融
- 本周六开课!人生优势论学什么?来看视频
- 天天速看:魔兽怀旧服牧师救人宏搞笑_魔
- 库里:如果有人想当勇士的领袖我愿意让位
- 华为健康使用手机强制破解2022_华为健康
- 全球头条:社科院社会学所发布2023睡眠报
- 苏宁易购“比价贵就赔”服务延续至3月31
- 快讯:A股地产板块活跃,千亿市值龙头股
- 黄蜂窝煮水大概煮多久?
- 微资讯!小学生中秋节古诗_小学生中秋节
- 页面tab是什么意思_tab是什么意思|全球热
- 海优新材(688680):上海海优威新材料股份
- 2023天津郁金香赏花指南
- 美媒:高通胀正掏空美国人储蓄 近半民众
- 天天日报丨马鞍山儿童身高偏矮去哪看