在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
確保它正常運行:
停止這個進程,現在讓我們從這個創建一個 Docker 映像。
你只需要保留 app.js
、package.json
和 package-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 中看到正在運行的容器映像:
你可以單擊 “Open in browser” 按鈕,在端口3000上打開正在運行的應用:
就像之前一樣!只是現在應用運行在它自己的容器中,完全隔離,我們可以在容器中運行任何我們想要的 Node 版本,並且享受 Docker 帶給我們的所有好處。
例如,你可以刪除容器並將其在端口80而不是3000上運行,執行以下命令:
docker run -d -p 80:3000 --name node-app examplenode
映像不需要改變,你只需要改變端口映射。以下是結果: