完整地Docker化Node.js項目的部署流程
假設(shè)Node.js 項目結(jié)構(gòu)如下:
/opt/test/front-node/ ├── node/ │ ├── src/ │ ├── package.json │ ├── pnpm-lock.yaml │ ├── assets/ │ └── test.js └── Dockerfile └── docker-compose.yml └── deploy.sh
1. Dockerfile
Dockerfile 是構(gòu)建 Node.js 鏡像的核心文件,示例如下:
# 使用官方 Node 20 運行時
FROM node:20-alpine
# 設(shè)置工作目錄
WORKDIR /usr/src/app
# 復(fù)制依賴文件
COPY node/package*.json ./
# 安裝依賴
RUN npm install --omit=dev && \
addgroup -S appgroup && adduser -S appuser -G appgroup
# 切換用戶,避免使用 root
USER appuser
# 暴露應(yīng)用端口
EXPOSE 3001
# 啟動命令
CMD ["npm", "run", "start"]
說明:
node:20-alpine:輕量化 Node 20 官方鏡像。WORKDIR /usr/src/app:容器內(nèi)部工作目錄。COPY node/package*.json ./:只復(fù)制依賴文件進行安裝,提升緩存效率。npm install --omit=dev:僅安裝生產(chǎn)依賴。USER appuser:降低安全風(fēng)險,不以 root 運行。EXPOSE 3000:暴露端口供外部訪問。CMD ["npm", "run", "start"]:默認啟動應(yīng)用。
2. docker-compose.yml
docker-compose 用于管理容器和卷映射,示例:
version: "3.9"
services:
front-node:
build:
context: .
dockerfile: Dockerfile
container_name: test-node
restart: always
ports:
- "3001:3001"
environment:
- NODE_ENV=production
working_dir: /usr/src/app
command: ["npm", "run", "start"]
volumes:
# 映射整個項目文件夾,方便熱更新
- ./node:/usr/src/app
# 防止 node_modules 被宿主機覆蓋
- /usr/src/app/node_modules
說明:
container_name:容器命名為test-node。volumes:映射本地項目目錄到容器,同時保留容器內(nèi)node_modules。restart: always:容器異常退出后自動重啟。
3. 一鍵部署腳本 deploy.sh
為了方便構(gòu)建、啟動和更新容器,我們可以寫一個 deploy 腳本:
#!/bin/bash
WORKDIR="/opt/test/front-node"
CONTAINER_NAME="test-node"
IMAGE_NAME="test-node:latest"
cd "$WORKDIR" || { echo "工作目錄不存在: $WORKDIR"; exit 1; }
echo "=== 檢查并停止已有容器 ==="
if docker ps -a --format '{{.Names}}' | grep -w "$CONTAINER_NAME" > /dev/null; then
docker stop "$CONTAINER_NAME"
docker rm "$CONTAINER_NAME"
echo "容器 $CONTAINER_NAME 已停止并刪除"
else
echo "容器 $CONTAINER_NAME 不存在"
fi
echo "=== 刪除舊鏡像 ==="
if docker images --format '{{.Repository}}:{{.Tag}}' | grep -w "$IMAGE_NAME" > /dev/null; then
docker rmi "$IMAGE_NAME" -f
echo "鏡像 $IMAGE_NAME 已刪除"
else
echo "鏡像 $IMAGE_NAME 不存在"
fi
echo "=== 構(gòu)建新鏡像并啟動容器 ==="
docker compose build
docker compose up -d
echo "=== 部署完成 ==="
使用方法:
chmod +x deploy.sh ./deploy.sh
該腳本功能:
- 停止并刪除已有容器。
- 刪除舊鏡像。
- 構(gòu)建新鏡像。
- 啟動容器并后臺運行。
4. 構(gòu)建與啟動流程
假設(shè)當前在項目根目錄 /opt/test/front-node/:
構(gòu)建鏡像:
docker compose build
啟動容器(后臺運行):
docker compose up -d
查看容器狀態(tài):
docker ps
查看日志:
docker logs -f test-node
現(xiàn)在, Node.js 服務(wù)已經(jīng)在 Docker 容器中運行,并映射到宿主機 3001 端口。
5. 特點與優(yōu)勢
- 安全:容器使用非 root 用戶。
- 自動重啟:容器異常退出會自動重啟。
- 熱更新:本地項目目錄映射到容器,可直接修改代碼。
- 可重復(fù)部署:deploy.sh 一鍵完成更新與啟動。
- 輕量:使用 Alpine Node 鏡像減少鏡像體積。
6. 總結(jié)
Node.js 應(yīng)用完整 Docker 化流程,包括:
- Dockerfile 編寫
- docker-compose.yml 配置
- 容器和鏡像管理
- 一鍵部署腳本
通過這種方式,Node.js 應(yīng)用可以安全、穩(wěn)定地部署在 Docker 環(huán)境中,方便開發(fā)、測試與生產(chǎn)環(huán)境的快速迭代。
到此這篇關(guān)于完整地Docker化Node.js項目的部署流程的文章就介紹到這了,更多相關(guān)Docker化Node.js項目內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Mac OS上安裝使用Node.js的項目自動化構(gòu)建工具Gulp
Gulp是一個在使用上比Grunt更加簡潔的自動化工具(文中附有對比),和Node的npm包管理器配合使用非常方便,下面就記錄一下在Mac OS上安裝使用Node.js的項目自動化構(gòu)建工具Gulp的方法:2016-06-06

