iT邦幫忙

2022 iThome 鐵人賽

DAY 17
0
DevOps

不想吃土嗎?就利用開源軟體打造CICD Pipeline吧!系列 第 17

Day 17: 我們的第一個NodeJS Docker映像檔!

  • 分享至 

  • xImage
  •  

昨天跟大家簡單講解了一下使用Docker的好處,那麽今天,我們就為我們的Hello World專案,建立一個可供執行的NodeJS Docker映像檔吧!

(注意: 之前我們使用了一個SonarQube測試專案,但從現在開始,我們將會使用一個Express的Hello World專案。範例可參考此處。)

製作我的NodeJS Docker Image

首先我們進入到專案中,然後新增一個Dockerfile。這個Dockerfile會定義我們要如何建立一個新的Docker映像檔。

由於Docker映像檔可以繼承其他Docker映像檔去建置,因此最簡單的方法是我們直接由NodeJS提供的映像檔去製作我們自己的映像檔。所以第一步,我們先先到Docker Hub上找到最新的NodeJS Docker版本。
https://ithelp.ithome.com.tw/upload/images/20220929/20152012Ba3Cmw3Ndr.png

在此我們使用最新的14.20.1-bullseye-slim的版本。在Dockerfile中加入以下內容。

FROM node:14.20.1-bullseye-slim

代表我們以NodeJS官方的14.20.1-bullseye-slim版本作為Base Image去開始進行設定。

然後,我們可以加入一個環境變數去指定NodeJS的運作環境,因此我們先指定NODE_ENVproduction。在Dockerfile中加入以下內容。

ENV NODE_ENV=production

然後我們在Docker映像檔中設定一個工作路徑,以便接下來的指令都在當中執行。繼續加入以下內容。

WORKDIR /app

然後,讓Docker把我們專案中的"package.json"和"package-lock.json"抄寫到映像檔中,以便可以進行一些Dependency的安裝。

COPY ["package.json", "package-lock.json*", "./"]

然後我們讓Docker運行npm install

RUN npm install –production

然後我們再把我們開發的程序檔案抄寫到Docker映像檔中。

COPY . . 

最後,我們讓Docker Image在起動時,啟動NodeJS。

CMD ["node", "app.js"]

完整的Dockerfile應該如下。

FROM node: 14.20.1-bullseye-slim
ENV NODE_ENV=production

WORKDIR /app

COPY ["package.json", "package-lock.json*", "./"]

RUN npm install --production

COPY . .

CMD [ "node", "app.js" ]

設定好Dockerfile以後,我們在Terminal中運行以下指令去建立我們的映像檔。

Docker build -t ironman-helloworld .

如果運行成功,應該會在Terminal中看到以下內容。

jamkuong@MacBook-Pro helloworld % docker build -t ironman-helloworld .
[+] Building 2.7s (10/10) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                                                           0.0s
 => => transferring dockerfile: 213B                                                                                                                                                                                                           0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                              0.0s
 => => transferring context: 2B                                                                                                                                                                                                                0.0s
 => [internal] load metadata for docker.io/library/node:14.20.1-bullseye-slim                                                                                                                                                                                  2.4s
 => [internal] load build context                                                                                                                                                                                                              0.1s
 => => transferring context: 82.82kB                                                                                                                                                                                                           0.1s
 => [1/5] FROM docker.io/library/node:18.9@sha256:8a45c95c328809e7e10e8c9ed5bf8374620d62e52de1df7ef8e71a9596ec8676                                                                                                                             0.0s
 => CACHED [2/5] WORKDIR /app                                                                                                                                                                                                                  0.0s
 => CACHED [3/5] COPY [package.json, package-lock.json*, ./]                                                                                                                                                                                   0.0s
 => CACHED [4/5] RUN npm install --production                                                                                                                                                                                                  0.0s
 => [5/5] COPY . .                                                                                                                                                                                                                             0.1s
 => exporting to image                                                                                                                                                                                                                         0.1s
 => => exporting layers                                                                                                                                                                                                                        0.1s
 => => writing image sha256:df6939b30cdf3fa3f6219e2ce560260aafc68fa7c5e95bcda6ea0d36cf44fd14                                                                                                                                                   0.0s
 => => naming to docker.io/library/ironman-helloworld

然後我們在Terminal中運行以下指令。

docker images

應該可以看到以有一個ironman-helloworld的映像檔成功被建立。
https://ithelp.ithome.com.tw/upload/images/20220929/20152012zXAg4wgTBA.png

我們嘗試用以下指令去運行一下新建立的映像檔。

docker run -p 3000:3000 --name ironman-helloworld ironman-helloworld

如果成功運行,我們應該可以在http://localhost:3000/看到有一個Hello World!的輸出。

小結

今天,我們成功把我們開發的程序轉化為一個Docker的映像檔。但是,現在這個Docker Image只是在我們本機中儲存。我們需要為這個建立了的映像檔找一個倉庫進行儲存。明天,我們將會嘗試找一個適合的映像檔儲存倉庫。

題外話

這幾天看到台灣地震,遠在在香港的我祝願大家一切安好!

參考內容

NodeJS Docker映像檔製作: https://docs.docker.com/language/nodejs/build-images/


上一篇
Day 16: 使用Docker進行虛擬化!
下一篇
Day 18: Docker Image的倉庫!Harbor Registry!
系列文
不想吃土嗎?就利用開源軟體打造CICD Pipeline吧!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言