Docker快速部署主流腳本語(yǔ)言JavaScript的全過(guò)程
1. 關(guān)于JavaScript
JavaScript是目前所有主流瀏覽器上唯一支持的腳本語(yǔ)言,這也是早期JavaScript的唯一用途。Node.js的出現(xiàn),讓服務(wù)端應(yīng)用也可以基于 JavaScript進(jìn)行編寫(xiě)。
1.1 JavaScript 的歷史
JavaScript 最初被稱為 LiveScript,由 Netscape(Netscape Communications Corporation,網(wǎng)景通信公司)公司的布蘭登·艾奇(Brendan Eich)在 1995 年開(kāi)發(fā)。在 Netscape 與 Sun(一家互聯(lián)網(wǎng)公司,全稱為“Sun Microsystems”,現(xiàn)已被甲骨文公司收購(gòu))合作之后將其更名為了 JavaScript。
之所以將 LiveScript 更名為 JavaScript,是因?yàn)?JavaScript 是受 Java 的啟發(fā)而設(shè)計(jì)的,因此在語(yǔ)法上它們有很多相似之處 ,JavaScript 中的許多命名規(guī)范也都借鑒自 Java,還有一個(gè)原因就是為了營(yíng)銷(xiāo),蹭 Java 的熱度。
同一時(shí)期,微軟和 Nombas(一家名為 Nombas 的公司)也分別開(kāi)發(fā)了 JScript 和 ScriptEase 兩種腳本語(yǔ)言,與 JavaScript 形成了三足鼎立之勢(shì)。它們之間沒(méi)有統(tǒng)一的標(biāo)準(zhǔn),不能互用。為了解決這一問(wèn)題,1997 年,在 ECMA(歐洲計(jì)算機(jī)制造商協(xié)會(huì))的協(xié)調(diào)下,Netscape、Sun、微軟、Borland(一家軟件公司)組成了工作組,并以 JavaScript 為基礎(chǔ)制定了 ECMA-262 標(biāo)準(zhǔn)(ECMAScript)。
第二年,ISO/IEC(國(guó)際標(biāo)準(zhǔn)化組織及國(guó)際電工委員會(huì))也采用了 ECMAScript 作為標(biāo)準(zhǔn)(即 ISO/IEC-16262)。
1.2 如何運(yùn)行 JavaScript
作為一種腳本語(yǔ)言,JavaScript 代碼不能獨(dú)立運(yùn)行,通常情況下我們需要借助瀏覽器來(lái)運(yùn)行 JavaScript 代碼,所有 Web 瀏覽器都支持 JavaScript。
除了可以在瀏覽器中執(zhí)行外,也可以在服務(wù)端或者搭載了 JavaScript 引擎的設(shè)備中執(zhí)行 JavaScript 代碼,瀏覽器之所以能夠運(yùn)行 JavaScript 代碼就是因?yàn)闉g覽器中都嵌入了 JavaScript 引擎,常見(jiàn)的 JavaScript 引擎有:
- V8:Chrome 和 Opera 中的 JavaScript 引擎;
- SpiderMonkey:Firefox 中的 JavaScript 引擎;
- Chakra:IE 中的 JavaScript 引擎;
- ChakraCore:Microsoft Edge 中的 JavaScript 引擎;
- SquirrelFish:Safari 中的 JavaScript 引擎。
1.3 JavaScript 的特點(diǎn)
JavaScript 具有以下特點(diǎn):
1) 解釋型腳本語(yǔ)言
JavaScript 是一種解釋型腳本語(yǔ)言,與 C、C++ 等語(yǔ)言需要先編譯再運(yùn)行不同,使用 JavaScript 編寫(xiě)的代碼不需要編譯,可以直接運(yùn)行。
2) 面向?qū)ο?/p>
JavaScript 是一種面向?qū)ο笳Z(yǔ)言,使用 JavaScript 不僅可以創(chuàng)建對(duì)象,也能操作使用已有的對(duì)象。
3) 弱類(lèi)型
JavaScript 是一種弱類(lèi)型的編程語(yǔ)言,對(duì)使用的數(shù)據(jù)類(lèi)型沒(méi)有嚴(yán)格的要求,例如您可以將一個(gè)變量初始化為任意類(lèi)型,也可以隨時(shí)改變這個(gè)變量的類(lèi)型。
4) 動(dòng)態(tài)性
JavaScript 是一種采用事件驅(qū)動(dòng)的腳本語(yǔ)言,它不需要借助 Web 服務(wù)器就可以對(duì)用戶的輸入做出響應(yīng),例如我們?cè)谠L問(wèn)一個(gè)網(wǎng)頁(yè)時(shí),通過(guò)鼠標(biāo)在網(wǎng)頁(yè)中進(jìn)行點(diǎn)擊或滾動(dòng)窗口時(shí),通過(guò) JavaScript 可以直接對(duì)這些事件做出響應(yīng)。
5) 跨平臺(tái)
JavaScript 不依賴操作系統(tǒng),在瀏覽器中就可以運(yùn)行。因此一個(gè) JavaScript 腳本在編寫(xiě)完成后可以在任意系統(tǒng)上運(yùn)行,只需要系統(tǒng)上的瀏覽器支持 JavaScript 即可
2. 關(guān)于Node.js
Node.js自2009年發(fā)布,使用Google Chrome瀏覽器的V8引擎,采用事件驅(qū)動(dòng),性能優(yōu)異。同時(shí)還提供了很多系統(tǒng)級(jí)API,如文件操作、網(wǎng)絡(luò)編程等。
2.1 Node.js簡(jiǎn)介
JavaScript 誕生于 1995 年,幾乎是和互聯(lián)網(wǎng)同時(shí)出現(xiàn);Node.js 誕生于 2009 年,比 JavaScript 晚了 15 年左右。
在 Node.js 之前,JavaScript 只能運(yùn)行在瀏覽器中,作為網(wǎng)頁(yè)腳本使用,為網(wǎng)頁(yè)添加一些特效,或者和服務(wù)器進(jìn)行通信。有了 Node.js 以后,JavaScript 就可以脫離瀏覽器,像其它編程語(yǔ)言一樣直接在計(jì)算機(jī)上使用,想干什么就干什么,再也不受瀏覽器的限制了。
Node.js 不是一門(mén)新的編程語(yǔ)言,也不是一個(gè) JavaScript 框架,它是一套 JavaScript 運(yùn)行環(huán)境,用來(lái)支持 JavaScript 代碼的執(zhí)行。用編程術(shù)語(yǔ)來(lái)講,Node.js 是一個(gè) JavaScript 運(yùn)行時(shí)(Runtime)。
現(xiàn)在的 JavaScript 除了用于 Web 前端編程(網(wǎng)頁(yè)編程),還能干很多事情,比如:
- 開(kāi)發(fā)網(wǎng)站后臺(tái),這原本是 PHP、Java、Python、Ruby 等編程語(yǔ)言擅長(zhǎng)的;
- 開(kāi)發(fā) GUI 程序,也就是我們常說(shuō)的帶界面的電腦軟件,比如 QQ、360、迅雷等;
- 手機(jī) APP,包括 Android APP、iOS APP;
- CLI 工具,也就是不帶界面的命令行程序。
2.2 Node.js 的組成
Node.js 運(yùn)行時(shí)主要由 V8 引擎、標(biāo)準(zhǔn)庫(kù)和本地模塊組成,尤其是本地模塊的多少,從底層決定了 Node.js 功能的強(qiáng)弱。
1) V8 引擎
V8 引擎就是 JavaScript 解釋器,它負(fù)責(zé)解析和執(zhí)行 JavaScript 代碼。
V8 引擎借鑒了 Java 虛擬機(jī)和 C++ 編譯器的眾多技術(shù),它將 JavaScript 代碼直接編譯成原生機(jī)器碼,并且使用了緩存機(jī)制來(lái)提高性能,這使得 JavaScript 的運(yùn)行速度可以媲美二進(jìn)制程序。
2) 本地模塊
Node.js 集成了眾多高性能的開(kāi)源庫(kù),它們使用 C/C++ 語(yǔ)言實(shí)現(xiàn),比如:
| 模塊 | 說(shuō)明 |
|---|---|
| libuv | 一個(gè)跨平臺(tái)的、基于事件驅(qū)動(dòng)的異步 I/O 庫(kù)。但是 libuv 不僅限于 I/O,它還提供了進(jìn)程管理、線程池、信號(hào)處理、定時(shí)器等其它功能。 Linux 中一切皆文件,這里的 I/O 不僅僅包括文件讀寫(xiě),還包括數(shù)據(jù)庫(kù)讀寫(xiě)、網(wǎng)絡(luò)通信(socket)等。 |
| nmp | Node.js 包管理器,可以下載包、安裝包、卸載包、更新包、上傳包等。 |
| http_parser | 一款由C語(yǔ)言編寫(xiě)的輕量級(jí) HTTP 解析器,用以支持 Web 應(yīng)用開(kāi)發(fā)。 |
| zlib | 工業(yè)級(jí)的數(shù)據(jù)壓縮/解壓模塊,Nodejs 借助 zlib 來(lái)創(chuàng)建同步、異步或者流式的壓縮/解壓接口。 |
| OpenSSL | 該模塊提供了經(jīng)過(guò)嚴(yán)密測(cè)試的許多加密/解密功能,現(xiàn)代 Web 依賴這些功能來(lái)實(shí)現(xiàn)安全性,比如 SSL 協(xié)議和 https 協(xié)議。 |
| c-ares | 異步 DNS 查詢和解析庫(kù)。 |
Node.js 直接在計(jì)算機(jī)上運(yùn)行 JavaScript 代碼,并且要賦予 JavaScript 強(qiáng)大的能力,所以它的本地模塊和瀏覽器中的運(yùn)行時(shí)有很多大區(qū)別,甚至說(shuō)幾乎沒(méi)有什么關(guān)聯(lián)。Node.js 幾乎完全拋棄了瀏覽器,自己從頭構(gòu)建了一套全新的 JavaScript 運(yùn)行時(shí)。
3) 標(biāo)準(zhǔn)庫(kù)
本地模塊使用 C/C++ 編寫(xiě),而 Node.js 面向 JavaScript 開(kāi)發(fā)人員,所以必須要封裝本地模塊的 C/C++ 接口,提供一套優(yōu)雅的 JavaScript 接口給開(kāi)發(fā)人員,并且要保持接口在不同平臺(tái)(操作系統(tǒng))上的一致性。
這套 JavaScript 接口,就是 Node.js 標(biāo)準(zhǔn)庫(kù)。標(biāo)準(zhǔn)庫(kù)是否優(yōu)雅和強(qiáng)大,決定了 Node.js 的易用性,直接影響 Node.js 的市場(chǎng)表現(xiàn)。
3. 用Docker搭建和使用Node.js環(huán)境
Node.js擁有3種官方鏡像:node:<version>、node:onbuild、node:slim。
其中常用的是帶有版本標(biāo)簽的,以及帶有onbuild標(biāo)簽的node鏡像。 首先,在Node.js項(xiàng)目中新建一個(gè)Dockerfile:
FROM node:4-onbuild EXPOSE 8888
然后,新建server.js文件,內(nèi)容如下:
'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');之后,通過(guò)npm init命令來(lái)新建node項(xiàng)目所必須的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指令構(gòu)建node鏡像:
$ docker build -t node-image .
最后,創(chuàng)建并運(yùn)行node容器:
$ docker run -it -P node-image npm info it worked if it ends with ok npm info using npm@2.15.1 npm info using node@v4.4.3 npm info prestart node@1.0.0 npm info start node@1.0.0 > node@1.0.0 start /usr/src/app > node server.js MyApp is ready at http://localhost:8080
此時(shí)可以使用瀏覽器查看到MyApp應(yīng)用的服務(wù)頁(yè)面。
首先,使用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
如果只需要運(yùn)行單個(gè)node腳本的容器,則無(wú)需通過(guò)Dockerfile構(gòu)建鏡像,可以使用以下指令:
$ 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官方提供的最佳實(shí)踐:
https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md
總結(jié)
到此這篇關(guān)于Docker快速部署主流腳本語(yǔ)言JavaScript的文章就介紹到這了,更多相關(guān)Docker快速部署JavaScript內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker安裝和基礎(chǔ)用法 Docker入門(mén)教程第二篇
這篇文章主要介紹了Docker安裝和基礎(chǔ)用法,Docker入門(mén)教程第二篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Docker-compose的安裝和設(shè)定詳細(xì)步驟
這篇文章主要介紹了Docker-compose的安裝和設(shè)定的相關(guān)資料,需要的朋友可以參考下2017-03-03
docker-compose部署etcd集群的實(shí)現(xiàn)步驟
本文主要介紹了docker-compose部署etcd集群的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
基于Harbor構(gòu)建docker私有倉(cāng)庫(kù)的方法
這篇文章主要介紹了Harbor構(gòu)建docker私有倉(cāng)庫(kù)的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
使用Docker容器運(yùn)行Mysql實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了關(guān)于使用Docker容器運(yùn)行Mysql的相關(guān)資料,助大家更好的理解和學(xué)習(xí)使用docker,感興趣的朋友可以了解下,需要的朋友可以參考下2023-09-09
docker rm -f 容器id 無(wú)效的問(wèn)題解決
當(dāng)遇到“Error response from daemon: cannot stop container: d208b8055fd0: permission denied”錯(cuò)誤,表示缺乏停止Docker容器的權(quán)限,本文就來(lái)介紹一下如何解決,感興趣的可以了解一下2024-09-09
為運(yùn)行中的docker容器設(shè)置時(shí)區(qū)
本文主要介紹了為運(yùn)行中的docker容器設(shè)置時(shí)區(qū),主要介紹了2種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
Docker容器化部署嘗試——多容器通信(node+mongoDB+nginx)
這篇文章主要介紹了Docker容器化部署嘗試——多容器通信(node+mongoDB+nginx),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12

