资讯专栏INFORMATION COLUMN

使用docker部署node集群

sunny5541 / 2783人阅读

摘要:本文会通过三个简单的,演示如何通过部署集群。首先创建集群然后部署集群查看集群运行情况然后查看容器运行情况可以看到当前有个容器在运行,一个容器,五个容器。

本文会通过三个简单的demo,演示如何通过docker部署node集群。

如果想学习docker,官方文档是一个不错的入门指引,或者可以看这个gitbook。

一、部署node容器

首先准备一个node服务demo,代码如下:

const Koa = require("koa");
const app = new Koa();

app.use(async ctx => {
    ctx.body = "Hello World";
});

app.listen(8080);

部署node服务

制作自己的node服务镜像,最简单的方式就是基于已有的node镜像,在此基础上,添加自己的内容,可以通过Dockerfile描述自己的node镜像,内容如下:

FROM node:8.9.1

# 复制当前代码到指定目录下
ADD . /home/app
WORKDIR /home/app
RUN npm install

EXPOSE 8080
CMD ["npm", "run", "dev"]

有了镜像文件之后,可以通过docker build构建镜像:

docker build -t node-demo .  
# -t 表示定义镜像名

查看当前构建的镜像:

docker images

通过镜像运行容器:

docker run -d -p 8080:8080 node-demo 
# -d 表示后台运行

查看运行中容器信息:

docker ps

查看容器运行日志:

docker logs xxx
# xxx 为容器id

暂停容器:

docker container stop xxx

因为镜像底层是一个linux镜像,所以可以连接上容器bash:

docker exec -i -t xxx bash

二、部署node、redis服务

在第一步代码的基础上,我们使用node连接一个redis,模拟一个访客计数的功能,修改后的node代码如下:

const Koa = require("koa");
const bluebird = require("bluebird");
const redis = require("redis");
bluebird.promisifyAll(redis.RedisClient.prototype);
bluebird.promisifyAll(redis.Multi.prototype);
const app = new Koa();

// 注意这里的host被指定为 redis,这是docker compose提供的功能
let host = "redis";
let port = "6379";

let client = redis.createClient({
    host,
    port
});

app.use(async ctx => {
    if (ctx.path == "/incr") {
        let num = await client.getAsync("num");
        num++;
        client.set("num", num, redis.print);
        return ctx.body = `num is ${num}`;
    }
    ctx.body = "Hello World";
});

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启动容器,默认如果没有构建镜像,会先构建或者pull镜像:

docket-compose up -d

查看容器运行情况:

docker-compose ps

暂停容器:

docker-compose stop

三、部署node集群

最后例子是启动多个node容器,构成集群,然后访问同一个redis:

利用docker提供的实例扩展,其实很容易做到,只要修改docker-compose.yml如下:

version: "3"
services:
  web:
    image: node-demo
    deploy:
      replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    ports:
     - "8080:8080"
  redis:
    image: "redis:alpine"

唯一的区别就是添加了deploy声明,指定是node实例数量和资源情况。

对于真正的集群部署,docker提供了swarm功能,swarm功能很强大,可以管理跨机器部署,这里就只用到最简单的实例扩展。

首先创建集群:

docker swarm init

然后部署集群

docker stack deploy -c docker-compose.yml node-swarm

查看集群运行情况

docker service ls

然后查看容器运行情况

docker container ls

可以看到当前有6个容器在运行,一个redis容器,五个node容器。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27171.html

相关文章

  • 使用 Docker 快速部署 Elasticsearch 集群

    摘要:本文将使用容器使用编排快速部署集群,可用于开发环境单机多实例或生产环境部署。在集群每一个节点上执行安装使用安装重启服务验证分词默认使用分词器只能处理英文,中文会被拆分成一个个的汉字,没有语义。 本文将使用Docker容器(使用docker-compose编排)快速部署Elasticsearch 集群,可用于开发环境(单机多实例)或生产环境部署。 注意,6.x版本已经不能通过 -Epat...

    tracymac7 评论0 收藏0
  • 进军Docker 1.12,将代理与Swarm完美整合

    摘要:其一将用于代理与面向公开的服务之间的通信。数据库上线并开始运行后,我们接下来部署后端。现在,会帮助我们完成全部负载均衡工作。这样所有来自代理的请求都将指向网络,并由后者跨越全部实例执行负载均衡。 七夕大家过得怎么样?今天数人云带大家回归技术和干货。虽然我们能够在Swarm集群当中部署任意数量的服务,但这并不代表各项服务全部可为用户所访问。而新的Swarm网络使得各项服务之间能够更为轻松...

    cartoon 评论0 收藏0
  • 基于Docker部署生产环境Ethereum私链集群

    摘要:本项目旨在建立基于部署的生产环境使用的私链集群,在尽可能简化使用的前提下保留足够的灵活性,方便业务快速组建区块链私有网络集群,并基于此开发私有区块链平台应用。因是高性能轻量级的程序,一般启动一个角色的容器即可。启动时须指定等命令参数。 项目地址:https://github.com/tabalt/doc...,欢迎Star和参与完善。 本项目旨在建立基于Docker部署的生产环境使用的...

    1treeS 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<