首页 > 编程语言 >Docker入门(三):nodejs后端服务部署

Docker入门(三):nodejs后端服务部署

时间:2024-07-10 23:52:48浏览次数:14  
标签:入门 nodejs koa app json api router Docker my

本文主要内容是通过dockerfile创建镜像,并通过kubernets(简称k8s)来启动集群服务。最后你会得到一个简单的nodejs提供的api服务。

写在前面

需要安装的有node(如何安装?),kubectl(如何安装?)

一,创建nodejs应用

本文主要是用于实践k8s,所以nodejs项目写的非常简单,除了package*.json之外只有简单的app.js文件
image
1,首先创建一个app.js文件。代码如下,作用是用nodejs生成两个api,一个get一个post,并监听3000端口提供服务。

点击查看代码
const Koa = require('koa');
const app = new Koa();
const Router = require('koa-router');
const router = new Router();

// GET /api/users
router.get('/api/users', async (ctx) => {
  ctx.body = [{ name: 'Alice' }, { name: 'Bob' }];
});

// POST /api/users
router.post('/api/users', async (ctx) => {
  const user = ctx.request.body;
  // 处理用户数据...
  ctx.status = 201;
  ctx.body = { message: 'User created', user };
});

// 使用路由中间件
app.use(router.routes());
app.use(router.allowedMethods());

app.listen(3000);

如果是在本地,你可以使用node app.js轻松启动,但可能报错,提示koa和koa-router未安装,这个时候你需要npm install koanpm install koa-router,然后你就有了package.jsonpackage-lock.json两个文件了。重新执行node后,在浏览器访问localhost:300/api/users即可访问得到数据返回。

以下为package.json代码供参考:

点击查看代码
{
  "name": "my-koa-api",
  "version": "1.0.0",
  "description": "A simple Koa API",
  "private": true,
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "koa": "^2.15.3",
    "koa-router": "^12.0.1"
  }
}

二,创建dockerfile

拥有了建议的nodejs项目之后,我们来创建dockerfile。
首先,在你的项目根目录下创建名为Dockerfile的文件,并复制以下代码(代码中有注释)

点击查看代码
# 1. 选择 Node.js 官方镜像作为基础镜像
FROM node:20.15.0

# 2. 设置工作目录为 /app
WORKDIR /app

# 3. 将 package.json 和 package-lock.json 复制到工作目录
COPY package*.json ./

# 4. 安装项目依赖
RUN npm install

# 5. 将当前目录下的所有文件复制到工作目录
COPY . .

# 6. 暴露 API 服务运行的端口,默认 Koa 监听 3000 端口
EXPOSE 3000

# 7. 定义环境变量(如果有需要)
# ENV NODE_ENV production

# 8. 定义启动命令,启动 Koa 应用
CMD ["npm", "start"]

它的配置思路为:首先安装node的20.15.0版本为基础镜像,然后设置工作目录为app(等容器启动之后进入可查看当前目录),复制package*.json就是两个json文件,随后npm install安装,接着复制当前目录下的所有文件到工作目录,随后暴露3000端口,最后启动node。

镜像构建
docker build -t my-koa-api .创建一个名为my-koa-api的镜像

镜像打标
docker tag my-koa-api xyb1205/my-koa-api:latest
其中my-koa-api是本地镜像的名称,xyb1205是docker hub上的用户名,my-koa-api:latest是新创建的标签

镜像推送
docker push xyb1205/my-koa-api:latest

至此,hub上就有名为xyb120/my-koa-api的镜像了
image

三,配置k8s,创建集群

1,创建my-app-deployment.yaml配置文件

点击查看代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: xyb1205/my-koa-api:latest
        ports:
        - containerPort: 3000

2,创建my-app-service.yaml文件

service有好几种类型,最常见的有ClusterIP,Nodeport,LoadBalancer,service默认类型为ClusterIP,ClusterIP和Nodeport一般都是提供集群内部使用的,LoadBalancer可以供集群外部使用。

点击查看代码
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  type: LoadBalancer  # 设置 Service 类型为 LoadBalancer
  selector:
    app: my-app  # 选择器,用于匹配 Pod 的标签
  ports:
  - name: http  # 端口名称
    protocol: TCP  # 协议类型
    port: 80  # Service 端口,集群外部访问使用此端口
    targetPort: 3000  # Pod 的目标端口

使用以下命令配置kubernets
kubectl apply -f my-app-deployment.yaml
kubectl apply -f my-app-service.yaml
注意,如何启动kubernets呢?你需要在你的docker desktop应用中打开设置,并开启kubernets服务
image

四,访问

