Node.js 语言特定指南

Node.js 语言特定指南

本 Node.js 语言特定指南将教您如何使用 Docker 容器化 Node.js 应用程序。在本指南中,您将学习如何:

  • 容器化并运行一个 Node.js 应用程序
  • 设置一个本地环境以使用容器开发 Node.js 应用程序
  • 使用容器为 Node.js 应用程序运行测试
  • 使用 GitHub Actions 配置一个用于容器化 Node.js 应用程序的 CI/CD 流水线
  • 将容器化的 Node.js 应用程序部署到本地 Kubernetes 以测试和调试您的部署

首先,从容器化一个现有的 Node.js 应用程序开始。

容器化并运行 Node.js 应用程序

1. 准备现有的 Node.js 应用程序

确保您的项目结构类似于以下内容:

my-node-app/
├── node_modules/
├── public/
├── src/
├── views/
├── .gitignore
├── package.json
└── server.js

2. 创建 Dockerfile

在项目根目录下创建一个名为 Dockerfile 的文件,并添加以下内容:

# 使用官方 Node.js 镜像作为基础镜像
FROM node:14# 设置工作目录
WORKDIR /usr/src/app# 复制 package.json 和 package-lock.json
COPY package*.json ./# 安装依赖
RUN npm install# 复制应用源代码
COPY . .# 暴露应用端口
EXPOSE 3000# 定义运行容器时的启动命令
CMD ["node", "server.js"]

3. 构建 Docker 镜像

在项目根目录下运行以下命令以构建 Docker 镜像:

docker build -t my-node-app .

4. 运行容器

使用以下命令运行容器:

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

现在,您可以通过浏览器访问 http://localhost:3000 来查看您的应用程序。

设置本地开发环境

使用 Docker 容器来设置本地开发环境有助于确保开发环境与生产环境一致。

1. 创建 docker-compose.yml 文件

在项目根目录下创建一个名为 docker-compose.yml 的文件,并添加以下内容:

version: '3.8'
services:app:image: node:14working_dir: /usr/src/appvolumes:- .:/usr/src/app- /usr/src/app/node_modulesports:- "3000:3000"command: npm start

2. 运行 Docker Compose

在项目根目录下运行以下命令启动开发环境:

docker-compose up

现在,您的应用程序将在 http://localhost:3000 上运行,您可以进行开发并实时查看更改。

使用容器运行测试

1. 安装测试依赖

确保在 package.json 中添加必要的测试依赖,例如:

"devDependencies": {"mocha": "^8.3.2","chai": "^4.3.4"
}

2. 创建测试脚本

在项目中创建一个测试目录和测试脚本,例如 test/test.js

const { expect } = require('chai');describe('Sample Test', () => {it('should return true', () => {expect(true).to.be.true;});
});

3. 更新 Dockerfile

更新 Dockerfile 以安装开发依赖:

# 使用官方 Node.js 镜像作为基础镜像
FROM node:14# 设置工作目录
WORKDIR /usr/src/app# 复制 package.json 和 package-lock.json
COPY package*.json ./# 安装依赖,包括开发依赖
RUN npm install# 复制应用源代码
COPY . .# 暴露应用端口
EXPOSE 3000# 定义运行容器时的启动命令
CMD ["npm", "test"]

4. 构建测试镜像并运行测试

在项目根目录下运行以下命令构建测试镜像并运行测试:

docker build -t my-node-app-test .
docker run my-node-app-test

配置 CI/CD 流水线

使用 GitHub Actions 配置 CI/CD 流水线以自动化测试和部署过程。

1. 创建 GitHub Actions 工作流文件

在项目根目录下创建 .github/workflows/ci.yml 并添加以下内容:

name: CI/CD Pipelineon:push:branches:- mainpull_request:branches:- mainjobs:build:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkout@v2- name: Set up Node.jsuses: actions/setup-node@v2with:node-version: '14'- name: Install dependenciesrun: npm install- name: Run testsrun: npm test- name: Build Docker imagerun: docker build -t my-node-app .- name: Push Docker imageenv:DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}run: |echo $DOCKER_PASSWORD | docker login -u $DOCKER_USERNAME --password-stdindocker tag my-node-app $DOCKER_USERNAME/my-node-app:latestdocker push $DOCKER_USERNAME/my-node-app:latest

确保在 GitHub 仓库中添加 Docker Hub 凭据作为秘密(secrets)。

部署到 Kubernetes

