【云原生 | 36】Docker快速部署主流脚本语言JavaScript_nas中docker如何运行index.js-程序员宅基地

技术标签: 云原生  容器  阶段六:零基础入门云原生(Docker+k8s)  docker  

博主简介
        云计算领域优质创作者
        新星计划第三季python赛道第一名
        阿里云ACE认证高级工程师
        阿里云开发者社区专家博主
博主微信:15575411187
交流社区小鹏linux(个人社区)欢迎您的加入!

目录

1. 关于JavaScript

1.2 如何运行 JavaScript 

1.3 JavaScript 的特点 

2. 关于Node.js

2.1 Node.js简介 

2.2 Node.js 的组成 

3. 用Docker搭建和使用Node.js环境 

 结束语


1. 关于JavaScript

JavaScript是目前所有主流浏览器上唯一支持的脚本语言,这也是早期JavaScript的唯一用途。Node.js的出现,让服务端应用也可以基于 JavaScript进行编写。

1.1 JavaScript 的历史 

JavaScript 最初被称为 LiveScript,由 Netscape(Netscape Communications Corporation,网景通信公司)公司的布兰登·艾奇(Brendan Eich)在 1995 年开发。在 Netscape 与 Sun(一家互联网公司,全称为“Sun Microsystems”,现已被甲骨文公司收购)合作之后将其更名为了 JavaScript。

之所以将 LiveScript 更名为 JavaScript,是因为 JavaScript 是受 Java 的启发而设计的,因此在语法上它们有很多相似之处 ,JavaScript 中的许多命名规范也都借鉴自 Java,还有一个原因就是为了营销,蹭 Java 的热度。

同一时期,微软和 Nombas(一家名为 Nombas 的公司)也分别开发了 JScript 和 ScriptEase 两种脚本语言,与 JavaScript 形成了三足鼎立之势。它们之间没有统一的标准,不能互用。为了解决这一问题,1997 年,在 ECMA(欧洲计算机制造商协会)的协调下,Netscape、Sun、微软、Borland(一家软件公司)组成了工作组,并以 JavaScript 为基础制定了 ECMA-262 标准(ECMAScript)。

第二年,ISO/IEC(国际标准化组织及国际电工委员会)也采用了 ECMAScript 作为标准(即 ISO/IEC-16262)。

1.2 如何运行 JavaScript 

作为一种脚本语言,JavaScript 代码不能独立运行,通常情况下我们需要借助浏览器来运行 JavaScript 代码,所有 Web 浏览器都支持 JavaScript。

除了可以在浏览器中执行外,也可以在服务端或者搭载了 JavaScript 引擎的设备中执行 JavaScript 代码,浏览器之所以能够运行 JavaScript 代码就是因为浏览器中都嵌入了 JavaScript 引擎,常见的 JavaScript 引擎有:

  • V8:Chrome 和 Opera 中的 JavaScript 引擎;
  • SpiderMonkey:Firefox 中的 JavaScript 引擎;
  • Chakra:IE 中的 JavaScript 引擎;
  • ChakraCore:Microsoft Edge 中的 JavaScript 引擎;
  • SquirrelFish:Safari 中的 JavaScript 引擎。

1.3 JavaScript 的特点 

JavaScript 具有以下特点:

1) 解释型脚本语言

JavaScript 是一种解释型脚本语言,与 C、C++ 等语言需要先编译再运行不同,使用 JavaScript 编写的代码不需要编译,可以直接运行。

2) 面向对象

JavaScript 是一种面向对象语言,使用 JavaScript 不仅可以创建对象,也能操作使用已有的对象。

3) 弱类型

JavaScript 是一种弱类型的编程语言,对使用的数据类型没有严格的要求,例如您可以将一个变量初始化为任意类型,也可以随时改变这个变量的类型。

4) 动态性

JavaScript 是一种采用事件驱动的脚本语言,它不需要借助 Web 服务器就可以对用户的输入做出响应,例如我们在访问一个网页时,通过鼠标在网页中进行点击或滚动窗口时,通过 JavaScript 可以直接对这些事件做出响应。

5) 跨平台

JavaScript 不依赖操作系统,在浏览器中就可以运行。因此一个 JavaScript 脚本在编写完成后可以在任意系统上运行,只需要系统上的浏览器支持 JavaScript 即可

