如果想要在 Docker 在跑 NodeJS 的應用,可以參考 NodeJS 官網上有一篇 「Dockerizing a Node.js web app」介紹,還蠻簡單易懂的,這邊稍微紀錄一下相關步驟。
{
"name": "docker_web_app",
"version": "1.0.0",
"description": "Node.js on Docker",
"author": "First Last ",
"main": "server.js",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "^4.13.3"
}
}
p.s. 這個部分之前官網上的文章漏掉了 scripts
的區塊,這裏我上了一個 patch,有用到的可以注意一下。
'use strict';
const express = require('express');
// Constants
const PORT = 8080;
// App
const app = express();
app.get('/', function (req, res) {
res.send('Hello world\n');
});
app.listen(PORT);
console.log('Running on http://localhost:' + PORT);
FROM node:argon
# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install
# Bundle app source
COPY . /usr/src/app
EXPOSE 8080
CMD [ "npm", "start" ]
Dockerfile 是 docker 用來 build image 的參考檔案。裡面會包含多個 commands,Docker 在 build image 的時候,會照著裡面所列的步驟一步一步執行。詳細的指令可以參考 Docker 官方網站的 Dockerfile reference。
在這邊的意思是,從 node 這個 base image 中,選擇 argon 這個 tag 所標示的版本來建立這個 image。在建立的過程中,先建立一個 /usr/src/app 資料夾,並且使用這個資料夾當作以下指令的工作目錄。指定完工作目錄後,copy package.json 這個檔案到工作目錄下,接著執行 npm install。接著繼續 copy 所有的檔案到工作目錄下,然後開放 8080 port。最後則是執行 command npm start
。
docker build -t <tag> .
執行 docker build 來建立 image,-t
是用來給你的 image 一個 tag,在這裡你可以用自定義的名稱。別忘了最後有一個 .
,意味著你要切換到該目錄下作業。
透過 docker iamges
指令,可以確認目前系統中建立好的 images。
你可以用 docker run
指令把剛剛建立好的 image 跑起來。-p
的參數代表你要把 public 的 port 綁到 container 的某個 port 上。-d
代表把這個 image 跑在背景。
docker run -p <public expose port>:<container expose port> -d <iamge tag>
剩下就是一些附加的指令,你可以用 docker ps
來看目前有哪些 container 正在跑,或是用 docker log <container id>
來看 log,也可以用 docker exec -it <container id> /bin/bash
進入到每個 container 的 bash 去操作。