使用 Kubernetes 部署和管理容器化的 Node.js 应用程序。

1. 创建 Kubernetes 部署文件

在项目根目录下创建 k8s/deployment.yml 并添加以下内容:

apiVersion: apps/v1
kind: Deployment
metadata:name: my-node-app
spec:replicas: 3selector:matchLabels:app: my-node-apptemplate:metadata:labels:app: my-node-appspec:containers:- name: my-node-appimage: <DOCKER_USERNAME>/my-node-app:latestports:- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:name: my-node-app-service
spec:type: NodePortselector:app: my-node-appports:- port: 3000targetPort: 3000nodePort: 30001

2. 部署到 Kubernetes

使用 kubectl 命令将应用程序部署到 Kubernetes 集群:

kubectl apply -f k8s/deployment.yml

您可以通过访问 http://<NODE_IP>:30001 查看应用程序。

通过上述步骤,您已经学会了如何容器化并运行一个 Node.js 应用程序,设置本地开发环境,使用容器运行测试,配置 CI/CD 流水线,并将应用程序部署到 Kubernetes。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/35247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于weixin小程序的民宿短租系统的设计与实现

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;房主管理&#xff0c;房间类型管理&#xff0c;用户管理&#xff0c;民宿信息管理&#xff0c;民宿预订管理&#xff0c;系统管理 小程序功能包括&#xff1a;系统首页&#xff0c;民宿信息&#xff0c…

博客solo!bolo-solo让博客创作更自由。

bolo-solo&#xff1a;独行侠的数字笔录&#xff0c; 你的博客新伙伴- 精选真开源&#xff0c;释放新价值。 概览 bolo-solo是GitHub 上一个开源的个人博客系统&#xff1a;Bolo Solo&#xff0c;简单易部署&#xff0c;自带精致主题、数据统计表、邮件提醒、自定义图床、功能…

Python实战:从零开始打造BS自动化运维平台

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程:Python自动化运维项目开发实战_从零开始打造BS自动化运维平台_编程案例实例课程教程.pdf 随着信息技术的快速发展,企业对于运维效率和安全性的要求越…

Jboss多个远程命令执行漏洞(CVE-2017-12149、CVE-2015-7501、CVE-2017-7504)

目录 Jboss介绍 CVE-2017-12149 漏洞产生的原因 环境搭建 漏洞检测和利用 反弹shell CVE-2015-7501 漏洞产生的原因 环境搭建 漏洞检测和利用 反弹shell CVE-2017-7504 漏洞产生的原因 环境搭建 漏洞检测和利用 反弹shell 这一篇是参考大佬的好文章进行Jboos的…

【AIGC】如何从0开始快速打造个人知识库

如何从0开始快速打造个人知识库 文章目录 如何从0开始快速打造个人知识库前言1、注册登录2、创建知识库2.1 创建2.2 文件上传 3、使用知识库 前言 最近我在使用一些AIGC的产品时发现一个问题&#xff0c;我没有办法让它能够结合我现有的数据内容回答我的问题&#xff0c;并且让…

django学习入门系列之第三点《案例 小米商城二级菜单》

文章目录 样例划分区域搭建骨架logo区域完整代码 小结往期回顾 样例 划分区域 搭建骨架 <!-- 二级菜单部分 --> <div class"sub-header"><div class"container"><div class"logo">1</div><div class"sea…

JFrame和JScrollPanel布局初步使用

还不是很了解&#xff0c;做了几个程序&#xff1b; import java.awt.Container; import java.awt.Color; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.border.EmptyBorder;public class pa1 {public static void main(String[] agrs){JF…

24/06/25(4.1122)数据存储,自定义类型

重点:1.数据类型详细介绍 2.整型在内存中的存储:原码 反码 补码 3.大小端字节序介绍和判断 4.浮点型在内存中的存储解析 前面都有char short int...详细介绍,翻一翻.需要注意的是,C语言没有字符串类型哦. 计算机永远存储的都是补码,计算也是用补码进行的,只有在要输出的时候转…

Vite: 新一代高效的前端构建工具

概述 随着前端技术的飞速发展&#xff0c;构建工具在项目开发中扮演着至关重要的角色因为项目日益复杂&#xff0c;开发体验和构建效率成为了开发者关注的焦点在众多前端构建工具中&#xff0c;Vite凭借其独特的优势&#xff0c;逐渐成为开发者们的新宠Vite&#xff0c;作为一…