2. 关于Node.js

Node.js自2009年发布,使用Google Chrome浏览器的V8引擎,采用事件驱动,性能优异。同时还提供了很多系统级API,如文件操作、网络编程等。

2.1 Node.js简介 

JavaScript 诞生于 1995 年,几乎是和互联网同时出现;Node.js 诞生于 2009 年,比 JavaScript 晚了 15 年左右。

在 Node.js 之前,JavaScript 只能运行在浏览器中,作为网页脚本使用,为网页添加一些特效,或者和服务器进行通信。有了 Node.js 以后,JavaScript 就可以脱离浏览器,像其它编程语言一样直接在计算机上使用,想干什么就干什么,再也不受浏览器的限制了。

Node.js 不是一门新的编程语言,也不是一个 JavaScript 框架,它是一套 JavaScript 运行环境,用来支持 JavaScript 代码的执行。用编程术语来讲,Node.js 是一个 JavaScript 运行时(Runtime)。

现在的 JavaScript 除了用于 Web 前端编程(网页编程),还能干很多事情,比如:

  • 开发网站后台,这原本是 PHP、Java、Python、Ruby 等编程语言擅长的;
  • 开发 GUI 程序,也就是我们常说的带界面的电脑软件,比如 QQ、360、迅雷等;
  • 手机 APP,包括 Android APP、iOS APP;
  • CLI 工具,也就是不带界面的命令行程序。

2.2 Node.js 的组成 

Node.js 运行时主要由 V8 引擎、标准库和本地模块组成,尤其是本地模块的多少,从底层决定了 Node.js 功能的强弱。

1) V8 引擎 

V8 引擎就是 JavaScript 解释器,它负责解析和执行 JavaScript 代码。

V8 引擎借鉴了 Java 虚拟机和 C++ 编译器的众多技术,它将 JavaScript 代码直接编译成原生机器码,并且使用了缓存机制来提高性能,这使得 JavaScript 的运行速度可以媲美二进制程序。

2) 本地模块 

Node.js 集成了众多高性能的开源库,它们使用 C/C++ 语言实现,比如:

模块 说明
libuv 一个跨平台的、基于事件驱动的异步 I/O 库。但是 libuv 不仅限于 I/O,它还提供了进程管理、线程池、信号处理、定时器等其它功能。

Linux 中一切皆文件,这里的 I/O 不仅仅包括文件读写,还包括数据库读写、网络通信(socket)等。
nmp Node.js 包管理器,可以下载包、安装包、卸载包、更新包、上传包等。
http_parser 一款由C语言编写的轻量级 HTTP 解析器,用以支持 Web 应用开发。
zlib 工业级的数据压缩/解压模块,Nodejs 借助 zlib 来创建同步、异步或者流式的压缩/解压接口。
OpenSSL 该模块提供了经过严密测试的许多加密/解密功能,现代 Web 依赖这些功能来实现安全性,比如 SSL 协议和 https 协议。
c-ares 异步 DNS 查询和解析库。

Node.js 直接在计算机上运行 JavaScript 代码,并且要赋予 JavaScript 强大的能力,所以它的本地模块和浏览器中的运行时有很多大区别,甚至说几乎没有什么关联。Node.js 几乎完全抛弃了浏览器,自己从头构建了一套全新的 JavaScript 运行时。

3) 标准库 

本地模块使用 C/C++ 编写,而 Node.js 面向 JavaScript 开发人员,所以必须要封装本地模块的 C/C++ 接口,提供一套优雅的 JavaScript 接口给开发人员,并且要保持接口在不同平台(操作系统)上的一致性。

这套 JavaScript 接口,就是 Node.js 标准库。标准库是否优雅和强大,决定了 Node.js 的易用性,直接影响 Node.js 的市场表现。

3. 用Docker搭建和使用Node.js环境 

Node.js拥有3种官方镜像:node:<version>、node:onbuild、node:slim。

其中常用的是带有版本标签的,以及带有onbuild标签的node镜像。
首先,在Node.js项目中新建一个Dockerfile:
FROM node:4-onbuild
EXPOSE 8888

然后,新建server.js文件,内容如下:

'use strict';
var connect = require('connect');
var serveStatic = require('serve-static');
var app = connect();
app.use('/', serveStatic('.', {'index': ['index.html']}));
app.listen(8080);
console.log('MyApp is ready at http://localhost:8080');

