Nodejs入門指南(4)
在Docker中部署使用Node.js應用
這個例子的目標是向你展示如何將一個Node.js應用程式放到一個Docker容器中。本指南適用於開發,不適用於生產部署。本指南還假定您有一個可行的Docker安裝,並且對Node.js應用程式的結構有了基本的瞭解。
在本指南的第一部分中,我們將在Node.js中建立一個簡單的Web應用程式,然後我們將為該應用程式構建一個Docker映象,最後我們將該映象作為容器執行。
Docker允許您將具有所有依賴項的應用程式打包到一個稱為容器的標準化單元中,用於軟體開發。容器是Linux作業系統的一個簡化版本。影象是您載入到容器中的軟體。
建立Node.js應用程式
首先,建立一個可以存放所有檔案的新目錄。package.json
描述您的應用程式及其依賴關係的檔案:
{
"name": "docker_web_app",
"version": "1.0.0",
"description": "Node.js on Docker",
"author": "First Last <[email protected]>",
"main": "server.js",
"scripts": {
"start": "node server.js"
},
"dependencies": {
"express": "^4.16.1"
}
}
用你的新package.json
檔案,執行npm install
。如果您使用的是npm
版本5或更高版本,則會生成一個package-lock.json
將被複制到Docker映像的檔案。
然後,server.js
使用Express.js框架建立一個定義Web應用程式的檔案 :
'use strict';
const express = require('express');
// Constants
const PORT = 8080;
const HOST = '0.0.0.0';
// App
const app = express();
app.get('/', (req, res) => {
res.send('Hello world\n');
});
app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);
在接下來的步驟中,我們將瞭解如何使用官方Docker映象在Docker容器內執行此應用程式。首先,您需要構建應用程式的Docker映象。
建立一個Dockerfile
建立一個名為的空檔案Dockerfile
:
touch Dockerfile
Dockerfile
在你最喜歡的文字編輯器中開啟
我們需要做的第一件事就是根據我們想要構建的影象來定義。在這裡,我們將使用最新的LTS(長期支援)版本carbon
的node
從可用泊塢樞紐:
FROM node:carbon
接下來我們建立一個目錄來儲存影象中的應用程式程式碼,這將成為您的應用程式的工作目錄:
# Create app directory
WORKDIR /usr/src/app
該影象隨附了Node.js和NPM,因此我們需要做的下一件事是使用npm
二進位制安裝應用程式依賴項。請注意,如果您使用的是npm
版本4或更早的版本,package-lock.json
則不會生成檔案。
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available ([email protected]+)
COPY package*.json ./
RUN npm install
# If you are building your code for production
# RUN npm install --only=production
請注意,我們只複製package.json
檔案,而不是複製整個工作目錄。這使我們可以利用快取的Docker層。bitJudo 在這裡有一個很好的解釋 。
要將應用程式的原始碼捆綁到Docker映象中,請使用以下COPY
指令:
# Bundle app source
COPY . .
您的應用繫結到埠,8080
因此您將使用該EXPOSE
指令將其對映到docker
守護程序:
EXPOSE 8080
最後但並非最不重要的是,定義命令來執行您的應用程式,使用CMD
它定義您的執行時。在這裡,我們將使用npm start
執行 node server.js
以啟動伺服器的基本資訊:
CMD [ "npm", "start" ]
你Dockerfile
現在應該看起來像這樣:
FROM node:carbon
# Create app directory
WORKDIR /usr/src/app
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available ([email protected]+)
COPY package*.json ./
RUN npm install
# If you are building your code for production
# RUN npm install --only=production
# Bundle app source
COPY . .
EXPOSE 8080
CMD [ "npm", "start" ]
.dockerignore檔案
.dockerignore
在Dockerfile
以下內容的同一目錄中建立一個檔案:
node_modules
npm-debug.log
這將阻止您的本地模組和除錯日誌被複制到您的Docker映像上,並可能覆蓋映像中安裝的模組。
建立你的形象
轉到具有您的目錄Dockerfile
並執行以下命令來構建Docker映象。該-t
標誌可讓您標記影象,以便稍後使用該docker images
命令更容易找到:
$ docker build -t <your username>/node-web-app .
Docker會列出您的圖片:
$ docker images
# Example
REPOSITORY TAG ID CREATED
node carbon 1934b0b038d1 5 days ago
<your username>/node-web-app latest d64d3505b0d2 1 minute ago
執行影象
與執行影象-d
執行在分離模式的容器,留在後臺執行的容器。該-p
標誌將公共埠重定向到容器內的專用埠。執行您之前構建的影象:
$ docker run -p 49160:8080 -d <your username>/node-web-app
列印您的應用程式的輸出:
# Get container ID
$ docker ps
# Print app output
$ docker logs <container id>
# Example
Running on http://localhost:8080
如果你需要進入容器,你可以使用下面的exec
命令:
# Enter the container
$ docker exec -it <container id> /bin/bash
測試
要測試您的應用,請獲取Docker對映的應用的埠:
$ docker ps
# Example
ID IMAGE COMMAND ... PORTS
ecce33b30ebf <your username>/node-web-app:latest npm start ... 49160->8080
在上面的示例中,Docker 8080
將容器內的埠對映到49160
您計算機上的埠。
現在你可以使用你的應用程式curl
(如果需要,可以通過以下方式安裝sudo apt-get install curl
)
$ curl -i localhost:49160
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 12
ETag: W/"c-M6tWOb/Y57lesdjQuHeB1P/qTV0"
Date: Mon, 13 Nov 2017 20:53:59 GMT
Connection: keep-alive
Hello world
我們希望本教程能幫助您在Docker上執行一個簡單的Node.js應用程式。
您可以在以下位置找到更多關於Docker和Node.js的資訊:
相關推薦
Nodejs入門指南(4)
在Docker中部署使用Node.js應用這個例子的目標是向你展示如何將一個Node.js應用程式放到一個Docker容器中。本指南適用於開發,不適用於生產部署。本指南還假定您有一個可行的Docker安
Asp.Net MVC4入門指南(4):新增一個模型
在本節中,您將新增一些類,這些類用於管理資料庫中的電影。這些類是ASP.NET MVC 應用程式中的"模型(Model)"。 您將使用.NET Framework 資料訪問技術Entity Framework,來定義和使用這些模型類。Entity Framework(通常稱為 EF) 是支援程式碼優先的開發
backbone入門系列(4)集合
src 單獨 -1 lec 指定 one js代碼 bsp 技術 collection就是一堆model的集合,這個集合就是個舞臺,可以放一個人說單口相聲,也可以對口,也可以群口,,, 在前文,也就是入門系列3的基礎上,添加js代碼 var noteCollection=B
Android官方技術文檔翻譯——Gradle 插件用戶指南(4)
庫項目 包含 doc 努力 時也 外部 插件 http name 近期趕項目,白天基本沒時間,僅僅有晚上在家的時候才幹看一看。昨天晚上僅僅翻譯完了第四章,今天就僅僅發第四章吧。 本文譯自Android官方技術文檔《Gradle Plugin User Guide》,
Maven入門指南(二)
deploy ... web服務器 快速 repos 必須 轉載 關於 net 轉載自並發編程網 – ifeve.com本文鏈接地址: Maven入門指南(二) Maven目錄結構 Maven有一個標準的目錄結構。如果你在項目中遵循Maven的目錄結構,就無需在pom文件中
貓都能學會的Unity3D Shader入門指南(一)
val int 系列 opengl 概念 想要 ble 結果 shade 動機 自己使用Unity3D也有一段時間了,但是很多時候是流於表面,更多地是把這個引擎簡單地用作腳本控制,而對更深入一些的層次幾乎沒有了解。雖然說Unity引擎設計的初衷就是創建簡單的不需要開發者操
Nodejs學習筆記(4) 文件操作 fs 及 express 上傳
.cn 緩存 單元 填充 cep page imm idt mimetype 目錄 參考資料 1. fs 模塊 1.1 讀取文件fs.readFile 1.2 寫入文件fs.writeFile 1.3 獲取文件信息fs.stat 1.4 刪除文件fs.unlink 1.5
NodeJS簡易部落格系統(六)NodeJS入門學習(下)
一、網路程式設計 1、小試牛刀 NodeJS本來的用途是編寫高效能Web伺服器。首先在這裡重複一下官方文件裡的例子,使用NodeJS內建的http模組簡單實現一個HTTP伺服器。 var http = require('http'); http.createSe
NodeJS簡易部落格系統(五)NodeJS入門學習(上)
一、模組 在NodeJS中,一般將程式碼合理拆分到不同的JS檔案中,每一個檔案就是一個模組,而檔案路徑就是模組名。在編寫每個模組時,都有require、exports、module三個預先定義好的變數可供使用。 1、require require函式用於在當前模組中載入和使用別的模組,傳
JProfiler入門教程(4)--JProfiler遠端監控Tomcat效能
很多時候我們的應用都是跑在linux,而jProfiler是安裝在windows上面,這時候我們就需要通過配置遠端連線對伺服器上面的應用進行監控。 環境:Centos Linux 7.3、tomcat 8.0、jdk1.8.0_181、jprofiler_windows-x64_10
CCNA學習指南(4)iOS與記憶體
(1)Cisco iOS Cisco iOS軟體是思科裝置的系統軟體。 Cisco iOS軟體提供的服務通常使用CLI進行訪問。通過控制檯連線、調變解調器連線(路由器?)Telnet或secure shell(SSH)會話訪問CLI。 無論採用哪種連線方法,對Cisco iOS CLI的訪問一般稱為exe
CCNA學習指南(4)iOS與內存
erase mark 操作 文件服務 包括 如果 ssh exec 管理員 (1)Cisco iOS Cisco iOS軟件是思科設備的系統軟件。 Cisco iOS軟件提供的服務通常使用CLI進行訪問。通過控制臺連接、調制解調器連接(路由器?)Telnet或secure
vue入門總結(4)
1.路由的模式: 前文中我們建立VueRouter例項時用了mode:history的引數,這個值的意思是使用history模式,這種模式充分利用了history.pushState API來完成URL的跳轉而無須重新載入頁面。 如果不使用history模式,當訪問home的時候地址就會變為
arcgis jsapi介面入門系列(4):用程式碼在地圖畫點線面
PS:用程式碼畫點這樣寫是為了跟後面的用滑鼠畫點線面區分出來 畫點 drawPointGraphic: function () { //點有多種樣式:一般的點,顯示文字,顯示圖片 //一般的點
Python入門學習(4)
刪除包含特定值得所有列表元素 pets = ['cat','dog','goldfish','cat','rabit','cat'] print(pets) while 'cat' in pets: pets.remove('cat') print(pets)
Drools規則引擎入門指南(二)
本篇部落格主要講解Drools常用的屬性以及函式 屬性 首先我們在resources\rules資料夾下建立一個Property.drl,還有一個DroolsApplicationPropertyTests 1. salience優先順序 salience 屬性的值預設為0,它的值越大執行的
Spring+SpringMVC+MyBatis入門實踐(4)Spring + MyBatis整合
本過程基於Mybatis入門進行, 所以在開始之前希望你建庫,表結構,Mybatis的常用用法都已經熟練了。 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http
CXF入門教程(4) -- 設定上下文連線屬性
我們可以使用 JAX-WS 上下文來自定義客戶端代理的屬性。特別地,上下文可以用來修改連線屬性以及通過協議頭髮送資料。例如,我們可以用上下文新增一個SOAP頭,請求訊息和響應訊息都可以新增。客戶端支援下列型別的上下文: Request context(請求上下文) - 在客戶端
機器學習之python入門指南(二)元組、集合、字典的使用
Python3中元組、集合、字典的使用 Python中元組的用法元組的建立與訪問 元組和列表類似,不同之處在於元組不能修改,元組使用小括號,列表使用方括號,注意元組中如果只包含以個元素需要在後面加,否則會被當作運算子使用 元組與字串類似,下標索引從0開始,可以進行擷取,取捨
Maven入門指南(一)
原文連結 譯文連結 譯者:nkcoder 校對:方騰飛 Maven介紹: Maven是一個強大的Java專案構建工具。當然,你也可以使用其它工具來構建專案,但由於Maven是用Java開發的,因此Maven被更多的用於Java專案中。 這篇教程的目的是幫助你理解Maven的工作機制。因此