iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0

第二天時我們做了一個會印出 Hello World 的程式,並包進了 Docker,
今天想要繼續延續這個主題,讓我們的應用程式更接近後端一些,

同樣都是 Hello World,但改成運行一個 Server,呼叫 API 時會回傳內容。


Express

Express 是 Node.Js 生態系中一款蠻老牌的 Server 套件,它可以用很少的程式碼,就把 API 建立起來,

npm init
npm install --save express

簡單設定一下後,就可以來處理我們的 Server 程式。


Server

我們這裡建立兩支檔案:

  1. app.js
  2. 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"}}%

Dockerize

將程式碼包裹成 Docker 的動作,又可以稱為 Dockerize (容器化),

再來也跟上次一樣,我們來定義 Dockerfile:

FROM node:16-slim

WORKDIR /app

COPY ./package*.json ./
RUN npm ci
COPY . .

CMD ["npm", "start"]

這次就稍微再多了一點東西,

  1. 設定 WORKDIR

    這是 Work Directory (工作目錄) 縮寫而成的指令,意思是在容器內預設要基於哪一個路徑。

  2. 放入程式

    COPY 指令定義了把什麼內容放進容器,RUN 則是定義在容器內執行什麼。

  3. 安裝套件

    為了要讓 Node.Js 跟 Express 可以運作,當然就要透過 NPM 安裝好套件。

  4. 執行


Run

最後就是把 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

那我要來睡了,大家晚安。


上一篇
D4 - Docker Installation
下一篇
D6 - Build Cache
系列文
其實沒有那麼難 — Docker30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言