昨天跟大家簡單講解了一下使用Docker的好處,那麽今天,我們就為我們的Hello World專案,建立一個可供執行的NodeJS Docker映像檔吧!
(注意: 之前我們使用了一個SonarQube測試專案,但從現在開始,我們將會使用一個Express的Hello World專案。範例可參考此處。)
首先我們進入到專案中,然後新增一個Dockerfile
。這個Dockerfile
會定義我們要如何建立一個新的Docker映像檔。
由於Docker映像檔可以繼承其他Docker映像檔去建置,因此最簡單的方法是我們直接由NodeJS提供的映像檔去製作我們自己的映像檔。所以第一步,我們先先到Docker Hub上找到最新的NodeJS Docker版本。
在此我們使用最新的14.20.1-bullseye-slim
的版本。在Dockerfile
中加入以下內容。
FROM node:14.20.1-bullseye-slim
代表我們以NodeJS官方的14.20.1-bullseye-slim版本作為Base Image去開始進行設定。
然後,我們可以加入一個環境變數去指定NodeJS的運作環境,因此我們先指定NODE_ENV
為production
。在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的映像檔成功被建立。
我們嘗試用以下指令去運行一下新建立的映像檔。
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/