当前位置: 首页 > 后端技术 > Node.js

使用docker部署节点集群

时间:2023-04-03 22:56:29 Node.js

本文将通过三个简单的demo演示如何通过docker部署节点集群。如果你想学习docker,官方文档是一个很好的入门指南,或者你可以阅读这本gitbook。1.部署节点容器首先准备一个节点服务demo,代码如下:constKoa=require('koa');constapp=newKoa();app.use(asyncctx=>{ctx.body='HelloWorld';});app.listen(8080);部署节点服务制作自己的节点服务镜像,最简单的方法是在现有节点镜像的基础上,在此基础上,添加自己的内容,可以通过DockerfileMirror来描述自己的节点,内容如下:FROMnode:8.9.1#复制当前代码到指定目录ADD./home/appWORKDIR/home/appRUNnpminstallEXPOSE8080CMD["npm","run","dev"]有了镜像文件后,就可以通过dockerbuild构建镜像:dockerbuild-tnode-demo。#-t表示定义镜像名称,查看当前构建的镜像:dockerimages通过镜像运行容器:dockerrun-d-p8080:8080node-demo#-d表示后台运行,查看正在运行的容器信息:dockerps查看容器运行日志:dockerlogsxxx#xxx暂停容器容器ID:dockercontainerstopxxx由于镜像底层是linux镜像,可以连接容器bash:dockerexec-i-txxxbash2.部署node和redis服务根据第一步的代码,我们用node连接一个redis,模拟一个访客统计功能。修改后的节点代码如下:constkoa=require('koa');constbluebird=require("bluebird");constredis=require("redis");bluebird.promisifyAll(redis.RedisClient.prototype);bluebird.promisifyAll(redis.Multi.prototype);constapp=newKoa();//注意这里的host指定为redis,也就是dockercompose提供的函数lethost='redis';letport='6379';letclient=redis.createClient({host,port});app.use(asyncctx=>{if(ctx.path=='/incr'){letnum=awaitclient.getAsync('num');num++;client.set('num',num,redis.print);returnctx.body=`numis${num}`;}ctx.body='你好世界';});app.listen(8080);node服务需要连接redis服务。Docker提供了compose工具来简化容器之间的通信。使用compose功能需要定义描述文件docker-compose.yml:version:'3'services:web:build:。ports:-"8080:8080"redis:image:"redis:alpine"这里描述了两个容器web和redis,分别对应node和redis然后通过docker-compose启动容器。如果默认没有构建镜像,会先构建或者拉取镜像:docket-composeup-d检查容器运行状态:docker-composeps挂起容器:docker-composestop3.最后部署节点集群示例就是启动多个节点容器组成一个集群,然后访问同一个redis:使用docker提供的实例扩展,其实很容易做到,只需要修改docker-compose.yml如下:version:'3'services:web:image:node-demodeploy:replicas:5resources:limits:cpus:"0.1"memory:50Mports:-"8080:8080"redis:image:"redis:alpine"的唯一不同的是增加了deploy语句,指定节点实例数和资源情况。对于真正的集群部署,docker提供了swarm功能。swarm功能非常强大,可以管理跨机部署。这里只使用最简单的实例展开。先创建集群:dockerswarminit然后部署集群dockerstackdeploy-cdocker-compose.ymlnode-swarm查看集群运行情况dockerservicels然后查看容器运行情况dockercontainerlscan看到目前有6个容器在运行,1个redis容器,5个node容器。