什么是 Java 中的 Optional 类,它如何帮助避免空指针异常?

想象一下&#xff0c;你正在厨房里烹饪一道美味的菜肴&#xff0c;需要从冰箱里取出牛奶来使用。但是&#xff0c;当你打开冰箱门时&#xff0c;发现牛奶已经喝完了&#xff0c;没有牛奶可用。这时&#xff0c;如果你直接假设牛奶一定在那里&#xff0c;并且不加检查就去倒牛奶…

github无法访问,下载慢的解决方法

GitHub是一个存储分享无数的开源项目和代码的宝库网站。然而&#xff0c;由于一些原因&#xff0c;国内用户在访问GitHub时常常遭遇无法访问或下载速度缓慢的问题。这不仅影响了开发者的工作效率&#xff0c;也使一些想要访问下载github文件的普通用户遇到困难。下面小编就来和…

如何简单的生成SSL证书

下面是简单的SSL证书生成的方法&#xff1a; 第1步&#xff1a;生成私钥 我们一般运用openSSL这个工具来生成一个RSA私钥 说明&#xff1a;生成rsa私钥&#xff0c;des3算法&#xff0c;2048位强度&#xff0c;server.key是秘钥文件名。 注意&#xff1a;一般生成私钥&…

Java stream操作流常用的方式

在Java中&#xff0c;Stream操作流是Java 8新引入的一个功能&#xff0c;它提供了很多强大的操作&#xff0c;方便我们进行集合的处理和操作。常用的Stream操作方式有&#xff1a; 1.过滤&#xff1a;使用filter()方法可以过滤掉集合中不符合条件的元素。 2.映射&#xff1a;…

python学习笔记四

1.自己平方本身 x2 x**4#xx**4 print(x) 2.把一个多位数拆分成单个数&#xff0c;方法一通过字符串下标获取对应元素&#xff0c;并对获取的元素使用eval函数把左右引号去掉&#xff0c;是字符串变为整型&#xff1b;方法二&#xff0c;通过对数进行取余和整除得到各个位的数 …

Django ORM 详解

Django ORM(Object-Relational Mapping,对象关系映射)是 Django 框架的一部分,它允许我们通过 Python 代码来操作数据库,而无需编写 SQL 语句。在这篇文章中,我们将详细介绍 Django ORM 的使用方法。 定义模型 在 Django 中,数据库的每个表都对应一个 Python 类,这个…

市面上很轻的 100kW 负载组

FX100S-C 负载组 EAK的 FX100S-C 负载组在轻质外壳中以 415Vac 50Hz 提供 100kW 的连续负载。数字仪表允许您测量功率、电压、电流和频率&#xff0c;同时还允许您在进行测试时记录数据。 EAK是市场上最轻的 100kW 负载组之一&#xff0c;它将使您能够访问其他负载组无法到达…

GPT版本通俗简单介绍

# GPT系列&#xff1a;人工智能语言模型的进化之旅 在人工智能的广阔天地里&#xff0c;自然语言处理技术一直是探索的前沿地带&#xff0c;而OpenAI推出的GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列模型&#xff0c;无疑是这一领域内的一颗璀璨明星…

ISCC2024--pwn

ISCC2024 练武题 chaos 考点&#xff1a;基础UAF 分析 1.首先将附件放入IDA查看主函数功能&#xff0c;进入菜单函数&#xff1a; 注意到选项5不太一样&#xff0c;跟进该功能模块的函数查看&#xff1a; 分析得到该功能存在UAF漏洞&#xff0c;system(/bin/sh) 执行的前…

沙姆镜头标定与重建

沙姆定律&#xff08; Scheimpflug principle&#xff09;则可以保证测量平面的物体能够清晰成像&#xff0c; 因此能够起到调整景深区域位置的作用。Scheimpflug 镜头就是根据沙姆定律所设计的一种特殊的镜头&#xff0c;通过机械结构使镜头与相机本体发生一定程度的偏转&…

一文介绍 Tapable 的特性和使用,助力理解 webpack 插件架构!

一、引言 众所周知&#xff0c;webpack 的 plugins 非常灵活&#xff0c;可以在编译的不同阶段注册事件回调&#xff0c;这个功能便是基于 Tapable 实现的。 Tapable 的使用步骤如下&#xff1a; 创建钩子实例&#xff0c;如 SyncHook、SyncLoopHook 钩子;调用订阅接口注册事…