Docker快速部署主流腳本語言JavaScript的全過程

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

總結

到此這篇關於Docker快速部署主流腳本語言JavaScript的文章就介紹到這瞭,更多相關Docker快速部署JavaScript內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: