為 node.js 應用程式建立第一個自己的 Docker Image

這篇文章會有三個部分:

  • 以 node.js 的 express 來建立 Hello world 伺服器
  • 撰寫 dockerfile
  • 編譯成 docker image

安裝 Node.js

Node.js 官方網站下載 LTS 版本並且安裝。

使用指令 node -v 會顯示當前版本

1
2
➜  first_dockerfile node -v
v13.14.0

建立 express 伺服器

首先使用指令 npm install,再輸入 npm install express 安裝 express 套件

最後是建立一個 server.js 檔案,並貼上以下內容

1
2
3
4
5
const express = require('express')
const app = express()
const port = 8888
app.get('/', (req, res) => res.send('Hello World!<br/>https://blog.myctw.cc'))
app.listen(port, () => console.log('Server ready on %i', port))

使用指令 node server.js

1
2
➜  first_dockerfile node server.js
Server ready on 8888

此時打開瀏覽器,輸入 http://localhost:8888 就能夠看到歡迎畫面


Dockerfile 是什麼

Dockerfile 就是 Docker 的腳本,透過這個腳本來將你的應用程式打包,編譯成 image。
Dockerfile 本身很簡潔,主要使用以下幾種指令:FROM, ENV, WORKDIR, COPY, CMD

  • FROM: 用來載入映像檔的,像是這次範例會使用到 node,就會需要這些基底的映像檔
  • ENV: 設定環境變數用,格式就是 KEY="VALUE"
  • WORKDIR: 會在映像檔系統中建立一個目錄,稱為工作目錄
  • COPY: 複製指令,從現在的環境將檔案複製到指定的映像檔系統中
  • CMD: 啟動此容器時,會自動執行的指令,這邊就是上述執行 js 的語法

撰寫你的第一個 Dockerfile

首先我們建立一個檔案,名為 Dockerfile,對的,沒有副檔名。

1
2
3
4
5
6
7
8
9
10
FROM node:13

WORKDIR /usr/src/app

RUN npm install
COPY package*.json ./
COPY . /usr/src/app

EXPOSE 8888
CMD [ "node", "server.js" ]

準備好 Dockerfile 後,我們可以執行指令 docker image build -t 'first_image' .
我們把此 image 命名為 first_image,同時要注意後面的 .,代表當前目錄。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 執行 build image 並命名為 first_image (中間適當省略內容與長度)
➜ first_dockerfile docker image build -t 'first_image' .
[+] Building 4.4s (10/10) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 178B 0.0s
=> [internal] load .dockerignore 0.0s
=> exporting to image 0.1s
=> => exporting layers 0.1s
=> => writing image sha256:65f29ea38eeec4fb400b7 0.0s
=> => naming to docker.io/library/first_image

// 確認 image 是否正確被建立
➜ first_dockerfile docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
first_image latest 65f29ea38eee 9 seconds ago 945MB

接著我們嘗試透過 first_image 啟動 container,確認是否為我們先前建立的內容,docker run -p 8899:8888 -d 65f,這邊刻意把 port 指向 8899,確認是否正常。

alt


到這邊你已經能夠成功 build 出自己的 image 了,但整個過程還有很多可以優化改善的地方,在後面的文章會繼續寫到~

  • 作者: MingYi Chou
  • 版權聲明: 轉載不用問,但請註明出處!本網誌均採用 BY-NC-SA 許可協議。