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