在 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