从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CICD)

server/2025/1/24 4:44:38/
从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CI/CD)

在这里插入图片描述

目录
  1. 项目初始化:构建一个简单的 Node.js 应用
  2. 设置 Docker 环境:容器化你的应用
  3. 配置 CI/CD:自动化构建与部署
  4. 上线前的最后检查:确保项目可以无缝部署
  5. 常见问题与排查技巧

1. 项目初始化:构建一个简单的 Node.js 应用

首先,我们从构建一个简单的 Node.js 项目开始,确保你的开发环境已经安装了 Node.js 和 npm。

1.1 初始化项目

打开终端,创建一个新目录并初始化 Node.js 项目:

mkdir my-node-app
cd my-node-app
npm init -y

这会在当前目录下创建一个 package.json 文件。

1.2 安装必要依赖

安装 Express,作为我们的 Web 框架。

npm install express
1.3 创建基础应用

在项目根目录下创建一个 index.js 文件,简单实现一个 API 端口:

// index.js
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;app.get('/', (req, res) => {res.send('Hello, World!');
});app.listen(port, () => {console.log(`Server is running on http://localhost:${port}`);
});
1.4 本地启动

通过以下命令启动本地开发服务器:

node index.js

访问 http://localhost:3000,你应该能看到 “Hello, World!”。


2. 设置 Docker 环境:容器化你的应用

Docker 是一种非常流行的容器化工具,它允许你将应用及其所有依赖打包到一个可移植的容器中,确保无论在什么环境下都能一致地运行。

2.1 创建 Dockerfile

在项目根目录下创建一个 Dockerfile,用来构建 Docker 镜像。

# 使用官方 Node.js 镜像作为基础镜像
FROM node:14# 设置工作目录
WORKDIR /usr/src/app# 复制 package.json 并安装依赖
COPY package*.json ./
RUN npm install# 复制项目文件
COPY . .# 设置环境变量
ENV PORT 3000# 暴露端口
EXPOSE 3000# 启动应用
CMD ["node", "index.js"]
2.2 构建 Docker 镜像

构建镜像并给它命名为 my-node-app

docker build -t my-node-app .
2.3 运行 Docker 容器

运行镜像并映射到本地的 3000 端口:

docker run -p 3000:3000 my-node-app

这时,你的应用就已经在 Docker 容器中运行了,通过访问 http://localhost:3000,你依然可以看到 “Hello, World!”。


3. 配置 CI/CD:自动化构建与部署

CI/CD(持续集成/持续部署)是现代软件开发流程中的核心组成部分,可以帮助你自动化构建、测试和部署过程。我们使用 GitHub Actions 来实现这一流程。

3.1 创建 GitHub 仓库

首先,将代码推送到 GitHub 上,创建一个新的仓库并将代码推送上去。

git init
git add .
git commit -m "Initial commit"
git remote add origin <your-repo-url>
git push -u origin master
3.2 配置 GitHub Actions

在项目根目录下创建 .github/workflows 目录,并在该目录下创建一个 ci-cd.yml 文件:

name: CI/CD Pipelineon:push:branches:- masterpull_request:branches:- masterjobs:build:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkout@v2- name: Set up Dockeruses: docker/setup-buildx-action@v2- name: Build Docker imagerun: |docker build -t my-node-app .- name: Run Docker containerrun: |docker run -d -p 3000:3000 my-node-app- name: Test applicationrun: |curl http://localhost:3000
3.3 自动化流程说明
  • actions/checkout@v2:用于检查代码库。
  • docker/setup-buildx-action@v2:配置 Docker 构建工具。
  • docker build:构建 Docker 镜像。
  • docker run:启动 Docker 容器并映射端口。
  • curl http://localhost:3000:通过 curl 测试应用是否正常运行。
3.4 提交并推送

将 GitHub Actions 配置文件提交并推送:

git add .github/workflows/ci-cd.yml
git commit -m "Add CI/CD pipeline"
git push origin master

每次推送到 master 分支时,GitHub Actions 会自动触发该工作流,构建并部署应用。


4. 上线前的最后检查:确保项目可以无缝部署

