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

本文主要内容是通过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服务的详细信息
posted @   冰冰biu  阅读(437)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示