此示例的目的是向你展現如何將Node.js應用程序放入Docker容器中,該指南旨在用於開發,而不用於生產部署,本指南還假設你有一個有效的Docker安裝,而且基本瞭解Node.js應用程序的結構。html
在本指南的第一部分中,咱們將在Node.js中建立一個簡單的Web應用程序,而後咱們將爲該應用程序構建一個Docker鏡像,最後咱們將該鏡像做爲容器運行。node
Docker容許你將具備全部依賴關係的應用程序打包到一個稱爲容器的標準化單元中,用於軟件開發,容器是Linux操做系統分離出的基礎版本,鏡像是你加載到容器中的軟件。git
首先,建立一個全部文件都將存在於其中的新目錄,在此目錄中,建立一個描述你的應用及其依賴項的package.json
文件:github
{ "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.16.1" } }
使用新的package.json
文件,運行npm install
,若是你使用的是npm版本5或更高版本,則會生成一個package-lock.json
文件,該文件將被複制到你的Docker鏡像中。web
而後,建立一個使用Express.js
框架定義Web應用程序的server.js
文件:docker
'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鏡像。express
建立一個名爲Dockerfile
的空文件:npm
touch Dockerfile
在你喜歡的文本編輯器中打開Dockerfile
。json
咱們須要作的第一件事是定義咱們想要構建的鏡像,在這裏,咱們將使用Docker Hub提供的最新LTS(長期支持)版本8
node
:segmentfault
FROM node:8
接下來,咱們建立一個目錄來保存鏡像中的應用程序代碼,這將是你的應用程序的工做目錄:
# 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 (npm@5+) 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:8 # 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 (npm@5+) 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" ]
在與Dockerfile
相同的目錄中建立一個.dockerignore
文件,其中包含如下內容:
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 8 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的更多信息: