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