首页 文章 精选 留言 我的

精选列表

搜索[nodejs],共1637篇文章
优秀的个人博客,低调大师

Docker上开发nodejs

Docker介绍 Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub上进行维护。 Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。 在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。 下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。 Docker的优势 作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。 首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。 容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。 我理解的Docker 目前,我在使用docker的过程中基本上是本地开发好项目之后,生成dist文件目录,迁移到docker当中,相当于只在生产环境开发使用docker,原因主要有以下几点: 在开发环境使用docker感觉还是不是很舒服,每次修改都要重新build,以及run,比较麻烦,本地开发更加舒服; docker实际上可以看做是一个封闭的盒子,想做一些查看和操作还是有点麻烦的的,交互性不是很好,感觉比较适合生产环境。 Docker hub介绍 目前 Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了超过 15,000 的镜像,大部分需求,都可以通过在 Docker Hub 中直接下载镜像来实现。 登陆 可以通过执行 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。 注册成功后,本地用户目录的 .dockercfg 中将保存用户的认证信息。 dockerlogin--username=username--email=email@gmail.com 下载 根据是否是官方提供,可将镜像资源分为两类。 一种是类似 centos 这样的基础镜像,被称为基础或根镜像。这些基础镜像是由 Docker 公司创建、验证、支持、提供。这样的镜像往往使用单个单词作为名字。 还有一种类型,比如 tianon/centos 镜像,它是由 Docker 的用户创建并维护的,往往带有用户名称前缀。可以通过前缀 user_name/ 来指定使用某个用户提供的镜像,比如 tianon 用户。 dockerpullapline //or dockerpullmhart/alpine-node-auto 提交 修改当前镜像之后需要提交修改后的镜像,修改一次镜像包括提交的过程如下: 先使用下载的镜像启动容器。 dockerrun-t-itraining/sinatra/bin/bash root@0b2616b0e5a8:/# 注意:记住容器的 ID,稍后还会用到。在容器中添加 json package(一个 ruby gem)。 root@0b2616b0e5a8:/#geminstalljson 当结束后,我们使用 exit 来退出,现在我们的容器已经被我们改变了,使用 docker commit 命令来提交更新后的副本。 dockercommit-m"Addedjsongem"-a"DockerNewbee"0b2616b0e5a8ouruser/sinatra:v2 4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c 其中,-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;-a 可以指定更新的用户信息;之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息。 使用 docker images 来查看新创建的镜像。 之后,可以使用新的镜像来启动容器 $dockerrun-t-iouruser/sinatra:v2/bin/bash root@78e82f680994:/# 上传 用户可以通过 docker push 命令,把自己创建的镜像上传到仓库中来共享。例如,用户在 Docker Hub 上完成注册后,可以推送自己的镜像到仓库中。 $dockerpushouruser/sinatra Thepushreferstoarepository[ouruser/sinatra](len:1) Sendingimagelist Pushingrepositoryouruser/sinatra(3tags) 修改镜像的标签 用 docker tag 命令来修改镜像的标签。 $sudodockertag5db5f8471261ouruser/sinatra:devel $sudodockerimagesouruser/sinatra REPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZE ouruser/sinatralatest5db5f847126111hoursago446.7MB ouruser/sinatradevel5db5f847126111hoursago446.7MB ouruser/sinatrav25db5f847126111hoursago446.7MB 利用 Dockerfile 来创建镜像 使用 docker commit 来扩展一个镜像比较简单,但是不方便在一个团队中分享。我们可以使用 docker build 来创建一个新的镜像。为此,首先需要创建一个 Dockerfile,包含一些如何创建镜像的指令。 Dockerfile 中每一条指令都创建镜像的一层,例如: #Dockerfile.alpine FROMmhart/alpine-node:latest MAINTAINERzhanfang"fzhanxd@gmail.com" #Ifyouhavenativedependencies,you'llneedextratools #RUNapkadd--no-cachemakegccg++python #Createappdirectory RUNmkdir-p/usr/src/app WORKDIR/usr/src/app #Ifyourprojectdependsonmanypackage,youcanusecnpminsteadofnpm #RUNnpminstallcnpm-g--registry=https://registry.npm.taobao.org #Installappdependencies COPYpackage.json/usr/src/app/ RUNnpminstall--registry=https://registry.npm.taobao.org #Bundleappsource COPY./usr/src/app #Exposeport EXPOSE3000 CMD["npm","start"] 编写完成 Dockerfile 后可以使用 docker build 来生成镜像。 dockerbuild-talpine-koa2-startkit. 其中 -t 标记来添加 tag,指定新的镜像的用户信息。 “.” 是 Dockerfile 所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径。 Dockfile 中的指令被一条一条的执行。每一步都创建了一个新的容器,在容器中执行指令并提交修改(就跟之前介绍过的 docker commit 一样)。当所有的指令都执行完毕之后,返回了最终的镜像 id。所有的中间步骤所产生的容器都被删除和清理了。 注意一个镜像不能超过 127 层 完成一次镜像的下载、修改和上传 以alpine-node-auto镜像为基础 1. 下载基础镜像 dockerpullmhart/alpine-node-auto 2. 编写dockerfile #Dockerfile.alpine FROMmhart/alpine-node:latest MAINTAINERzhanfang"fzhanxd@gmail.com" #Ifyouhavenativedependencies,you'llneedextratools #RUNapkadd--no-cachemakegccg++python #Createappdirectory RUNmkdir-p/usr/src/app WORKDIR/usr/src/app #Ifyourprojectdependsonmanypackage,youcanusecnpminsteadofnpm #RUNnpminstallcnpm-g--registry=https://registry.npm.taobao.org #Installappdependencies COPYpackage.json/usr/src/app/ RUNnpminstall--registry=https://registry.npm.taobao.org #Bundleappsource COPY./usr/src/app #Exposeport EXPOSE3000 CMD["npm","start"] 3. 创建新的镜像 dockerbuild-t=zhanfang/alpine-koa2-startkit:v1". 打上 alpine-koa2-startkit:v1 的 tag 4. 运行一个容器实例 dockerrun-t-i--namealpine-koa2-applicationzhanfang/alpine-koa2-startkit:v2 5. 上传镜像(如果没有登录请登陆,使用login命令) dockerpushzhanfang/alpine-koa2-startkit 作者:zhanfang 来源:51CTO

