在 Container 中執行 Basic Node.js 應用程式
我要討論的示例假設你有一個適用於你的系統的 Docker 安裝,並且基本瞭解如何使用 Node.js。如果你瞭解必須如何使用 Docker,那麼很明顯 Node.js 框架不需要安裝在你的系統上,而是我們將使用來自 Docker 的 latest 版本的 node 映像。因此,如果需要,你可以使用命令 docker pull node 預先下載影象。 (該命令從 docker 自動 pulls 最新版本的 node 影象。)
-
繼續建立一個所有工作應用程式檔案所在的目錄。在此目錄中建立
package.json檔案,該檔案描述你的應用程式以及依賴項。你的package.json檔案應如下所示:{ "name": "docker_web_app", "version": "1.0.0", "description": "Node.js on Docker", "author": "First Last <first.last@example.com>", "main": "server.js", "scripts": { "start": "node server.js" }, "dependencies": { "express": "^4.13.3" } } -
如果我們需要使用 Node.js,我們通常會建立一個定義 Web 應用程式的
server檔案。在這種情況下,我們使用Express.js框架(版本4.13.3以上)。一個基本的server.js檔案看起來像這樣:var express = require('express'); var PORT = 8080; var app = express(); app.get('/', function (req, res) { res.send('Hello world\n'); }); app.listen(PORT); console.log('Running on http://localhost:' + PORT); -
對於那些熟悉 Docker 的人來說,你會遇到一個問題 12。
Dockerfile是一個文字檔案,其中包含構建為你的應用程式定製的自定義影象所需的所有命令。
在當前目錄中建立名為 Dockerfile 的空文字檔案。在 Windows 中建立一個的方法很簡單。在 Linux 中,你可能希望在包含應用程式所需的所有檔案的目錄中執行 touch Dockerfile。使用任何文字編輯器開啟 Dockerfile 並新增以下行:
FROM node:latest
RUN mkdir -p /usr/src/my_first_app
WORKDIR /usr/src/my_first_app
COPY package.json /usr/src/my_first_app/
RUN npm install
COPY . /usr/src/my_first_app
EXPOSE 8080
-
FROM node:latest指示 Docker 守護程序我們想要構建什麼影象。在這種情況下,我們使用 Docker Hub 提供的官方 Docker 影象node的latest版本。 -
在此影象中,我們繼續建立一個包含所有必需檔案的工作目錄,並指示守護程式將此目錄設定為我們的應用程式所需的工作目錄。為此,我們補充說
RUN mkdir -p /usr/src/my_first_app WORKDIR /usr/src/my_first_app -
然後,我們首先將
package.json檔案(指定包含依賴項的應用程式資訊)移動到影象中的/usr/src/my_first_app工作目錄,然後繼續安裝應用程式依賴項。我們這樣做COPY package.json /usr/src/my_first_app/ RUN npm install -
然後我們輸入
COPY . /usr/src/my_first_app將所有應用程式檔案和原始碼新增到映像中的工作目錄中。 -
然後我們使用
EXPOSE指令指示守護程序使得生成的容器的埠8080可見(通過容器到主機的對映),因為應用程式繫結到埠8080。 -
在最後一步中,我們通過執行基本的
npm start命令指示守護程序在映像內執行命令node server.js。我們使用CMD指令,它將命令作為引數。CMD [ "npm", "start" ]
-
然後,我們在與
Dockerfile相同的目錄中建立一個.dockerignore檔案,以防止我們的 Node.js 系統安裝使用的node_modules和日誌副本被複制到 Docker 映象上。.dockerignore檔案必須包含以下內容:node_modules npm-debug.log -
建立你的形象
導航到包含 Dockerfile 的目錄,然後執行以下命令來構建 Docker 映象。-t 標誌允許你標記影象,以便以後使用 docker images 命令更容易找到:
$ docker build -t <your username>/node-web-app .
你的影象現在將由 Docker 列出。使用以下命令檢視影象:
$ docker images
REPOSITORY TAG ID CREATED
node latest 539c0211cd76 10 minutes ago
<your username>/node-web-app latest d64d3505b0d2 1 minute ago
-
執行影象
我們現在可以使用應用程式內容,node 基本影象和 Dockerfile 執行我們剛剛建立的影象。我們現在繼續執行我們新建立的 <your username>/node-web-app 影象。將 -d 開關提供給 docker run 命令以分離模式執行容器,以便容器在後臺執行。-p 標誌將公共埠重定向到容器內的私有埠。使用此命令執行先前構建的映像:
$ docker run -p 49160:8080 -d <your username>/node-web-app
-
在終端上執行
docker ps列印應用程式的輸出。輸出應該看起來像這樣。CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7b701693b294 <your username>/node-web-app "npm start" 20 minutes ago Up 48 seconds 0.0.0.0:49160->8080/tcp loving_goldstine
輸入 docker logs <CONTAINER ID> 獲取應用程式輸出。在這種情況下,它是 docker logs 7b701693b294。
輸出:Running on http://localhost:8080
- 從
docker ps輸出,獲得的埠對映是0.0.0.0:49160->8080/tcp。因此,Docker 將容器內的8080埠對映到主機上的埠 49160。在瀏覽器中,我們現在可以輸入localhost:49160。
我們也可以使用 curl 呼叫我們的應用程式:
$ curl -i localhost:49160
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 12
Date: Sun, 08 Jan 2017 14:00:12 GMT
Connection: keep-alive
Hello world