news 2026/6/27 0:38:59

Node.js 编程实战:部署 Node.js 应用 —— Docker 容器化部署

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Node.js 编程实战:部署 Node.js 应用 —— Docker 容器化部署

随着 Node.js 应用从开发环境迁移到生产环境,传统的直接部署方式(如裸机、PM2 守护进程)虽然可行,但在环境一致性、快速部署、可扩展性上仍存在一定局限。

Docker 容器化部署提供了一种轻量、可移植、环境一致的解决方案,使得应用可以在任何支持 Docker 的环境中运行,且无需担心依赖冲突或环境差异。
本文将从实战角度,讲解如何将 Node.js 应用容器化,并完成从构建、运行到优化的全过程。


一、为什么选择 Docker 部署 Node.js 应用
Docker 提供了以下核心优势:

  1. 1.环境隔离
    每个应用运行在独立容器中,不会与系统环境或其他应用冲突。
  2. 2.快速部署与迁移
    一次构建的镜像可以在任何 Docker 支持的服务器上运行,部署过程几乎无需额外配置。
  3. 3.便于 CI/CD
    容器镜像可直接推送到镜像仓库,实现流水线自动化部署。
  4. 4.轻量与高效
    容器相比虚拟机占用更少资源,启动速度快。
  5. 5.易于扩展与负载均衡
    可配合 Docker Compose 或 Kubernetes,快速扩容多实例。

二、准备 Node.js 应用
假设我们的项目结构如下:

my-app/ ├── app.js ├── package.json └── package-lock.json

确保应用在本地可以正常启动:

node app.js

三、编写 Dockerfile
Dockerfile 是容器构建的核心。
1. 基础 Dockerfile 示例

# 使用官方 Node.js LTS 版本作为基础镜像 FROM node:20-alpine # 设置工作目录 WORKDIR /usr/src/app # 复制 package.json 和 package-lock.json COPY package*.json ./ # 安装依赖 RUN npm install --production # 复制应用代码 COPY . . # 暴露容器端口 EXPOSE 3000 # 启动应用 CMD ["node", "app.js"]

说明:

  • node:20-alpine是轻量级 Node.js 官方镜像
  • WORKDIR定义容器内工作目录
  • npm install --production仅安装生产依赖
  • EXPOSE 3000用于容器端口映射
  • CMD指定容器启动命令

2. 优化 Dockerfile

  1. 1.缓存依赖安装
COPY package*.json ./ RUN npm ci --only=production

使用npm ci速度更快,并保证依赖一致性。

  1. 2.减少镜像体积
FROM node:20-alpine AS builder WORKDIR /usr/src/app COPY package*.json ./ RUN npm install --production COPY . . FROM node:20-alpine WORKDIR /usr/src/app COPY --from=builder /usr/src/app . EXPOSE 3000 CMD ["node", "app.js"]

使用多阶段构建,仅将最终产物放入镜像,显著减小体积。


四、构建镜像
在项目根目录下执行:

docker build -t my-app:1.0 .
  • my-app:1.0是镜像名称和标签
  • .表示 Dockerfile 所在目录

构建完成后,可以查看镜像:

docker images

五、运行容器

docker run -d -p 3000:3000 --name my-app-container my-app:1.0

说明:

  • -d后台运行
  • -p 3000:3000将容器 3000 端口映射到宿主机 3000 端口
  • --name指定容器名称

访问http://localhost:3000即可看到应用运行效果。


六、使用 Docker Compose 管理
当应用依赖数据库或缓存时,Docker Compose 可以统一管理多服务。
1. 示例 docker-compose.yml

version: "3.9" services: app: build: . container_name: my-app ports: - "3000:3000" environment: NODE_ENV: production depends_on: - redis - db db: image: mysql:8 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: mydb ports: - "3306:3306" redis: image: redis:7 ports: - "6379:6379"

2. 启动多服务

docker-compose up -d

一条命令即可启动应用及依赖服务,并保持网络互通。