查看kubectl get services即可看到kubernets的服务
image
通过 http://<EXTERNAL-IP>:<Port>即可访问服务
(由于本nodejs项目的api路径已配置,所以你可以这样访问测试 http://<EXTERNAL-IP>:80/api/users)
image
代表成功访问

五;踩过的坑

1,Nodeport并不能生成EXTRAL_IP,EXTRAL_IP才能被集群外部访问。(EXTRAL_IP的可访问范围,还需要研究)
2,nginx反向代理还需要加进来
3,集群内部访问ip,可以通过节点内命令,或者容器端口映射,来访问。(后续有时间再详细出一个)
4,集群>节点>pod>容器。pod是容器的承载
5,在讨论 Kubernetes 集群、云计算环境或网络安全时,"防火墙策略"、"网络策略"和"网络安全组" 是三个关键概念,它们共同构成了网络环境的安全和访问控制机制
6,kubernets有负载均衡,但是也有局限性。

六,常用命令总结

其实命令都是为需求服务的

  • kubectl get services // 获取所有服务
  • kubectl get pods // 获取所有pods
  • kubectl get nodes //获取所有节点
  • kubectl describe service <service-name> // 查看service-name服务的详细信息

标签:入门,nodejs,koa,app,json,api,router,Docker,my
From: https://www.cnblogs.com/xyblives/p/18293757

相关文章

  • Qt入门(C++)
    创建项目基类的选择对于基类的选择有三个选项,分别是QMainWindow、QWidget、QDialog基类说明QMainWindow主窗⼝类,⼀般⽤于较为复杂的应⽤程序,除了中央客⼾区界⾯,还包括菜单栏、⼯具栏、状态栏以及多个可停靠的⼯具对话框等QWidget最简单、最基本的窗体程序,⾥⾯可以放置多......
  • docker部署若依开源java项目微服务版
    查看容器IDdockerps 后面以进入mysql容器为例进入容器sudodockerexec-it27e/bin/bash 进入成功,由于是mgsql容器,我们可以输入命令操作看一下mysql文件夹,如下看到了我们建的数据库:退出容器回到centosexit......
  • MyBatis Plus - 简介及入门实例
    简介及入门实例前言最开始,要在Java中使用数据库时,需要使用JDBC,创建Connection、ResultSet等,然后我们又对JDBC的操作进行了封装,创建了许多类似于DBUtil等工具类。再慢慢的,出现了一系列持久层的框架:Hibernate、JPA,Mybatis等。各个框架的特点如下:Hibernate:一个全......
  • 零基础STM32单片机编程入门(十二) HC-SR04超声波模块测距实战含源码
    文章目录一.概要二.HC-SR04主要参数1.模块引脚定义2.模块电气参数3.模块通讯时序4.模块原理图三.STM32单片机超声波模块测距实验四.CubeMX工程源代码下载五.小结一.概要HC-SR04超声波模块常用于机器人避障、物体测距、液位检测、公共安防、停车场检测等场所。HC-SR......
  • Dockerfile构建前后端分离项目
    【Dockerfile构建前后端分离项目】1.创建专用网络dockernetworkcreateappnet2.构建MYSOL服务器镜像2.1.准备工作创建专用目录mkdirapp/db-p获取配置文件#创建一个存放数据库配置文件的文件夹cdapp/db#创建临时mysql容器,目的是将里面的配置文件拷贝出来......
  • Linux-shell编程入门基础
    目录前言Shell编程bash特性shell作用域变量环境变量$特殊变量$特殊状态变量$特殊符号(很重要)其他内置shell命令shell语法的子串截取统计指令执行时间练习shell特殊扩展变量父子shell的理解内置和外置命令区别数值计算双括号(())运算letexprexpr模式匹配bcawk中括号shell的条件判......
  • 入门c语言DAY7——转义字符
    入门第七天(昨天就要发出来的,结果退出来的时候系统没给我保存....目前写过的最长的一篇文章了) 由例子引出转义字符,如图: 可以看到将n前加上\后不但没有打印出\n,反而空了一行。像\n这样的字符就叫转义字符。(当然也不是什么字符前加\都可以用作转义字符~先来浅浅看一下转义......
  • 量化交易入门:如何在QMT中配置Python环境,安装第三方依赖包
    哈喽,大家好,我是木头左!引言QMT,作为量化交易系统中的佼佼者,以其强大的功能和灵活的操作性,受到了广大投资者的青睐。但是,对于很多新手来说,如何在QMT中配置Python环境,安装第三方依赖包,却是一个让人头疼的问题。本文将从零开始,手把手教你如何在QMT中配置Python环境,安装第三方依赖包......
  • R语言入门
    #新手上路a<-1:10aAcor(iris[,1:4])Cor(iris[,1:4])#获取帮助?median#等价于help("median"),查看中位数函数的帮助文档??median#等价于help.serach("median")搜索包含median的帮助信息help("runExample")help("runExample",package="shin......
  • 学习AI大模型,入门小白必看!应用开发极简入门PDF来了!
    人工智能大潮已来,不加入就可能被淘汰。就好像现在职场里谁不会用PPT和excel一样,基本上你见不到。而大模型是人工智能代表,潜力与使用方式有关。使用好大模型可提高效率,让人获得更好的待遇和更多机会。你发现PPT和excel用的好的PPT一看就惊艳,excel用的特别熟练,你这个数据分......