之后,通过npm init命令来新建node项目所必须的package.json文件

$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help json` for definitive documentation on these fields
and exactly what they do.
Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
name: (node) node
version: (1.0.0)
description: node-sample
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /Users/faxi/Docker/js/node/package.json:
{
    "name": "node",
    "version": "1.0.0",
    "description": "node-sample",
    "main": "index.js",
    "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
    },
    "author": "",
    "license": "ISC"
}
Is this ok? (yes) yes

下面使用docker build指令构建node镜像:

$ docker build -t node-image .

最后,创建并运行node容器:

$ docker run -it -P node-image
npm info it worked if it ends with ok
npm info using [email protected]
npm info using [email protected]
npm info prestart [email protected]
npm info start [email protected]
> [email protected] start /usr/src/app
> node server.js
MyApp is ready at http://localhost:8080
此时可以使用浏览器查看到MyApp应用的服务页面。
首先,使用docker ps指令查看端口绑定情况:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7b6f666d4808 node-image "npm start" xxxago Up xx 0.0.0.0:32771->8888/tcp node-container
如果只需要运行单个node脚本的容器,则无需通过Dockerfile构建镜像,可以使用以下指令:
$ docker run -it --rm --name my-running-script -v "$(pwd)":/usr/src/myapp -w /usr/src/myapp node:0.10 node your-daemon-or-script.js

也可以参考node官方提供的最佳实践:

https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md

 结束语

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_62294245/article/details/127294204

智能推荐

Android 带边框的圆形头像_安卓开发 原型头像带边框-程序员宅基地

文章浏览阅读3.3k次。1.自定义的圆形头像控件 CircleImageView extends ImageView:package ylj.view.circleimageview;import ylj.main.R;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Bit_安卓开发 原型头像带边框

java DOM 对xml文件的操作【分别对节点、节点属性、节点内容增删改查】_java解析全景xml文件能找到对应节点并修改相应的属性值-程序员宅基地

文章浏览阅读1.1w次,点赞12次,收藏18次。最近研究xml文件 但是书上仅仅是解析 自己有点不满意 于是在“度娘谷哥”的帮助下搜集了一些有关于DOM操作xml文件的资料 并整理下来 也有0分的源码供大家下载DOM是W3C组织推广的一中操作xml文件的方法,也是java原生态操作xml文件的方法之一,DOM的优点就是操作xml文件简单,可以重复随便的增删改查,但是不足的是,在操作前需要把整个xml文件以树状图加载到内存中,这样的话会影响_java解析全景xml文件能找到对应节点并修改相应的属性值

PHP中关于正则的一些小笔记_安装composer unable to bind listening socket for add-程序员宅基地

文章浏览阅读152次。正则是很多程序员入门最头疼的,我之前也是在2011年之前,当时看着正则完全就是蒙的,于是写正则这样的任务全部扔给了浪浪来做...事过这么多年,正则越用越顺手了于是简单的记录一下常用的前言1.界定符2.原子3.元字符4.修正符界定符界定符正如其名,就是定一个边界,边界已内的就是正则表达示。必须成对出现,有开始就有结束。不能用a-zA-Z0-9\举些粟子_安装composer unable to bind listening socket for address

vue3 ref 和reactive的区别_ref和reactive-程序员宅基地

文章浏览阅读2.7w次,点赞8次,收藏34次。文章目录RefreactiveRefref数据响应式监听,和react-hook好像差不多。ref 函数传入一个值作为参数,返回一个基于该值的响应式Ref对象,该对象中的值一旦被改变和访问,都会被跟踪到,就像我们改写后的示例代码一样,通过修改 count.value 的值,可以触发模板的重新渲染,显示最新的值<template> <h1>{{name}}</h1> <h1>{{age}}</h1> <button _ref和reactive

3K/4K 双USB Type-C接口盲插便携显示器解决方案_4k数据线和2ktypec-程序员宅基地

文章浏览阅读362次。近年来随着USB Type-C接口的流行和普及,USB Type-C接口在智能手机和笔记本电脑等设备上几乎成为了标配。越来越多的便携显示器采用了USB TYPE-C接口来支持手机和笔记本电脑的扩展投屏。现在分享一种3K/4K 双USB Type-C接口盲插便携显示器解决方案,LDR6282B。本方案适用于双USB Type-C接口的显示器和转接器项目。其中两个USB Type-C接口在功能上是对等的,它们既可以接适配器,也可以接投屏设备,但同一时刻,系统只能接一个适配器和一个投屏设备,不考虑同时接两个适配_4k数据线和2ktypec

ssh免密登录_ssh id_rsa.pub-程序员宅基地

文章浏览阅读902次。如果A机器到B机器需要免密登录,以下流程1.A机器执行ssh-keygen -t rsa生成公钥文件id_rsa.pubauthorized_keys:存放远程免密登录的公钥,主要通过这个文件记录多台机器的公钥(初始不存在该文件) ** id_rsa : 生成的私钥文件 ** id_rsa.pub : 生成的公钥文件** know_hosts : 已知的主机公钥清单*初次连接对端服务器,系统会提示你让你确认,如果是yes,那系统就会再know_hosts里追加这条访问记录,下次再次连接的时候就._ssh id_rsa.pub

随便推点

Android系统打不开,安卓手机打不开pdf文件怎么解决?-程序员宅基地

文章浏览阅读6.6k次。原标题:安卓手机打不开pdf文件怎么解决?Office应该大部分人都认识,普通办公人群基本每天都会使用到。我们在手机上经常会遇到这样一种情况!对方发过来一个格式为PDF的文件,但是手机上不管使用哪一款应用都无法正确的将其打开。无法打开的原因,无非就是你手机里缺乏阅读此类文件的应用。就好比你要打开压缩文件就需要压缩软件、打开视频就需要视频播放器一样。Pdf其实是一种非常高级的,可移植文档格式是一种电..._安卓手机打不开pdf文件

SDUT2021年全国天梯赛赛前个人专题强化赛---1(排序1)题解_r7-4 时间差 分数 25-程序员宅基地

文章浏览阅读232次。排序十大排序讲解传送门R7-1 魔法优惠券 (25 分)R7-2 抢红包 (25 分)R7-3 集合相似度 (25 分)R7-4 悄悄关注 (25 分)R7-5 月饼 (25 分)R7-6 单身狗 (25 分)R7-7 插入排序还是堆排序 (25 分)R7-8 插入排序还是归并排序 (25 分)十大排序讲解传送门十大排序讲解链接R7-1 魔法优惠券 (25 分)题目链接答案#include<bits/stdc++.h>#define ll long longconst int N_r7-4 时间差 分数 25

php 7.2yum 安装 详细步骤_php-7.2.25安装教程-程序员宅基地

文章浏览阅读408次。php7.2 源码安装gcc libxml2安装PHP7./configure 检查安装环境 --prefix=/home/work/php 自定义安装目录makemake install安装完成之后去/home/work/php 下面就可以看到解析后的文件此时php -v 在此目录下不起作用 ,应该用./bin/php -v设置PHP 全局执行配置环境..._php-7.2.25安装教程

中文自然语言处理--基于fasttext中文短文本分类_fasttext.train_supervised autotuneduration-程序员宅基地

文章浏览阅读1k次,点赞3次,收藏5次。FastText 是 facebook 开源的一个词向量与文本分类工具,模型简单,训练速度非常快。FastText 做的事情,就是把文档中所有词通过 lookup table 变成向量,取平均后直接用线性分类器得到分类结果。# 导入fasttext模块import fasttext# 以cooking.stackexchange.txt为训练集训练模型modelmodel = fasttext.train_supervised(input='./fasttext-data/data_train.t_fasttext.train_supervised autotuneduration

ubuntu在github下载慢的解决办法_github.global.ssl.fastly.net-程序员宅基地

文章浏览阅读1.7w次。亲测有效参考链接:https://blog.csdn.net/DlMmU/article/details/79562021_github.global.ssl.fastly.net

微信小程序自定义底部弹窗_微信小程序弹出框 底部弹出咋写showmodal 自定义-程序员宅基地

文章浏览阅读2w次,点赞19次,收藏74次。效果图HTML<view bindtap="clickme">点击我可以看到底部弹框的出现</view> <!--屏幕背景变暗的背景 --> <view class="commodity_screen" bindtap="hideModal" wx:if="{{showModalStatus}}"></view>..._微信小程序弹出框 底部弹出咋写showmodal 自定义

推荐文章

热门文章

相关标签