优秀的个人博客,低调大师

Nodejs内存控制详解(上篇)

1 V8的垃圾回收机制与内存限制 JavaScript与Java一样,由垃圾回收机制来进行自动的内存管理。对于性能敏感的服务器端程序,内存管理的好坏、垃圾回收状况是否优良,都会对服务构成影响。而在Node中,这一切与V8引擎息息相关。 1.2 V8的内存限制 Node中通过JavaScript只能使用部分内存(64位约1.4G,32位约0.7G)。V8对内存做了限制。因此这种限制下,将会导致Node无法直接操作大内存对象。 1.3 V8的对象分配 V8中,所有的JavaScript对象都是通过堆来分配的。 可以使用以下命令查看Node中V8内存的使用量。 > $ node > process.memoryUsage(); { rss: 25939968, heapTotal: 5767168,//已申请到的堆内存 heapUsed: 4707312,//当前使用的量 external: 8671 } 至于rss为何物,我们会在下面介绍。 V8的堆示意图: 限制内存原因: 首先V8是为浏览器而设计的;前期足以满足网页端的需求; 深层原因是V8的垃圾回收机制,垃圾回收耗时,引起JavaScript线程暂停执行时间。 可以手工调整内存大小 node --max-old-space-size=1700 test.js //单位为MB。设置老生代 node --max-new-space-size=1024 test.js //单位为KB。设置新生代 1.4 V8的垃圾回收机制 主要的垃圾回收策略是基于分代式的垃圾回收机制:将对象的存活时间进行不同的分代; V8中,主要将内存分为新生代和老生代。新生代中的对象为存活时间较短的对象,老生代中的对象为存活时间较长或常驻内存的对象。 前面讲到的命令是可以分别设置新生代和老生代的大小。 新生代和老生代的最大值需要在启动时就指定,因此无法动态 扩展。手工设置新生代或老生代的内存,只能在启动时就指定,无法动态的扩展。 Scavenge算法 在分代的基础上,新生代中的对象主要通过Scavenge算法进行垃圾回收。Scavenge算法的具体实现中采用了Cheney算法。 Cheney算法主要使用了复制的方式实现。 新生代堆内存被一分为二 From区存放处于使用状态对象 TO区为闲置空间 分配对象时首先在From分配 垃圾回收时,检查From空间中的存活对象,将这些对象复制到TO空间。非存活对象直接释放对应空间。 垃圾回收实际上就是将对象在FROM和TO两个空间之间复制。 多次复制仍然存活的对象,即生命周期较长的对象,会被移动到老生代。 对象从新生代到老生代的过程称为晋升 对象晋升过程: 另一个判断条件是:TO空间使用是否超过25%。如果超过,直接移动到老生代。 设置25%这个值,是因为当Scavenge完成回收后,这个TO区将变成From区,后面的对象分配要在这个区中进行。如果占比过高,会影响后续的内存分配。 Scavenge的缺点是只能使用堆内存的一半。所以无法大规模的运用到所有的垃圾回收中。但是时间效率上有优异的表现。因此非常适合新生代的垃圾回收,因为新生代中的对象存活周期都较短。 Mark-Sweep & Mark-Compact算法 老生代中主要采用这两种算法进行垃圾回收。 因为老生代中的存活对象占比较大,因此使用Scavenge算法会有弊端: 存活对象多,复制效率低; 浪费一半空间; 1.Mark-Sweep:标记清除 分为标记、清除两个阶段; 标记阶段会遍历堆中的所有对象,并只标记活着的对象; 清除阶段只清除没有被标记的对象; Mark-Sweep | Scavenge --- | --- 只清理死亡对象 | 只复制存活对象 死对象在老生代中比重小 | 活对象在新生代中比重小 Mark-Sweep的最大问题即是:在清理完后,内存会出现不连续的状态。导致后续对内存的分配可能出现问题,如无法分配一个大对象。 2.Mark-Compact:标记整理 为了解决Mark-Sweep的问题。Mark-Compact在标记对象死亡后,在整理过程中,将活着的对象往一端移动,移动完成后,直接清理掉边界外的内存。 算法比较 | 算法 | Mark-Sweep | Mark-Compact | Scavenge ---| --- | -- |-- 速度 | 中等| 最慢 | 最快 空间开销 | 少(有碎片)|少(无碎片)| 双倍空间(无碎片) 是否移动对象 | 否 | 是 | 是 V8主要使用Mark-Compact,在空间不足以对从新生代中晋升过来的对象进行分配时才使用Mark-Sweep。 原文发布时间为:2018年01月20日原文作者:sunangie 本文来源:开源中国 如需转载请联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。