完整地Docker化Node.js項(xiàng)目的部署流程
假設(shè)Node.js 項(xiàng)目結(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 運(yùn)行時(shí)
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
# 啟動(dòng)命令
CMD ["npm", "run", "start"]
說明:
node:20-alpine:輕量化 Node 20 官方鏡像。WORKDIR /usr/src/app:容器內(nèi)部工作目錄。COPY node/package*.json ./:只復(fù)制依賴文件進(jìn)行安裝,提升緩存效率。npm install --omit=dev:僅安裝生產(chǎn)依賴。USER appuser:降低安全風(fēng)險(xiǎn),不以 root 運(yùn)行。EXPOSE 3000:暴露端口供外部訪問。CMD ["npm", "run", "start"]:默認(rèn)啟動(dòng)應(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:
# 映射整個(gè)項(xiàng)目文件夾,方便熱更新
- ./node:/usr/src/app
# 防止 node_modules 被宿主機(jī)覆蓋
- /usr/src/app/node_modules
說明:
container_name:容器命名為test-node。volumes:映射本地項(xiàng)目目錄到容器,同時(shí)保留容器內(nèi)node_modules。restart: always:容器異常退出后自動(dòng)重啟。
3. 一鍵部署腳本 deploy.sh
為了方便構(gòu)建、啟動(dòng)和更新容器,我們可以寫一個(gè) 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)建新鏡像并啟動(dòng)容器 ==="
docker compose build
docker compose up -d
echo "=== 部署完成 ==="
使用方法:
chmod +x deploy.sh ./deploy.sh
該腳本功能:
- 停止并刪除已有容器。
- 刪除舊鏡像。
- 構(gòu)建新鏡像。
- 啟動(dòng)容器并后臺(tái)運(yùn)行。
4. 構(gòu)建與啟動(dòng)流程
假設(shè)當(dāng)前在項(xiàng)目根目錄 /opt/test/front-node/:
構(gòu)建鏡像:
docker compose build
啟動(dòng)容器(后臺(tái)運(yùn)行):
docker compose up -d
查看容器狀態(tài):
docker ps
查看日志:
docker logs -f test-node
現(xiàn)在, Node.js 服務(wù)已經(jīng)在 Docker 容器中運(yùn)行,并映射到宿主機(jī) 3001 端口。
5. 特點(diǎn)與優(yōu)勢(shì)
- 安全:容器使用非 root 用戶。
- 自動(dòng)重啟:容器異常退出會(huì)自動(dòng)重啟。
- 熱更新:本地項(xiàng)目目錄映射到容器,可直接修改代碼。
- 可重復(fù)部署:deploy.sh 一鍵完成更新與啟動(dòng)。
- 輕量:使用 Alpine Node 鏡像減少鏡像體積。
6. 總結(jié)
Node.js 應(yīng)用完整 Docker 化流程,包括:
- Dockerfile 編寫
- docker-compose.yml 配置
- 容器和鏡像管理
- 一鍵部署腳本
通過這種方式,Node.js 應(yīng)用可以安全、穩(wěn)定地部署在 Docker 環(huán)境中,方便開發(fā)、測(cè)試與生產(chǎn)環(huán)境的快速迭代。
到此這篇關(guān)于完整地Docker化Node.js項(xiàng)目的部署流程的文章就介紹到這了,更多相關(guān)Docker化Node.js項(xiàng)目?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談Node.js ORM框架Sequlize之表間關(guān)系
下面小編就為大家?guī)硪黄獪\談Node.js ORM框架Sequlize之表間關(guān)系。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07
使用GruntJS構(gòu)建Web程序之Tasks(任務(wù))篇
任務(wù)(Tasks)是grunt的核心概念,你所做的很多工作比如資源合并(concat)、壓縮(uglify)都是在配置任務(wù)。 每次grunt運(yùn)行的時(shí)候,你指定的一個(gè)或多個(gè)任務(wù)也在運(yùn)行,如果你沒有指定任務(wù),那么一個(gè)默認(rèn)名為“default”的任務(wù)將自動(dòng)運(yùn)行。2014-06-06
前端+nodejs+mysql實(shí)現(xiàn)前后端聯(lián)通的完整代碼
Node.js主要屬于后端技術(shù),但也可以用于前端開發(fā)的某些場(chǎng)景,下面這篇文章主要介紹了前端+nodejs+mysql實(shí)現(xiàn)前后端聯(lián)通的完整代碼,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04
nodejs個(gè)人博客開發(fā)第七步?后臺(tái)登陸
這篇文章主要為大家詳細(xì)介紹了nodejs個(gè)人博客開發(fā)的后臺(tái)登陸功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
koa+mongoose實(shí)現(xiàn)簡(jiǎn)單增刪改查接口的示例代碼
這篇文章主要介紹了koa+mongoose實(shí)現(xiàn)簡(jiǎn)單增刪改查接口的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05
實(shí)例分析nodejs模塊xml2js解析xml過程中遇到的坑
這篇文章主要介紹了實(shí)例分析nodejs模塊xml2js解析xml過程中遇到的坑,涉及nodejs模塊xml2js解析xml過程中parseString方法參數(shù)使用技巧,需要的朋友可以參考下2017-03-03
解決node-webkit 不支持html5播放mp4視頻的方法
本文給大家分享的是解決node-webkit 不支持html5播放mp4視頻的方法,其原因大概是因?yàn)閚ode-webkit沒有購(gòu)買mp4格式的專利授權(quán),恩,我們來想個(gè)辦法來解決這個(gè)事情吧。2015-03-03