七、镜像优化与安全建议

    1. 使用Alpine 或 Slim 镜像减少体积
    1. 安装依赖尽量使用--production--only=prod
    1. 多阶段构建,避免将开发工具带入生产镜像
    1. 配置非 root 用户运行应用
    1. 定期更新基础镜像,修复安全漏洞
    1. 使用.dockerignore忽略不必要文件

八、日志管理
Docker 容器的日志默认输出到标准输出(stdout)和标准错误(stderr)。可以通过以下方式查看:

docker logs -f my-app-container

结合 Docker Compose,可统一查看多服务日志:

docker-compose logs -f

生产环境建议配合ELK 或 Loki做集中日志管理与分析。


九、容器更新与滚动部署

    1. 构建新镜像:
docker build -t my-app:1.1 .
    1. 停止旧容器并删除:
docker stop my-app-container docker rm my-app-container
    1. 启动新容器:
docker run -d -p 3000:3000 --name my-app-container my-app:1.1

配合 CI/CD 可实现自动化滚动更新,减少停机时间。


十、总结
使用 Docker 容器化部署 Node.js 应用有以下优势:

  • • 环境一致性,避免依赖冲突
  • • 快速部署与迁移
  • • 多服务统一管理(Docker Compose)
  • • 易于扩展与负载均衡
  • • 集成 CI/CD 流程,实现自动化发布

在《Node.js 编程实战》系列中,Docker 部署为应用走向生产环境奠定了基础,同时也为后续 Kubernetes、高可用集群以及微服务架构提供了良好扩展性。

原文: https://juejin.cn/post/75989476
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 16:58:55

忍不住分享!这5个软件居然全部免费,用完爱不释手!

到底怎样的免费软件才算真正实用,这个问题思考了很久。最后,我发现很简单,真正免费的软件的价值在于能立马解决大家当下的小问题!下面这5款,就是这样的工具,还个个很好用!PDFgear:纯…

作者头像 李华
网站建设 2026/6/26 16:16:58

导电阳极丝(CAF):原理、影响与应对策略

导电阳极丝(Conductive Anodic Filament,CAF)它主要发生在印刷电路板(PCB)中,是电化学迁移现象中的一个重要类别,由于玻纤与树脂之间存在缝隙,在湿热环境和电势差的作用下&#xff0…

作者头像 李华
网站建设 2026/6/25 9:55:23

第14章:从单体到平台:大模型中台架构设计

第14章:从单体到平台:大模型中台架构设计 当第五个团队要求部署自己的大模型时,你意识到:每个团队单独搭建GPU集群、重复开发推理框架、各自实现监控告警的模式已经走到了尽头。本章将为你设计一个从单体AI应用到AI能力中台的完整进化路径。 引言:中台化的必然性 某金融…

作者头像 李华
网站建设 2026/6/17 2:50:15

君耀电子标准电容系列低电容 TVS 二极管(Cj>30pF) 性能与应用解析

在现代电子设备中,静电放电(ESD)是威胁电路稳定性的常见因素。尤其是涉及高速数据端口、射频线路及精密信号传输的应用,不仅需要有效的ESD防护,还要求保护器件引入的电容负载尽可能小,以避免信号完整性受损…

作者头像 李华
网站建设 2026/6/22 10:58:33

高通 Wi-Fi 驱动实录:揭秘高通 QRTR 协议栈的“幕后黑手”

我们依然从一个真实的“现场”出发,来探究其背后的技术细节。最近在 Amlogic S905x5 平台上适配高通 Wi-Fi 7(QCC2072/PCIe 接口)芯片时,我们遇到了 QRTR(Qualcomm IPC Router)版本不匹配的问题。具体 LOG …

作者头像 李华
网站建设 2026/6/26 14:44:10

污泥浓度水质在线监测仪:实时掌握水体污浊状态

污泥浓度在线监测仪是一种专用于实时检测水体中污泥含量的在线仪器。它能够快速、持续地记录水体中的污泥浓度数据,为水质管理与过程控制提供关键参数。该仪器主要基于散射光法进行测量,量程范围通常覆盖0至20,000g/L,分辨率可达0.001g/L。其…

作者头像 李华