第二天時我們做了一個會印出 Hello World 的程式,並包進了 Docker,
今天想要繼續延續這個主題,讓我們的應用程式更接近後端一些,
同樣都是 Hello World,但改成運行一個 Server,呼叫 API 時會回傳內容。
Express 是 Node.Js 生態系中一款蠻老牌的 Server 套件,它可以用很少的程式碼,就把 API 建立起來,
npm init
npm install --save express
簡單設定一下後,就可以來處理我們的 Server 程式。
我們這裡建立兩支檔案:
app.js
router.js
第一支是定義基本的 Express 設定,第二支則是定義 API 的內容,
// app.js
import express from 'express';
import router from './router.js';
const app = express();
app.use(express.json());
app.use('/', router);
app.set('port', process.env.PORT || 3000);
const server = app.listen(app.get('port'), () => {
console.log('Listening on port ' + server.address().port);
})
// router.js
import Router from 'express';
const router = Router();
router.get('/', function(req, res) {
return res.json({ hello: "world" });
});
router.post('/', function(req, res) {
return res.json({
hello: "world",
input: req.body,
});
});
export default router;
OK,Done!
啟動 Server 就可以使用 API 了。
node app.js
可以用 Terminal 的 curl
工具來測試 API:
$ curl localhost:3000
{"hello":"world"}%
$ curl localhost:3000 \
-X POST \
-H "Content-Type: application/json" \
-d '{"name": "Louis"}'
{"hello":"world","input":{"name":"Louis"}}%
將程式碼包裹成 Docker 的動作,又可以稱為 Dockerize
(容器化
),
再來也跟上次一樣,我們來定義 Dockerfile:
FROM node:16-slim
WORKDIR /app
COPY ./package*.json ./
RUN npm ci
COPY . .
CMD ["npm", "start"]
這次就稍微再多了一點東西,
設定 WORKDIR
這是 Work Directory (工作目錄) 縮寫而成的指令,意思是在容器內預設要基於哪一個路徑。
放入程式
COPY
指令定義了把什麼內容放進容器,RUN
則是定義在容器內執行什麼。
安裝套件
為了要讓 Node.Js 跟 Express 可以運作,當然就要透過 NPM 安裝好套件。
執行
最後就是把 Server 用 Docker 跑起來:
$ sudo docker build . -t hello-world-server
$ sudo docker run \
--detach \
--publish=3000:3000 \
hello-world-server
$ curl localhost:3000
{"hello":"world"}%
其中有些參數,之後再來詳細解釋,有興趣的讀者可以直接拿參數名稱去 Google 關鍵字 (e.g. docker detach
),就能找到一些介紹了。
想看完整程式碼可以到 2022-ithelp-docker-is-not-so-hard。
那我要來睡了,大家晚安。