將Node.js web app部署到docker中
阿新 • • 發佈:2018-12-26
一.建立一個簡單的Node.js app
1.1 新建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" } }
1.2 執行命令 npm install 來載入依賴包,如果npm的版本大於5, 同時會生成一個package-lock.json檔案(這個也要copy到docker中)
1.3 新建server.js檔案
'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}`);
此時,在瀏覽器中輸入 localhost:8080 則會看到字串’hello world’
二. 建立docker
2.1 新建檔案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" ]
FROM 定義我們建立的內容,carbon 是docker長期支援的一個node版本
WORKDIR 專案檔案在docker中的位置
COPY 複製專案檔案到docker中
RUN 執行的命令
EXPOSE docker暴露出的埠(用來和外部的埠做關聯)
CMD 執行專案的命令
2.2 新建檔案.dockerignore
node_modules
npm-debug.log
複製專案檔案到docker時,會忽略這些檔案
2.3 建立image-在Dockerfile 檔案所在的目錄下,執行命令
$ docker build -t <your username>/node-web-app .
-t 代表標籤tag,標籤能夠方便檢視和區分image
執行完後,應該時這樣的
$ docker images
# Example
REPOSITORY TAG ID CREATED
node carbon 1934b0b038d1 5 days ago
<your username>/node-web-app latest d64d3505b0d2 1 minute ago
2.4 執行image
$ docker run -p 49160:8080 -d <your username>/node-web-app
-d 標示讓專案在後臺執行
-p 制定對映的埠
檢視日誌
# 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
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