在 Container 中執行 Basic Node.js 應用程式

我要討論的示例假設你有一個適用於你的系統的 Docker 安裝,並且基本瞭解如何使用 Node.js。如果你瞭解必須如何使用 Docker,那麼很明顯 Node.js 框架不需要安裝在你的系統上,而是我們將使用來自 Docker 的 latest 版本的 node 映像。因此,如果需要,你可以使用命令 docker pull node 預先下載影象。 (該命令從 docker 自動 pulls 最新版本的 node 影象。)

  1. 繼續建立一個所有工作應用程式檔案所在的目錄。在此目錄中建立 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"
       }
     }
    
  2. 如果我們需要使用 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);
    
  3. 對於那些熟悉 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 影象 nodelatest 版本。

  • 在此影象中,我們繼續建立一個包含所有必需檔案的工作目錄,並指示守護程式將此目錄設定為我們的應用程式所需的工作目錄。為此,我們補充說

      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" ] 
    
  1. 然後,我們在與 Dockerfile 相同的目錄中建立一個 .dockerignore 檔案,以防止我們的 Node.js 系統安裝使用的 node_modules 和日誌副本被複制到 Docker 映象上。.dockerignore 檔案必須包含以下內容:

     node_modules
     npm-debug.log
    
  2. 建立你的形象

導航到包含 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
  1. 執行影象

我們現在可以使用應用程式內容,node 基本影象和 Dockerfile 執行我們剛剛建立的影象。我們現在繼續執行我們新建立的 <your username>/node-web-app 影象。將 -d 開關提供給 docker run 命令以分離模式執行容器,以便容器在後臺執行。-p 標誌將公共埠重定向到容器內的私有埠。使用此命令執行先前構建的映像:

$ docker run -p 49160:8080 -d <your username>/node-web-app
  1. 在終端上執行 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

  1. 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