在上线之前,确保进行以下操作:

  • 本地测试:确保 Docker 容器能够正确运行,并且 API 可访问。
  • 测试 CI/CD 流程:手动推送代码到 GitHub,查看自动化流程是否正常执行。
  • 检查日志:确保所有的日志都记录了详细的错误信息和运行状态,方便日后调试。

5. 常见问题与排查技巧
5.1 Docker 容器启动失败
  • 错误信息Error: Cannot find module 'express'
  • 解决方案:确保在 Dockerfile 中安装了依赖,并且正确复制了项目文件。
5.2 GitHub Actions 构建失败
  • 错误信息docker: buildx is not installed
  • 解决方案:检查 GitHub Actions 配置文件中的 Docker 设置是否正确,确保使用了正确的构建工具。
5.3 端口冲突
  • 错误信息Error: bind: address already in use
  • 解决方案:检查主机上的端口是否被其他应用占用,可以尝试更改容器暴露的端口。

总结

从零到上线,Node.js 项目的部署过程涉及多个步骤,包括项目初始化、Docker 容器化和 CI/CD 配置。使用 Docker,可以确保你的应用在任何环境下都能一致地运行;而配置 CI/CD,可以让你在代码更改时自动化地完成构建、测试和部署。掌握这些部署技巧,能够显著提高开发效率和系统稳定性。

希望这篇指南能够帮助你理解从零到上线的整个流程,成功部署你自己的 Node.js 项目!


http://www.ppmy.cn/server/160941.html

相关文章

【漫话机器学习系列】054.极值(Extrema)

极值&#xff08;Extrema&#xff09; 定义 极值是数学分析和优化问题中的一个核心概念&#xff0c;指函数在某个定义域内取得的最大值或最小值。根据极值的性质&#xff0c;可以将其分为两类&#xff1a; 局部极值&#xff08;Local Extrema&#xff09;&#xff1a;函数在…

西安交通大学COMP551605人工智能2024.1.3期末考试

西安交通大学COMP551605人工智能2024.1.3期末考试 有关的课程资料我的笔记放Github上了&#xff0c;欢迎来star 名词解释&#xff0c;5分一个&#xff0c;20分 知识阈值理论 限制策略 最一般合一 过拟合 简答题&#xff0c;8分一个&#xff0c;24分 归结演绎的含义和一…

Nginx正向代理配置

Nginx 正向代理默认只支持 http 协议&#xff0c;不支持 https 协议&#xff0c;需借助 "ngx_http_proxy_connect_module" 模块实现 https 正向代理&#xff0c;详情请参考&#xff1a; https://github.com/chobits/ngx_http_proxy_connect_module 安装Nginx某些模块…

机器学习(4):决策树

1 介绍 决策树&#xff08;Decision Tree&#xff09;&#xff0c;它是一种以树形数据结构来展示决策规则和分类结果的模型&#xff0c;作为一种归纳学习算法&#xff0c;其重点是将看似无序、杂乱的已知数据&#xff0c;通过某种技术手段将它们转化成可以预测未知数据的树状模…

前端面试题-问答篇-5万字!

1. 请描述CSS中的层叠&#xff08;Cascade&#xff09;和继承&#xff08;Inheritance&#xff09;规则&#xff0c;以及它们在实际开发中的应用。 在CSS中&#xff0c;层叠&#xff08;Cascade&#xff09;和继承&#xff08;Inheritance&#xff09;是两个关键的规则&#x…

从C语言看数据结构和算法:复杂度决定性能

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一 时间复杂度1. 常数时间复杂度…

快手极速版如何查找ip归属地?怎么关掉

在数字化时代&#xff0c;个人隐私的保护成为了广大用户关注的焦点。快手极速版作为一款备受欢迎的短视频应用&#xff0c;其IP归属地的显示与关闭功能自然也成了用户热议的话题。本文将详细介绍如何在快手极速版中查找IP归属地以及如何关闭IP属地显示&#xff0c;帮助用户更好…

Swift 中 Codable 和 Hashable 的理解

最近初学Swift&#xff0c;碰到下面的代码脑袋里冒出疑问&#xff1a;Codable 和 Hashable是啥&#xff1f;怎么理解&#xff1f; struct Landmark: Hashable, Codable {var id: Intvar name: Stringvar park: Stringvar state: Stringvar description: String }针对上面的疑问…