Dockerfile介紹文章中,我介紹了一個簡單的 Node.js Dockerfile 示例:

FROM node:14
WORKDIR /usr/src/app
COPY package*.json app.js ./
RUN npm install
EXPOSE 3000
CMD ["node", "app.js"]

注意:在CMD行中使用雙引號。單引號將導致錯誤。

讓我們使用這個 Dockerfile 构建一個映像,然後運行容器

我將在 dev/docker/examplenode 文件夾中創建這個文件。我在 app.js 文件中創建了一個簡單的 Node.js 應用,使用 Express 框架:

const express = require('express')
const app = express()

app.get('/', (req, res) => res.send('Hello World!'))
app.listen(3000, () => console.log('Server ready'))

非常簡單,但是我們有一個依賴項。我需要將它添加到 package.json 文件中,所以我運行了以下命令:

npm init -y
npm install express

現在你可以運行 node app.js 確保它正常運行:

image

停止這個進程,現在讓我們從這個創建一個 Docker 映像。

你只需要保留 app.jspackage.jsonpackage-lock.json 文件。

還需要一個 Dockerfile。在同一個文件夾中創建一個無擴展名的 Dockerfile 文件(不是 Dockerfile.txt)。

你可以自由地刪除 node_modules 文件夾,這個文件夾現在包含了 Express 庫及其依賴,但是你也可以創建一個 .dockerignore 文件,將 node_modules 加入其中,使 Docker 完全忽略這個文件夾。

它的功能與 Git 中的 .gitignore 類似。

運行以下命令:

docker build -t examplenode .

它將需要一些時間來下載 Node 映像並運行 npm install,然後你將收到一個成功的消息。

值得注意的是,在你首次下載基礎映像(如我們在這里使用的 node)之後,它將被本地緩存,因此你無需再次下載它,映像建立過程將會更加快速。

現在,我們可以從這個映像運行一個容器:

docker run -d -p 3000:3000 --name node-app examplenode

現在你可以在 Docker Desktop 中看到正在運行的容器映像:

image

你可以單擊 “Open in browser” 按鈕,在端口3000上打開正在運行的應用:

image

就像之前一樣!只是現在應用運行在它自己的容器中,完全隔離,我們可以在容器中運行任何我們想要的 Node 版本,並且享受 Docker 帶給我們的所有好處。

例如,你可以刪除容器並將其在端口80而不是3000上運行,執行以下命令:

docker run -d -p 80:3000 --name node-app examplenode

映像不需要改變,你只需要改變端口映射。以下是結果:

image