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

news/2024/11/16 4:00:35/文章来源:https://www.cnblogs.com/xyblives/p/18293757

本文主要内容是通过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: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-appimage: xyb1205/my-koa-api:latestports:- 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 类型为 LoadBalancerselector: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服务的详细信息

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

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

相关文章

如何不错过手机的重要消息-草稿

你是不是手机里有许多未读消息,许多“小红点”,系统通知里有很多通知,久而久之你已习惯并麻木了?你只在自己需要的时候主动去找,而对于推送的信息一概不理。有时也有朋友向你抱怨发给你的信息你久久不回。或者反过来,你经常去看推送的消息,但大多是不太重要的,是广告,…

pandas agg函数的详细介绍与应用

pandas agg函数的详细介绍与应用 参考:pandas agg Pandas 是一个强大的 Python 数据处理库,提供了广泛的方法来进行数据分析。其中,agg 函数是一个非常有用的工具,它允许用户对数据进行多种聚合操作,可以极大地简化数据处理过程。本文将详细介绍 agg 函数的使用方法,并通…

Ollama完整教程:本地LLM管理、WebUI对话、Python/Java客户端API应用

Ollama可以非常方便的管理和部署我们本地大语言模型,老牛同学希望通过本文对Ollama进行一次详细介绍,包括本地大模型管理和使用、WebUI对话界面部署、通过Python和Java使用Ollama的API接口等……老牛同学在前面有关大模型应用的文章中,多次使用了Ollama来管理和部署本地大模…

Python爬虫(1-4)-基本概念、六个读取方法、下载(源代码、图片、视频 )、user-agent反爬

Python爬虫 一、爬虫相关概念介绍 1.什么是互联网爬虫 如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的数据解释1:通过一个程序,根据URL进行爬取网页,获取有用信息 解释2:使用程序模…

一条SQL查询语句是如何执行的??

我想来跟你聊聊 MySQL 的基础架构。我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于 MySQL 的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单的表,表里只有一个 ID 字段,在…

2024最新404错误页面单页源码 HTML错误页面代码

简介:2024最新404错误页面单页源码 HTML错误页面代码 点击下载

高仿imtoken钱包源码/获取助记词/获取私钥/自动归集

简介:高仿imtoken钱包/获取助记词/获取私钥/自动归集 带双端,无纯源码 下载源码

LLM大模型: 常用的数据清洗方法总结

LLM的三大要素:算力:算力的本质是拼财力,普通人是无力改变的; 算法/模型结构:目前最流行的还是transformer架构, 各种LLM都是基于transformer改细节,暂时没有用新的框架替代transformer。至于后续manba会不会替代transformer架构,有待观察! 数据:这块是做LLM pre-tra…

docker部署若依开源java项目微服务版

查看容器IDdocker ps 后面以进入mysql容器为例 进入容器sudo docker exec -it 27e /bin/bash 进入成功,由于是mgsql容器,我们可以输入命令操作看一下mysql文件夹,如下看到了我们建的数据库:退出容器回到centosexit

【考研数学】大家喜欢这种用不同颜色标记解题思路的方式嘛?

今天要给大家分享的笔记是:《如何确定行列式展开式中有效项的个数?》,大家喜欢类似下面这样在文章中用不同的文字颜色和背景颜色对计算推导过程中需要注意的不同部分做高亮显示嘛?可以在下方留言哦 >_< 原文:如何确定行列式展开式中有效项的个数? - 荒原之梦 (zhao…

大气热力学(12)——强对流指数之一(能量参数)

从本篇文章开始,都不是我原有手写笔记上的内容,都是全新添加的内容。本篇文章介绍了根据预报员多年经验总结的各种强对流预报指数,希望这部分内容能对你有所帮助。 @目录12.1 对流有效势能(CAPE)12.1.1 CAPE的概念与相关公式12.1.2 CAPE与上升气块的起始高度的关系12.1.3 …

苍穹外卖 - day1

1.项目介绍 业务功能技术选型环境搭建前端 前端部分非重点,直接由平台提供,部署在nginx服务器上。nginx概念反向代理与负载均衡动态监听80端口,将请求转发到目标服务器,若有多个目标服务器,则采取负载均衡策略进行请求的分发(如轮询)接口文档 1. YApi 通过上传json文件或…